Kamera: Winkelkontrolle

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

kol16

Betreff: Kamera: Winkelkontrolle

BeitragMi, Nov 18, 2009 1:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Blitz-Community.

Habe im Forum gesucht, aber keine ähnliche Fragestellung gefunden.

Das Programm ist eine Art Railshooter. Die Kamera befindet sich hinter einem Ball und hat mehrere Zustände (links vom Ball / darüber / darunter / etc.), es soll jedoch vermieden werden, dass die Kamera in irgend einer Weise vor den Ball kommt.

Beim Wechsel der Zustände (sehr anfängermäßig programmiert, gebe ich zu, aber ich habe noch nie vergleichbares gemacht) passiert es manchmal, dass die Kamera ausrutscht und total frei herumschwingt bis sie sich wieder gefangen hat. Schlimm ist auch, dass ich beim Reset nicht auf 0 sondern auf zwischen -1 und 1 resetten muss, sonst geht der Winkel ins negative und dann stimmt der ganze mechanismus nicht mehr und die kamera pendelt herum. Dann ist jedoch der Horizont auch im normalzustand Schief Sad

Arrow Hat jemand so etwas schon einmal gemacht und kennt eine bessere Lösung für meine Resetfunktion?

Arrow In wie weit kann man den Pivot um die einzelnen Winkel drehen ohne die anderen zu Beeinflussen? (besonders Roll gerät scheinbar leicht außer Rand und Band. Ich dachte zudem noch an einen "von Links + Pitch" modus, also korkenziehermäßig um die Kugel herum, aber das ging total schief!)

Hier eine heruntergebrochene Demonstration meiner Lösung. Manchmal dauert es ein bisschen, bis sich ein Problem auftut.


Vielen Dank für die Mühe,
kol16

Code: [AUSKLAPPEN]
SeedRnd MilliSecs()
Graphics3D 800, 600, 0, 2
SetBuffer BackBuffer()

Global Thresholdtimer
Global Threshold = 0
Global cammode = 5
Global Camtext$

Global light = CreateLight(1)
LightColor light, 0, 255, 255
Global Ball = CreateSphere(32)
   
Global Pivot = CreatePivot()
   
Global Cam = CreateCamera()
   PositionEntity Cam,0, 0, -20
   EntityParent Cam, Pivot

Global plane = CreatePlane()
   EntityAlpha plane, 0.5
   PositionEntity plane, 0, -2, 0
CreateMirror(plane)
   
   
;______ HAUPTSCHLEIFE
;____________________
While Not KeyHit(1)
Cls
   camctrl()
     
RenderWorld()
   
   Text 10, 10, Camtext$ + "(" + (7-threshold) + ")"
Flip
Wend
End


Function CamCtrl()
   If MilliSecs()-Thresholdtimer > 800 Then
      Threshold = Threshold + 1
      Thresholdtimer = MilliSecs()
   EndIf
   
   If Threshold > 7 Then cammode = Rand(1,6): Threshold = 0
   
   If cammode = 1 Then
      Camtext = "Von Rechts"
      If EntityYaw#(pivot) < 89 Then TurnEntity Pivot, 0, 0.3, 0
      reset(1)
      reset(3)
   ElseIf cammode = 2
      Camtext = "Von Links"
      If EntityYaw#(pivot) > - 89 Then TurnEntity Pivot, 0, -0.3, 0
      reset(1)
      reset(3)
   ElseIf cammode = 3
      Camtext = "Von Oben"
      If EntityPitch#(pivot, 1) < 89 Then TurnEntity Pivot, 0.3 , 0, 0
      reset(2)
      reset(3)   
   ElseIf cammode = 4
      Camtext = "Von Unten"
      If EntityPitch#(pivot) > -89 Then TurnEntity Pivot, -0.3 , 0, 0
      reset(2)
      reset(3)
   ElseIf cammode = 5
      Camtext = "Von Hinten"
      reset(1)
      reset(2)
      reset(3)
   ElseIf cammode = 6
      TurnEntity Pivot, 0 , 0, 0.3
       Camtext = "Von Hinten + Roll"
      reset(1)
      reset(2)
   EndIf
End Function

Function reset(angle)
   If angle = 1 Then
      If EntityPitch#(pivot) < -1 Then
         TurnEntity Pivot, 0.3, 0, 0
      ElseIf EntityPitch#(pivot) > 1 Then
         TurnEntity Pivot, -0.3, 0, 0
      EndIf
   EndIf

   If angle = 2 Then
      If EntityYaw#(pivot) < -1 Then
         TurnEntity Pivot, 0, 0.3, 0
      ElseIf EntityYaw#(pivot) > 1 Then
         TurnEntity Pivot, 0, -0.3, 0
      EndIf
   EndIf
   
   If angle = 3 Then
      If EntityRoll#(pivot) < 1 Then
         TurnEntity Pivot, 0, 0, 0.3
      ElseIf EntityRoll#(pivot) > 1 Then
         TurnEntity Pivot, 0, 0, -0.3
      EndIf
   EndIf
End Function

Midimaster

BeitragMi, Nov 18, 2009 10:19
Antworten mit Zitat
Benutzer-Profile anzeigen
ich bin mir nicht ganz sicher, ob ich verstanden habe, was Du erreichen willst. Deshalb plaudere ich jetzt einfach mal drauf los:

Soll Deine RESET-Routine, die Werte wieder auf 0 fahren? Das erreichst Du so nicht, besser wäre die Schrittweite und die Grenzwerte gleich zu setzen, oder?

Code: [AUSKLAPPEN]
If EntityPitch#(pivot) < -0.3 Then
     TurnEntity Pivot, 0.3, 0, 0
ElseIf EntityPitch#(pivot) > 0.3 Then
     TurnEntity Pivot, -0.3, 0, 0
Else
     TurnEntity Pivot, -EntityPitch(Pivot),0,0
EndIf


Außerdem würde ich ein weiteres ELSE einführen wollen, dass den Wert genau auf 0 zurücksetzt.


Ohne diese Änderungen bleiben nach einiger Zeit alle Winkel im RESET-Zustand irgendwo zwischen -0.7 und 0.7, was dann bei komplexen Bewegungen mehrerer Achsen zu scheinbar sonderbaren Bewegungen führt.

Gerade der Roll hat es immer in sich. Du bist aber schon sicher, dass Du diese Drehung der Kamera wirklich willst? Es ist ja, als ob man den Fotoapparat schief hält. Danach gehen auch alle Yaw und Pitch-Bewegungen in "unerwartete" Richtungen.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group