Hi,
ich habe seit einer Weile wieder mal Zeit zum Programmieren und habe so nach und nach meine Todoliste im Projekt abgearbeitet.
Tja und nun stehe ich wiedermal vor meinem Prob, dass ich schon seit nem guten Jahr habe, immer wieder in Angriff nehme und dann aus Verzweiflung doch wieder fallen lasse...
Ich versuche es also wiedereinmal:
Meine Camera besitzt zwei Pfade:
Ein Pfad bezeichnet die Bewegung der Camera.
Der zweite Pfad bezeichnet, wolang die Camera schaut.
Beide Pfade besitzen eine Geschwindigkeit und sind durch eine Kette von Vektoren gekennzeichnet.
Wenn ich die Applikation nun starte, soll die Kamera sich auf dem MovePath bewegen (Translation) und immer auf den richtigen Punkt im LookPath schauen (Rotation).
Die Bewegung funktioniert einwandfrei, nur sobald ich den LookPath einschalte, dreht sich die Kamera wild in irgendwelche Richtungen.
Hier mal der Quellcode:
nY := DotProductVector(v1,Unite(0,v1[Y],v1[Z]))/(LengthOfVector(v1)*LengthOfVector(Unite(0,v1[Y],v1[Z])));
nX :=Arccos(nX)/DEG2RAD;
nY :=Arccos(nY)/DEG2RAD;
Rotation[X]:= nX;
Rotation[Y]:= nY;
end;
lmAsObject:
begin
end;
lmAtObject:
begin
end;
end;
Frustum.Calculate;
end;
Wie man im Quellcode sieht, habe ichs auch schonmal ueber Kugelkoordinaten mit hilfe eines Tuts versucht, aber das hat nicht so funktioniert, wie ich das gern gehabt hätte.
Die andere Methode hab ich mir selbst mit meinem spärlichen Wissen über Vektoren zusammengeschußtert.
Beide funktionieren wie gesagt nicht richtig. Ich wäre äußerst dankbar fuer einen Lösungsansatz - dabei ist es mir gleich, ob es sich um Lösung für eine der beiden oben genannten Ansätz oder einen völlig neuen handelt.
Jap hab ich, hatte ich auch schon, is ja auch im grunde eine sehr einfache lösung.
Das problem, was ich damit jedes mal hatte, war, dass ich meine Kamera logischerweise auch manuell, also von einem Pfad losgelöst, sich bewegen lassen können will. Ich klicke also irgendwo mit der Maus, halte die Taste gedrueckt und drehe mich. Da muesste ich permanent einen neuen Punkt im Raum ausrechnen, auf den ich gucke und das alles nur aus den X und Y Koordinaten auf die ich die Maus ziehe.
Da müsste ich ja irgendwie mit eine Projekt/Unprojektfunktion arbeiten, aber ich weiss partout nicht, wie ich auf diesen neuen Lookat punkt kommen soll..
Na das ist doch der Kummer kleinster. Du hast nen Kamerapunkt und ne Blickrichtung. Danach ist der Center punkt Positionsvektor+Richtungsvektor. Die Länge der Richtung spielt hierbei keine Rolle.
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
wieso? die ergibt sich doch aus der Mausbewegung. Aktueller Punkt-MouseDown Punkt=Blickrichtung.
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
ja aber ich bewege die maus nach links/rechts und oben/unten also habe ich lediglich einen X und einen Y wert. ich habe keinen 3 dimensionalen wert, dann waer das ja alles einfach. aber ich muss jetz praktisch mit diesem x und y wert eine richtung errechnen und das ist eben ziemlich schwer
Die Rotationswerte werden im OnMouseMove Event aus der Differenz der Mausposition zwischen diesem und dem letzten Frame errechnet.
Wenn ich mich nun z.B. per WASD im Raum bewege. Wird ein Vector zusammengesetzt z.B. für Vorwärts
Code:
Richtung := Vector(0,0,-1);
bzw. jede Komponente einzeln, damit man mehrere Tasten gleichzeitig drücken kann.
Code:
Richtung.Z := -1;
Anschliessend mit Vector-drehenden Funktionen um die gleichen Rotationswerte gedreht und inklusive timebased-movement auf die aktuelle Position addiert.
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
ja so hatte ich das auch irgendwann schonmal, aberr ich will ja jetz glulookat verwenden, da will ich jetz nich wieder rotates und translates dazwischen haun. Ich möchte im Grunde nur wissen, wie ich auf den neuen Centerpoint komme.
Meine Theorie ist ja, dass ich den Richtungsvektor zwischen eye und dem alten center ausrechne, und dann um die x und y achse drehe, denn winkel bekomme ich ja, ueber die mausbewegung. Nur weiss ich eben nicht, wie genau ich diese Drehung eines Vektors um einen Winkle realisiere.
Registriert: Mo Jan 31, 2005 11:02 Beiträge: 432 Wohnort: Rheinlandpfalz
Hallo,
hier hab ich ein paar Funktionen, mit denen du einen beliebigen Vektor um die X-, Y-, oder Z-Achse drehen kannst.
Außerdem kannst du mit der ersten Funktion einen Vektor um einen beliebigen anderen Vektor drehen.
Alpha ist der Winkel in Grad.
Code:
Function VectorRotEVector(const vector, EVector: TVector3f; alpha:Single): TVector3f;
Hab auch noch ein paar nette Funktionen für Dich:Damit kannst Du die Kamera um die angegebenen Winkel rotieren lassen. Die Angaben sind die Winkel um die Achsen Z (Rolle) , X (Looping) und Y (Kurve), bezogen auf Kamera.
Dies dient der Rotation der Kamera um sich selber. oCenter, oEye und oUp sind Member meiner Kameraklasse und entsprechen den Parametern für gluLookAt
Hierzu noch ein paar Hilfsfunktionen:
// e.g.: 1st col, 3rd row would be [0,2] not [2,0]
End;
TGLVector=Record
CaseIntegerOf
0:(X: GLDouble;
Y: GLDouble;
Z: GLDouble);
1:(Width: GLDouble;
Depth: GLDouble;
Height: GLDouble);
2:(Tilt: GLDouble;
Roll: GLDouble;
Pan: GLDouble);
End;
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Ich habe nur ein Problem noch. Wenn ich mich nach links/rechts drehe, dann drehe ich mich ja immer um die Y-Achse, deswegen kann ich das fest reinprogrammieren.
Wenn ich aber gewissermaßen meinen Kopf nach oben und Unten neige, drehe ich mich um eine Achse, abhaengig von meiner Position udn meiner Blickrichtung.
Hab mir das mal theoretisch ueberlegt:
Die Achse, um die ich mich drehe, ist eine Normale zu meiner Blickrichtung (Center - Eye) und der Y-Achse (0,1,0). Nun muesste ich ja nur um diese Achse Rotieren. Mein Code dazu sieht so aus:
Code:
// subtract vector subtrahiert automatisch den zweiten vom ersten vector
// Rotation um Y -Achse -> funktioniert
Center := RotateVectorY(SubtractVector(Eye,Center), XRel*DEG2RAD/10);
// rotation um errechnete Achse -> funktioniert nicht, wie sie soll
Center := RotateVector(SubtractVector(Eye,Center),CrossProductVector(SubtractVector(Eye,Center),Unite(0,1,0)), YRel*DEG2RAD/10);
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Du rotierst immer um Y? Dann bau dir aus "SubtractVector(Eye,Center)" und dem Vektor (0,1,0) über ein Kreuzprodukt die Achse, die "quer" durch deine Kamera geht. Sprich: Die X-Achse im Ortho-modus. Dann kannst du mit 'VecToRotationMatrix' um diese Achse rotieren.
Wenn ich jetzt nich alles total verpeilt habe
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
Naja im Grunde mache ich ja genau, was du da beschreibst:
Ich baue ein KreuzProdukt aus SubtractVector(Eye,Center) und Unite(0,1,0) => CrossProductVector(SubtractVector(Eye,Center),Unite(0,1,0)
und dann rotiere ich meinen Vektor daherum => Center := RotateVector(SubtractVector(Eye,Center),CrossProductVector(SubtractVector(Eye,Center),Unite(0,1,0)), YRel*DEG2RAD/10); Bei RotateVector ist der erste Vektor der zu rotierende, der zweite ist der Vektor, um den Rotiert wird und der letzte Wert ist der Winkel
Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.