Kamera weich auf Zielkoordinaten drehen / bewegen

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Kernel32

Betreff: Kamera weich auf Zielkoordinaten drehen / bewegen

BeitragSa, Mai 17, 2008 7:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab da gerade ein Problem und komme nicht so recht weiter. Die Kamera hängt irgendwo im Raum und zeigt in irgendeine Richtung. So.

Jetzt habe ich eine Zielkoordinate (x/y/z) und einen Zielwinkel (pitch und yaw -roll ist immer 0) und möchte, daß die Kamera von ihrer jetzigen Position "weich" an diese Zielposition fliegt und zugleich (ebenfalls weich) so rotiert, daß sie letzendlich den Zielwinkel einnimmt.

Das bewegen zur Zielkoordinate klappt zwar, aber wie kann man das mit dem Rotieren lösen, so daß die Kamera den kürzesten winkel nimmt und sich "weich" in die gewünschte Position dreht?

Code: [AUSKLAPPEN]

cam_speed# = .025 ; GESCHWINDIGKEIT

; ZUR ZIELKOORDINATE BEWEGEN
cx   =  (target_x-EntityX(Cam))*cam_speed
cy   =  (target_y-EntityY(Cam))*cam_speed
cz   =  (target_z-EntityZ(Cam))*cam_speed
TranslateEntity Cam,cx,cy,cz
-------------
Wollte neulich Herrn Brot anrufen, aber da war belegt.
Dann hab ich bei Wheight Watcher's angerufen, aber niemand hat abgenommen.
Schliesslich hab ich im Irak angerufen, aber dort war besetzt o.O

F

BeitragSa, Mai 17, 2008 9:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Versuchs mal mit AlignToVector

https://www.blitzforum.de/help/AlignToVector

Kannst auch DeltaYaw und DeltaPitch benutzen Wink

https://www.blitzforum.de/help/DeltaYaw

https://www.blitzforum.de/help/DeltaPitch
Signatur? Noch nie Gehört...
 

Kernel32

BeitragSa, Mai 17, 2008 10:53
Antworten mit Zitat
Benutzer-Profile anzeigen
AlignToVector funktioniert ja nicht, da dessen Parameter einen Zielpunkt beschreiben, also der Punkt, zu dem die Kamera schauen soll. Ich möchte aber nicht, daß die Kamera den Zielpunkt "anschaut", sondern den Zielpunkt und die Zielrotation einnehmen soll.

DeltaPitch und DeltaYaw benötigen ein Entity. Und selbst dann würde sich die Kamera ja wieder so ausrichten, daß sie darauf zeigt und nicht exakt diese Position und den Winkel selbst einnimmt.
-------------
Wollte neulich Herrn Brot anrufen, aber da war belegt.
Dann hab ich bei Wheight Watcher's angerufen, aber niemand hat abgenommen.
Schliesslich hab ich im Irak angerufen, aber dort war besetzt o.O

F

BeitragSa, Mai 17, 2008 11:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann erstellts du halt einen Pivot und richtest die Kamera auf diesen aus Wink
Signatur? Noch nie Gehört...
 

Kernel32

BeitragSa, Mai 17, 2008 11:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Glaube, du verstehst mich nicht Very Happy Ich möchte die Kamera nicht AUF etwas ausrichten, sondern daß sie eine vorgegebene, EXAKTE Position / Drehwinkel einnimmt.
-------------
Wollte neulich Herrn Brot anrufen, aber da war belegt.
Dann hab ich bei Wheight Watcher's angerufen, aber niemand hat abgenommen.
Schliesslich hab ich im Irak angerufen, aber dort war besetzt o.O

The_Nici

BeitragSa, Mai 17, 2008 12:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst dir ne Funktion schreiben, in dem du folgendes brauchst:

Operator <,>,=,+,-
Funktionen
Entitypitch
Entityyaw
Entityroll

Vergleiche die aktuelle Rotation mit der Zielrotation. Wink

F

BeitragSa, Mai 17, 2008 12:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Verstanden hab ich dich schon!

Ein pivot ist unsichtbar

Demnach kannst du ihn irgendwo hinsetzen (z.B. den Winkeln entsprechend) und niemand sieht ihn Wink

Andere Methode :

Das mit dem Kürzesten Winkel bekommst du hin indem du zuerst den Unterschied zwischen dem Aktuellen Winkel und 180 berechnest. Dann frägst du ab ob der (Zeilwinkel + Unterschied) Mod 360 kleine oder Größer als 180 ist. Ist er größer addierst du was hinzu. Ist er kleiner ziehst du was ab.

Beispiel

Code: [AUSKLAPPEN]


Graphics 320,240,16,2
SetBuffer BackBuffer()

W# = 0 ;Aktueller Winkel
W2# = 270 ; Zielwinkel

Repeat
Cls

; Linien Zeichnen {

X# = 160
Y# = 120

WritePixel X#,Y#,255

For N=1 To 20
   
   X# = X# + Cos(W#)
   Y# = Y# + Sin(W#)
   
   WritePixel X#,Y#,255
   
Next

X# = 160
Y# = 120

WritePixel X#,Y#,255000

For N=1 To 20
   
   X# = X# + Cos(W2#)
   Y# = Y# + Sin(W2#)
   
   WritePixel X#,Y#,255000
   
Next

; } Linien Zeichnen

; Winkelzeugs Berechnen (wichtig) {

UNT# = 180 - W# ; Unterschied berechnen

WINK# = (W2# + UNT) Mod 360 ; Winkel berechnen

If WINK# < 180 Then W# = W# - 1 ; Wenn kleiner dann subtrahieren
If WINK# > 180 Then W# = W# + 1 ; "        größer "        addieren

; } Winkelzeugs Berechnen (wichtig)

Flip 0
Delay(10)
Until KeyHit(1)
End



Bei EntityPitch\Yaw\Roll musst du das ganze anders aufbauen da diese dir Winkel von -180 (0) bis +180(360) zurückgeben Wink . Drehen kannst du dann mit TurnEntity
Signatur? Noch nie Gehört...

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group