Kamera um den Player drehen - mit Mouselook

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Megamag

Betreff: Kamera um den Player drehen - mit Mouselook

BeitragMi, Dez 03, 2008 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!
Ich möchte folgendes. Man soll sich wie in einem Egoshooter mit der
Maus umsehen können. Allerdings soll die Kamera um den Player rotieren,
also immer hinter ihm bleiben. Eigentlich genauso wie hier:
http://www.youtube.com/watch?v...re=related

Ich habe schon folgenden Code:
Code: [AUSKLAPPEN]
Graphics3D 1024, 768, 32, 1
SetBuffer BackBuffer()

Global ms=20
Global cx#
Global cy#

Global player=CreateCube()
PositionEntity player, 0, 0, -10
EntityRadius player,1.8
EntityType player,1

Global cam=CreateCamera()
PositionEntity cam,EntityX(player),EntityY(player)+3,EntityZ(player)

light = CreateLight(2)
PositionEntity light, 0, 20, 0
LightRange light,35

scene = LoadMesh("data\Models\Test.b3d")
PositionEntity scene, 0, -5, 35

;----------------------------------------------------------------------------;

While Not KeyHit(1)

mouse()
PositionEntity cam,EntityX(player),EntityY(player)+3,EntityZ(player)-5

UpdateWorld
RenderWorld
Flip
Wend
End

;----------------------------------------------------------------------------;

Function mouse()
mxs=MouseXSpeed()*ms ;(20)
mys=MouseYSpeed()*ms ;(20)

cx#=EntityPitch(cam)+mys*0.01
cy#=EntityYaw(cam)-mxs*0.01

If cx#>89 Then cx#=89
If cx#<-89 Then cx#=-89

RotateEntity cam,cx,cy,0
RotateEntity player,EntityPitch(player),cy,0
MoveMouse 400,300
End Function


Nur wie schaffe ich das jetzt, dass die Kamera so wie in dem Video
reagiert? Und vorallem dann auch nicht in bzw. hinter den Wänden
verschwindet?

Danke, Blitz4D
 

Krischan

BeitragMi, Dez 03, 2008 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde einen Pivot erstellen, den Player und die Kamera da als Childs dranhängen und die Kamera auf Kollisionen mit der Scene prüfen (Kamera dann mit Positionentity cam,0,1,-5 oder so ein wenig dahintermoven). Du bewegst nur den Pivot - wobei das mit dem Part "Kamera soll nicht hinter Wänden verschwinden" nicht so trivial lösbar ist, da sollte man schon beim Bauen des Levels auf Engstellen achten oder eine sehr intelligente Funktion bauen, die aktiv wird, sobald die Kamera mit der Scene kollidiert.

Xeres

Moderator

BeitragMi, Dez 03, 2008 19:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Kamera befindet sich im Abstand R vom Spieler, also gilt:
Dreamora hat Folgendes geschrieben:
alpha = Rotationswinkel um Y-Achse also Rotation in der Grundebene
beta = Rotationswinkel bezüglich der Grundebene also XZ-Ebene

X = OrigX + Radius * cos( alpha ) * cos( beta )
Y = OrigY + Radius * sin( beta )
Z = OrigZ + Radius * sin( alpha ) * cos( beta )

Siehe dazu hier, unten gibt es dazu noch einen Beispielcode.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Xaymar

ehemals "Cgamer"

BeitragMi, Dez 03, 2008 19:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit der Drehung:
Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

light=CreateLight():PositionEntity light, -500, 500, -500
scene =CreateSphere():ScaleEntity scene,-100,-100,-100
player=CreateCube():ScaleEntity player,1,.1,1
campiv=CreatePivot(player)
cam = CreateCamera(campiv):MoveEntity cam, 0, 0, -5

While Not KeyHit(1)
   NP# = EntityPitch#(campiv)+MouseYSpeed()
   If NP# > 89 NP# = 89
   If NP# < -89 NP# = -89
   RotateEntity campiv,NP#,0,0
   RotateEntity player,0,EntityYaw(player)-MouseXSpeed(),0
   
   RenderWorld
   MoveMouse 400,300
   Flip
