Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Mit einer einfachen Rechnung kann ich leider nicht dienen. Aber ich kann Dir Sourcecode aus meiner selbstgebastelten 3DMathUnit zur Verfügung stellen:
Das erste hat mit Quaternionen noch nichts zu tun, es berechnet lediglich die Rotation, wie man von einem Vektor zum anderen kommt; daher zunächst die Definition des Rotations-Records (das ist die Winkel/Achse-Repräsentation) und auch des Quaternions:
Code:
TStdRotation =Record
Angle: TFloat32;
Vector: TStdVector4D;// sollte auch 3D möglich sein
End;
Code:
TStdQuaternion =Record
RealW,ImagX,ImagY,ImagZ: TFloat32;
End;
Dann die Berechnung (die ist bei mir dauernd in Gebrauch, sollte daher OK sein), wie man Skalar- und Kreuzprodukt ausrechnet, weißt Du, nehm ich an:
Quaternionen bekommt man sehr leicht, wenn man die Rotationsachse und den Winkel kennt. Ist also im Prinzip ganz einfach. Die Rotationsachse steht senkrecht zur Ebene in der A und B liegen, sprich du rechnest (A kreuz B), normierst und kennst die Rotationsachse. Dann brauchst du noch sinus und cosinus des winkels von A nach B. Den Cosinus schenkt dir das Punktprodukt, den Sinus gibts aus den Umrechnungsformeln der trigonometrie und ein biserl denken - hab ich jetzt nicht gemacht Irgendwann stand auch mal im Nachsitzen Tut ein Beispiel in dem Stand wie das geht, scheint aber leider verlorengegangen sein - also selber denken...
Ich brauch das ganze für ein Plugin für 3ds max.
Sagen wir ich habe einen würfel mit der höhe 5 der gerade auf dem boden steht.
Jetzt möchte ich das er auf den punkt [5,5,5] zeigt mit seiner spitze.
= mein From-Vektor ist [0,1,0].
und mein To-Vector ist [5,5,5] (normalisiert dann).
richtig?
Wenn ich das dann in die formeln oben einsetze und daraus ein Quaternion berechne, welches ich dann im 3ds max SDK dem würfel als rotations-wert zuweise, ist er nicht richtig rotiert.. :/ Also er zeigt nicht auf den punkt wo er eigentlich hinzeigen sollte
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Mir ist nicht ganz klar, was Du willst
Nehmen wir mal OpenGl-Verhältnisse an, und Du hast einen Würfel mit der Kantenlänge 5, und dessen Eckpunkte so benannt sind, wie im Bild unten.
Ich nehme mal OpenGl-Verhältnisse an, also ZPlus zeigt aus dem Bildschirm heraus auf Dich.
Du sagtest, der Würfel steht "am Boden". Ich nehme also einen Koordinatenursprung sagen wir mal im Punkt F an Der erste Vektor zeigt dann praktisch auf G, richtig? Der zweite Vektor würde dann auf C zeigen.
Die Drehung erfolgt dann in der Ebene, die durch das Dreieck FGC definiert wird Es sollte dann so aussehen, als ob er schräg nach vorne fallen würde.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
um ein Quaternion zu bekommen welches die drehung eine vectors A zu einem zweitem B beschreibt ist ganz einfach:
Die dreh achse bekommt man mit hilfe des crossproduktes beider normalisierten vektoren. Um den cosinus des halbem winkels zu berechnen einfach das dot produkt zwischen einem der beiden normalisiertem vektor und dem normalisierten summe beider vektoren berechnen. Die richtung ist bereits in der richtung des vectors aus dem cross produktes enthalten. Nun diesen mit dem cos des winkels multiplizieren um die x,y und Z componente des quaterniosn zu erhalten, zum schluss noch mit dem pytagoras zum cos des winkels den sinus berechnen, der dann als Skalar anteil dient. Pseudo code:
A = normalize(A);
B = normalize(B);
vec3 d = normalize(cross(A,B)); //normlize hinzugefügt
float co = dot(normalize(A+B),A);
float si = sqrt(1.0 - co*co);
return vec4(d * si, co);
Stimmt da fehlt ein normalisieren. Bei GLSL macht es allerdings sinn den skalaranteil in der 4ten komponente zu specihern, da der vektor anteil sonst aus den komponenten yzw besteht, was noch verwirrender ist.
Mitglieder in diesem Forum: 0 Mitglieder und 10 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.