Auch n Kameraproblem, aber nicht so einfach ;)

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

MCWulf

Betreff: Auch n Kameraproblem, aber nicht so einfach ;)

BeitragSo, Apr 10, 2005 10:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Zur Zeit bewege ich meine Kamera so, wie es hier schonmal im Forum stand:
BlitzBasic: [AUSKLAPPEN]

If KeyDown(32) Then MoveEntity Kamera, 1,0, 0
If KeyDown(30) Then MoveEntity Kamera,-1,0, 0
If KeyDown(31) Then MoveEntity Kamera, 0,0,-1
If KeyDown(17) Then MoveEntity Kamera, 0,0, 1

So, wenn ich jetzt nach unten schaue (umschaun tu ich mich mit der Maus) und dann W (also nach "vorne") drücke, dann fliegt meine Kamera auch da hin, wo ich schaue.
Jetzt will ich den gleichen Code für die Pfeiltasten so schreiben, dass wenn ich nach oben drücke die kamera sich auch parallel zum boden bewegt, also immer den gleichen abstand zum boden hat.
Ich habs so mal ausprobiert, was eigentlich auch funktionieren müsse:
BlitzBasic: [AUSKLAPPEN]

If KeyDown(205) Then MoveEntity Kamera, 2,0, 0
If KeyDown(203) Then MoveEntity Kamera,-2,0, 0
If KeyDown(208) Then
TempYAchse = EntityYaw(Kamera)
TempXAchse = EntityRoll(Kamera)
TempZAchse = EntityPitch(Kamera)
RotateEntity Kamera,TempXAchse,0,TempZAchse
MoveEntity Kamera, 0,0,-2
RotateEntity Kamera,TempXAchse,TempYAchse,TempZAchse
EndIf
If KeyDown(200) Then
TempYAchse = EntityYaw(Kamera)
TempXAchse = EntityRoll(Kamera)
TempZAchse = EntityPitch(Kamera)
RotateEntity Kamera,TempXAchse,0,TempZAchse
MoveEntity Kamera, 0,0,2
RotateEntity Kamera,TempXAchse,TempYAchse,TempZAchse
EndIf


Doch das ruckelt dann wie sau im Spiel.

Kann man ein Entity vielleicht sagen, warte noch schnell mit dem Anzeigen!, oder wie könnte man das lösen?

Hoffe ihr versteht mein Problem und bedanke mich schonmal Very Happy

EDIT: So, weils mir gerade einfällt noch n Kameraproblem mit der Maus.
Die Maus benutze ich zur Zeit wie folgt, um mich umzuschaun:
BlitzBasic: [AUSKLAPPEN]

