Hi, ich bastel derzeit an einer Camera mit Pfadsteuerung. Das heisst, meine Camera bewegt sich ueber eine festgelegte Anzahl von Vektoren. Dabei ist ebenso der Blickpunkt, also der Punkt, auf den die Camera gerichtet ist, festgelegt.
Ich habe zb folgende Punkte, auf denen sich meine Camera bewegt:
Delphi-Quelltext
1: 2: 3: 4:
| pfad.AddPoint(Unite(-1,1,1)); pfad.AddPoint(Unite(1,1,1)); pfad.AddPoint(Unite(1,1,-1)); pfad.AddPoint(Unite(-1,1,-1)); |
Dabei liegt der Blickpunkt, auf den die Camera gerichtet ist, bei Unite(0,0,0);
Nun soll die Camera also bei dem Punkt (-1,1,1) starten und nach (0,0,0) gucken. Dann bewegt sie sich von (-1,1,1) zu (1,1,1) und dann zu (1,1,-1) und dann zu (-1,1,1) und dabei wird sie immer auf den Punkt (0,0,0) gedreht.
Nun geht es hier keinesfalls um die 3D-Technische Realisierung, die steht bereits. Nur der mathematische bzw Logische Hinterbau hinkt, denn das Programm arbeitet nicht so, wie ich das gern haette.
Für meine Rechnung habe ich mir also folgendes ueberlegt.
Die Camera steht auf (-1,1,1) und soll zu (1,1,1) bewegt werden und sich dabei immer so drehen, dass sie genau auf (0,0,0) schaut.
Meinen Momentanen Punkt bekomme ich immer per Aufruf von:
Delphi-Quelltext
1: 2:
| distance := LMSpeed * Renderer.CurTime/1000; CurPoint := LookPath.GetPos(distance); |
CurPoint gibt also zu jeder Millisekunde den momentanen Positionsvektor an.
Ich muss also nur noch herausfinden, welche Winkel zwischen CurPoint und (0,0,0) liegen.
Meine Rechnung dazu sieht bisher so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var distance, nX, nY: Single; CurPoint, DiffVector: TGLVectorf3; begin distance := LMSpeed * Renderer.CurTime/1000; CurPoint := LookPath.GetPos(distance); DiffVector := SubtractVector(CurPoint,Translation);
nX := DotProductVector(DiffVector,Unite(DiffVector[0],0,DiffVector[2])) / (LengthOfVector(DiffVector)*LengthOfVector(Unite(DiffVector[0],0,DiffVector[2]))); nY := DotProductVector(DiffVector,Unite(0,DiffVector[1],DiffVector[2])) / (LengthOfVector(DiffVector)*LengthOfVector(Unite(0,DiffVector[1],DiffVector[2])));
nX := Arccos(nX)/DEG2RAD; nY := Arccos(nY)/DEG2RAD; |
Winkel nX gibt an, um wieviel Grad die Camera sich um die x-Achse drehen soll.
Winkel nY gibt an, um wieviel Grad die Camera sich um die y-Achse drehen soll.
Ich habe damit jetz ne ganze Menge rumprobiert, aber funktioniere tut es leider nicht wirklich.
Nochmal die Anmerkung: Ich brauch hier keine OpenGL-Hilfe sondern eine rein mathematische bzw logische Analyse, ob meine Herangehensweise sinnvoll ist. Hoffe wirklich, dass ihr mir helfen könnt. Danke schonmal im Voraus an alle, die sich die Mühe machen, sich mit dem Problem auseinander zu setzen.