je n arrive pas a faire de rotation avec les Quaternions
si j ai bien compris il faut convertir un axe de rotation avec l'angle en quaternion
puis de quaternion en matrice de rotation et apres faire une rotation
M'=R*M
bout de code de la classe quaternion
et le bout de code utilisant la classe
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 CQuat::CQuat(double x,double y,double z,double w) { this->x=x; this->y=y; this->z=z; this->w=w; } void CQuat::ToQuat(double m_Angle,double x,double y,double z) { double dSin=sin(m_Angle/2); double dCos=cos(m_Angle/2); CQuat Quaterion; Quaterion.x=x*dSin; Quaterion.y=y*dSin; Quaterion.z=z*dSin; Quaterion.w=dCos; } double CQuat::norme(void) { return sqrt(w*w+x*x+y*y+z*z); } void CQuat::ToMat(CMatrice &TempMat) { double xx=x*x; double xy=x*y; double xz=x*z; double xw=x*w; double yy=y*y; double yz=y*z; double yw=y*w; double zz=z*z; double zw=z*w; TempMat[0][0]=1-2*(yy+zz); TempMat[1][0]=2*(xy-zw); TempMat[2][0]=2*(xz+yw); TempMat[0][0]=2*(xy+zw); TempMat[1][0]=1-2*(xx+zz); TempMat[2][0]=2*(yz-xw); TempMat[0][0]=2*(xz-yw); TempMat[1][0]=2*(yz+xw); TempMat[2][0]=1-2*(xx+yy); TempMat[3][3]=1; /**/ }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 void CPoint3D::Rot(const double dAlpha,const CPoint3D &Omega) { CMatrice MatriceRot(4,4); CMatrice MatTemp(4,1); CQuat toto; toto.ToQuat(dAlpha,x-Omega.x,y-Omega.y,z-Omega.z); toto.ToMat(MatriceRot); MatTemp[0][0]=x-Omega.x; MatTemp[1][0]=y-Omega.y; MatTemp[2][0]=z-Omega.z; MatTemp[3][0]=1; MatTemp=MatTemp*MatriceRot; x=MatTemp[0][0]-Omega.x; y=MatTemp[2][0]-Omega.y; z=MatTemp[1][0]-Omega.z; }
Partager