mxs#=-MouseXSpeed() /3.0
mys#=MouseYSpeed() /3.0
If( mxs# <> 0.0 ) Then
RotateEntity Kamera,EntityPitch(Kamera),EntityYaw(Kamera)+mxs#,EntityRoll(Kamera)
EndIf
If( mys# > 0.0 ) Then
If( EntityPitch(Kamera)+mys#>80 ) Then mys#=80 -EntityPitch(Kamera)
RotateEntity Kamera,EntityPitch(Kamera)+mys#,EntityYaw(Kamera),EntityRoll(Kamera)
ElseIf( mys# < 0 ) Then
If( EntityPitch(Kamera)+mys#<-80 ) Then mys#=-80 -EntityPitch(Kamera)
RotateEntity Kamera,EntityPitch(Kamera)+mys#,EntityYaw(Kamera),EntityRoll(Kamera)
EndIf
MoveMouse 1024/2, 768/2

Funktioniert auch prima, aber nur, wenn die Maus zuvor in der Mitte vom Bildschirm ist.
Denn wenn sie weiter weg ist, und dann im Code in die Mitte plaziert wird, dann "springt" die kamera, weil sie denkt, man hätte die maus ja bis zur Mitte bewegt.
Was könnte man da dagegen machen?
MfG
MCWulf
 

Klaas

BeitragSo, Apr 10, 2005 13:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit einem Pivot ist das einfach gemacht.

Das Problem mit der Mouseposition kannst du umgehen in dem du einmal vor der Hauptschleife kurz die Mousebewegung ausliest, denn es wird immer nur die differenz zwischen den letzten auslesen von Mousespeed zurückgegeben.
Code: [AUSKLAPPEN]


pivot=CreatePivot()
camera=CreateCamera(pivot )
CameraClsColor camera,20,20,20
CameraRange camera,1,4000

MoveMouse graphicswidth() / 2,graphicsheight() / 2
dump = MouseXSpeed()
dump = MouseySpeed()
While Not KeyHit(1)
; ################################## Mouse movement
   Local x_speed#,y_speed#
   
   x_speed=(MouseXSpeed()-x_speed)/2+x_speed
   y_speed=(MouseYSpeed()-y_speed)/2+y_speed
   MoveMouse graphicswidth() / 2,graphicsheight() / 2
   
   TurnEntity pivot,0,-x_speed,0   ;turn player left/right
   TurnEntity camera,y_speed,0,0   ;tilt camera

   If KeyDown(205)
      MoveEntity pivot,1,0,0
   End If
   If KeyDown(203)
      MoveEntity pivot,-1,0,0
   End If
   If KeyDown(200)
      MoveEntity pivot,0,0,1
   End If
   If KeyDown(208)
      MoveEntity pivot,0,0,-1
   End If
   If KeyDown(30)
      MoveEntity pivot,0,1,0
   End If
   If KeyDown(44)
      MoveEntity pivot,0,-1,0
   End If

   
   RenderWorld()
   Flip
Wend

MCWulf

BeitragSo, Apr 10, 2005 13:31
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, also mit nem pivot versuch ichs mal, aber das problem is bei der maus, das der code immer bei gedrücktem rechtsklick ausgeführt wird (sry, dass ich es nicht erwähnt habe ^^')
BlitzBasic: [AUSKLAPPEN]

If MouseDown(2) Then
mxs#=-MouseXSpeed() /3.0
mys#=MouseYSpeed() /3.0
If( mxs# <> 0.0 ) Then RotateEntity Kamera,EntityPitch(Kamera),EntityYaw(Kamera)+mxs#,EntityRoll(Kamera)
If( mys# > 0.0 ) Then
If( EntityPitch(Kamera)+mys#>89 ) Then mys#=89 -EntityPitch(Kamera)
RotateEntity Kamera,EntityPitch(Kamera)+mys#,EntityYaw(Kamera),EntityRoll(Kamera)
ElseIf( mys# < 0 ) Then
If( EntityPitch(Kamera)+mys#<-89 ) Then mys#=-89 -EntityPitch(Kamera)
RotateEntity Kamera,EntityPitch(Kamera)+mys#,EntityYaw(Kamera),EntityRoll(Kamera)
EndIf
MoveMouse 1024/2, 768/2
EndIf

und wenn jetzt die maus nicht am mittelpunkt ist und man drückt rechts, dann denk der eben, dass man die maus bewegt hat, weil sie dann in der if wieder in den mittelpunkt gesetzt wird.
 

Klaas

BeitragSo, Apr 10, 2005 14:14
Antworten mit Zitat
Benutzer-Profile anzeigen
dann mußt du einmal zu anfang wenn die rechte Maustatse gedrückt wurde die Position auslesen.

Ich hab hier das nicht getestet aber so sollte es gehen
Code: [AUSKLAPPEN]

If MouseDown(2) Then
     if not rm_init then
          rm_init = true
          MoveMouse 1024/2, 768/2
          dump = MouseXSpeed()
          dump = MouseySpeed()
     end if
     mxs#=-MouseXSpeed() /3.0
     mys#=MouseYSpeed()  /3.0
     .
     .
     .
else
     rm_init = false
endif

MCWulf

BeitragSo, Apr 10, 2005 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, vielen dank, werd ich gleich einbaun, jetzt hab ich nur noch ein problem!
BlitzBasic: [AUSKLAPPEN]

If KeyDown(32) Then MoveEntity pivot, 1 * TimeLoop / 10 ,0,0
If KeyDown(30) Then MoveEntity pivot, -1 * TimeLoop / 10 ,0,0
If KeyDown(31) Then MoveEntity Kamera, 0,0,-1 * TimeLoop / 10
If KeyDown(17) Then MoveEntity Kamera, 0,0, 1 * TimeLoop / 10

If KeyDown(205) Then MoveEntity pivot, 2 * TimeLoop / 10,0,0
If KeyDown(203) Then MoveEntity pivot,-2 * TimeLoop / 10,0,0
If KeyDown(208) Then MoveEntity pivot, 0,0,-2 * TimeLoop / 10
If KeyDown(200) Then MoveEntity pivot, 0,0,2 * TimeLoop / 10

If MouseDown(2) Then
mxs#=-MouseXSpeed() /3.0
mys#=MouseYSpeed() /3.0
If( mxs# <> 0.0 ) Then TurnEntity pivot,0,mxs#,0
If( mys# > 0.0 ) Then
If( EntityPitch(Kamera)+mys#>89 ) Then mys#=89 -EntityPitch(Kamera)
TurnEntity Kamera,mys#,0,0
ElseIf( mys# < 0 ) Then
If( EntityPitch(Kamera)+mys#<-89 ) Then mys#=-89 -EntityPitch(Kamera)
TurnEntity Kamera,mys#,0,0
EndIf
MoveMouse 1024/2, 768/2

;x_speed=(MouseXSpeed()-x_speed)/2+x_speed
;y_speed=(MouseYSpeed()-y_speed)/2+y_speed
;MoveMouse GraphicsWidth() / 2,GraphicsHeight() / 2
;
;TurnEntity pivot,0,-x_speed,0
;TurnEntity Kamera,y_speed,0,0
EndIf

So sieht jetzt mein Code aus. Jedoch wenn ich mich nun vom Ausgangspunkt wegbewege und mich dann wieder drehen will, dreht sich die Kamera bzw der pivot um den Ausgangspunkt. er soll sich aber um die aktuelle position drehen. Mach ich etwa immer noch was falsch?
 

Klaas

BeitragSo, Apr 10, 2005 15:02
Antworten mit Zitat
Benutzer-Profile anzeigen
du darfst die Kamera nicht bewegen. Die Kamera darf lediglich um die x-Achse gedreht werden, alle anderen Bewegungen / Drehungen solltest du den Pivot machen lassen

Code: [AUSKLAPPEN]

If KeyDown(31)   Then MoveEntity Kamera, 0,0,-1 * TimeLoop / 10
If KeyDown(17)   Then MoveEntity Kamera, 0,0, 1 * TimeLoop / 10


Hiermit bewegst du die Kamera von dem Pivot weg ... und wenn du dann den Pivot drehst fliegt die Kamera um den Pivot herrum

MCWulf

BeitragSo, Apr 10, 2005 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
achso, ok, vielen dank!!

MCWulf

BeitragSo, Apr 10, 2005 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
aber jetzt bewegt sich die kamera nicht mehr dahin, wohin man gerade schaut, sondern sie bleibt auf der gleichen y-ebene... und jetzt? Sad
 

Klaas

BeitragSo, Apr 10, 2005 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

So, wenn ich jetzt nach unten schaue (umschaun tu ich mich mit der Maus) und dann W (also nach "vorne") drücke, dann fliegt meine Kamera auch da hin, wo ich schaue.
Jetzt will ich den gleichen Code für die Pfeiltasten so schreiben, dass wenn ich nach oben drücke die kamera sich auch parallel zum boden bewegt, also immer den gleichen abstand zum boden hat.


äääääääääähhhhh .... sagtest du nicht das du das so haben wolltest !?

MaTrixCruiser

BeitragMo, Apr 11, 2005 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Unentschlossen?!

Willst du die steuerung wie in einem Ego-shooter? wie counter-strike?
Amd 64 3200+ (939 winchester)
nvidea 6600gt (PCI-E)
1024 ddr400
200GB HDD
S

Markus2

BeitragDi, Apr 12, 2005 13:08
Antworten mit Zitat
Benutzer-Profile anzeigen
@MCWulf

Camera drehen um X=hoch/runter gucken (aber nicht zu weit!also Winkel begrenzen)

Pivot drehen um Y=links/rechts drehen
Pivot bewegen Z = vor/zurück
Pivot bewegen X = links/rechts
Pivot bewegen Y = hoch/runter

Also alles mit TurnEntity und MoveEntity,
die Kamera hängt an dem Pivot .

Ich glaube so willst du es haben ...

MCWulf

BeitragDi, Apr 12, 2005 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Also: auf den tasten wasd will ich mich im raum bewegen, wo die kamera gerade hinschaut, also wenn die kamera nach oben schaut, will ich auf W auch noch oben gehen. bei den pfeiltasten will ich nur auf der gleichen y-ebene bleiben. versteht ihr? Confused

Markus2

BeitragMi, Apr 13, 2005 12:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann einfach den Pivot auf die Winkel der Camera setzen,
bewegen (Z) und wieder zurück setzen wie vorher .

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group