Andere Herangehensweise / neues Gleichungssystem
Hallo,
ich habe mit der Aufgabe auf einem anderen Weg weitergemacht und habe nun einen anderen Lösungsweg und ein anderes Gleichungssystem:
Ausgangsformel:
q*P*q´=P1
Das Drehquaternion q sieht so aus:
q=[cos(Phi/2), (qx,qy,qz)] = [sq,(b,c,d)]
q´= [cos(Phi/2), (-qx,-qy,-qz)] = [sq, (-b,-c,-d)
wurzel(b^2+c^2+d^2)=1
P=(x,y,z)= [0,(x,y,z)] (Quaternionenschreibweise)
Quaternionen multipliziert man so:
q·q0 = s ·s0−v ·v0,v×v0+s ·v0+s0 ·v
Zuerst berechne ich a=q·P
sa=sq·0-(b,c,d)·(x,y,z)
a = (qx,qy,qz)x(x,y,z)+sq·(x,y,z)
(· steht für Skalar, x für Vektorprodukt)
Ich will die einzelnen Faktoren nicht aufschreiben, wie man ein Vektorprodukt berechnet ist ja nicht wirklich schwierig.
Nun kann ich a mit q´ multiplizieren und so den neuen Punkt finden:
sP1=sa·sq - a·(-b,-c,-d)
P1 = a x(-b,-c,-d)+sa·(-b,-c,-d)
P1 ist nun der rotierte Punkt, sP1 sollte 0 sein.
In Matlab sieht das ganze so aus:
%Rotationsachse
x0=0
y0=0
z0=-1
Betrag = sqrt(x0^2+y0^2+z0^2)
x0=x0/Betrag
y0=y0/Betrag
z0=z0/Betrag
%Rotationswinkel
alpha = 60
%Vektor
sP = 0
P = [0 2 6]
%Rotationsquaternion
sq = cos(alpha*pi/360)
q = [sin(alpha*pi/360)*x0 sin(alpha*pi/360)*y0 sin(alpha*pi/360)*z0]
%inverses Rotationsquaternion
sqi = cos(alpha*pi/360)
qi = [-sin(alpha*pi/360)*x0 -sin(alpha*pi/360)*y0 -sin(alpha*pi/360)*z0]
% a=q*P
sa = -dot(q,P)
a = cross(q,P)+sq*P+sP*q
% P1=a*q*
sP1 = sa*sqi - dot(a,(qi))
P1 = cross(a,(qi)) + sa*(qi) + sqi*(a)
Wie komme ich nun aber an q heran wenn ich nur P und P1 habe. Die Zuordnung ist eindeutig, mir fehlt nur der Algorithmus.
Gruß,
Martin
(Der so langsam die Nase voll hat von diesem Problem)