J Hansen wrote:
> At opstille en matrise for rotation i henholdsvis x- y- og z-akserne er
> ret simpelt, men hvordan gør man hvis man vil lave en rotationsmatrise
> omkring en vilkårlig vektor?
Her er lidt C kode til at udføre en rotation af punktet
(xold,yold,zold) omkring punktet (x0,y0,z0) og aksen
(nx,ny,nz) med vinklen theta igennem dette punkt.
double n=sqrt(nx*nx+ny*ny+nz*nz);
double a11=nx/n; // Cosines of dir.
double a12=ny/n;
double a13=nz/n;
double C=cos(theta);
double S=sin(theta);
double Q11=sq(a11)+(1-sq(a11))*C; // Rotation matrix
double Q12=a11*a12*(1-C)+a13*S;
double Q13=a11*a13*(1-C)-a12*S;
double Q21=a11*a12*(1-C)-a13*S;
double Q22=sq(a12)+(1-sq(a12))*C;
double Q23=a12*a13*(1-C)+a11*S;
double Q31=a11*a13*(1-C)+a12*S;
double Q32=a12*a13*(1-C)-a11*S;
double Q33=sq(a13)+(1-sq(a13))*C;
xt=xold-x0; // vector relative to i0
yt=yold-y0;
zt=zold-z0;
xnew=Q11*xt+Q12*yt+Q13*zt + x0;
ynew=Q21*xt+Q22*yt+Q23*zt + y0;
znew=Q31*xt+Q32*yt+Q33*zt + z0;
Jeg tror den letteste måde at bevise Q rotationsmatricen
er ved at opskrive rotationen i det koordinatsystem der
udgøres af vektoren (nx,ny,nz), retningen af (xt,yt,zt)
vinkelret på (nx,ny,nz) og deres krydsprodukt.
Jeg definere r=(xt,yt,zt). Så er enhedsvektorer i dette
koordinatsystem udgøres af
e1= (nx,ny,nz)
e2= (r-(r.e1)e1)/|r-(r.e1)e1|
e3= e1 x e2
Længden af r projiceret på e1 blot prikproduktet (r.e1), mens
længden af r projiceret på planet med normal e1 (komponenten
langs e2) er |r-(r.e1)e1| og komponenten langs e3 er nul per
konstruktion.
Dvs. r vektoren kan udtrykkes i (e1,e2,e3) koordinatsystemet:
r= (r.e1) e1 + |r-(r.e1)e1|e2 + 0 e3
Projektionen af (xt,yt,zt) på aksen (nx,ny,nz) vil ikke ændres
af en rotation, mens vektorens projektionen på planet med
normal (nx,ny,nz) vil blot udgøre en simpel rotation i 2d.
Dvs. roteres r med vinklen t kan dette let udtrykkes i
(e1,e2,e3) koordinatsystemet som:
r(t)= (r.e1) e1 + cos(t) |r-(r.e1)e1|e2 + sin(t) |r-(r.e1)e1| e3
er t=0 dvs. ingen rotation så fås r tilbage, så det kan ikke
være helt forkert.
Så i dette koordinatsystem kan du altså let udtrykke rotationen
omkring en vilkårlig vektor, og omskriver du denne rotationsligning
fra vektorsprog i (e1,e2,e3) koordinatsystem til matrixsprog i
laboratorie koordinatsystemet ved at indsætte e1,e2,e3 udtrykt
ved (xt,yt,zt) og (nx,ny,nz) så skulle resultatet gerne være
Q matricen gange r.
Til sammenligning er det relativt hård arbejde at udtrykke
rotationen som XYZ rotationer, fordi der først skal udføres
rotationer således at rotationsaksen er parallel med en af
koordinatsystemtsakser, og disse rotationer vil have en
vinkel der afhænger på kedelig vis af vektorer.
--
Mvh. Carsten Svaneborg
http://www.softwarepatenter.dk