Wend

Am code für das andere arbeite ich noch

[Edit]Mist zu langsam
Warbseite

Megamag

BeitragMi, Dez 03, 2008 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
@CGamer:
Das sieht gut aus, aber der Player rotiert um die eigene Achse,
wenn ich links und rechts die Maus benutze. Er soll aber die Richtung
ändern.

@Xeres:
Tut mir echt leid, aber das verstehe ich nicht...

Xaymar

ehemals "Cgamer"

BeitragMi, Dez 03, 2008 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie meinst du das mit der Reichtung ändern?
Warbseite
  • Zuletzt bearbeitet von Xaymar am Mi, Dez 03, 2008 21:02, insgesamt einmal bearbeitet

Megamag

BeitragMi, Dez 03, 2008 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab's hinbekommen^^
Kann man zwar noch verbessern, aber immerhin:
Code: [AUSKLAPPEN]
Graphics3D 1024, 768, 32, 1
AppTitle "School Survival"
SetBuffer BackBuffer()

Global player=CreateCube()
PositionEntity player, 0, 0, -10
EntityRadius player,1.8
EntityType player,1

Global cam=CreateCamera()
PositionEntity cam,EntityX(player),EntityY(player)+3,EntityZ(player)-10

light = CreateLight(2)
PositionEntity light, 0, 20, 0
LightRange light,35

scene = LoadMesh("data\Models\Test.b3d")
PositionEntity scene, 0, -5, 35

;----------------------------------------------------------------------------;

While Not KeyHit(1)

winkel=winkel-MouseXSpeed()/2
winkel2=winkel2-MouseYSpeed()/2
X# = 20 * Cos( winkel ) * Cos( winkel2 )
Y# = 20 * Sin( winkel2 )
Z #= 20 * Sin( winkel ) * Cos( winkel2 )
PositionEntity cam,x,y,z
RotateEntity player,EntityPitch(player),winkel,EntityRoll(player)
PointEntity cam,player
MoveMouse 512,384


UpdateWorld
RenderWorld
Flip
Wend
End

;----------------------------------------------------------------------------;


EDIT: Nochwas, wenn man jetzt mal dreht (macht die Maus mal nach rechts und links) dann dreht sich die Kamera ungleichmäßig. Wieso?

Xaymar

ehemals "Cgamer"

BeitragMi, Dez 03, 2008 20:58
Antworten mit Zitat
Benutzer-Profile anzeigen
ich glaube ich habe jetzt verstanden wie du es meintest:
Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

light=CreateLight()
PositionEntity light, 0, -2, 10
scene =CreateSphere():ScaleEntity scene,-100,-100,-100:EntityAlpha scene,.5
player=CreateCube():ScaleEntity player,1,.1,1:fp=CreateSphere(8,player):MoveEntity fp,0,0,1:ScaleEntity fp,1,10,1
campiv=CreatePivot()
cam = CreateCamera(campiv):MoveEntity cam, 0, 0, -5

While Not KeyHit(1)
   NP# = EntityPitch#(campiv)+MouseYSpeed()
   If NP# > 89 NP# = 89
   If NP# < -89 NP# = -89
   RotateEntity campiv,NP#,EntityYaw(campiv)-MouseXSpeed(),0
   PositionEntity campiv,EntityX(player),EntityY(player),EntityZ(player)
   If KeyDown(17) ;W
      Y1# = EntityYaw(campiv):Y2#=EntityYaw(player)
      rotdist# = Y1#-Y2#
      rotdist# = rotdist#/5
      TurnEntity player, 0, rotdist#, 0
   EndIf
   
   RenderWorld
   MoveMouse 400,300
   Text 0,0,EntityYaw(player)
   Text 0,15,EntityYaw(campiv)
   Text 0,30,rotdist#
   Flip
Wend


mit w aligned sich der player der camera
Warbseite

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group