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
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;
/**/
}
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
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;
	}