|
|
发表于 2009-4-14 09:05:00
|
显示全部楼层
Re:四元数转成旋转角度
// 下面的函数的功能是将摄像机的观察方向绕某个方向轴旋转一定的角度
void RotateView_line(float angle, float x, float y, float z,D3DXVECTOR3 &p1,D3DXVECTOR3 &p2)
{
//angle:rotate angle
//x/y/z:转动轴的X/Y/Z(非坐标而是其长度);
//p1:起始点(移动的轴)
//p2:终点(移动的轴)
D3DXVECTOR3 vNewView;
// 获得观察方向矢量
D3DXVECTOR3 vView =p2-p1;//(要移动轴的长度)
// 计算角度的cos和sin值(转化成弧度)
float cosTheta = (float)cosf(angle);
float sinTheta = (float)sinf(angle);
// 计算新的观察点坐标X
vNewView.x = (cosTheta + (1 - cosTheta) * x * x) * vView.x;//start
vNewView.x += ((1 - cosTheta) * x * y - z * sinTheta) * vView.y;
vNewView.x += ((1 - cosTheta) * x * z + y * sinTheta) * vView.z;
// 计算新的观察点坐标Y
vNewView.y = ((1 - cosTheta) * x * y + z * sinTheta) * vView.x;
vNewView.y += (cosTheta + (1 - cosTheta) * y * y) * vView.y;
vNewView.y += ((1 - cosTheta) * y * z - x * sinTheta) * vView.z;
// 计算新的观察点坐标Z
vNewView.z = ((1 - cosTheta) * x * z - y * sinTheta) * vView.x;
vNewView.z += ((1 - cosTheta) * y * z + x * sinTheta) * vView.y;
vNewView.z += (cosTheta + (1 - cosTheta) * z * z) * vView.z;
p2 = p1 + vNewView;
}
void LHxxSELF_AXISROTATEY(LHxx3DOBJECT *ob,float speed)
{
//0-1:x; 2-3:y; 4-5:z;
D3DXVECTOR3 vAxis;//set axis 0
//使各起始点的位置相同
ob->LHxxAxisLine[4].LHxxLP=ob->LHxxAxisLine[2].LHxxLP=ob->LHxxAxisLine[0].LHxxLP;
//y轴长
vAxis=ob->LHxxAxisLine[3].LHxxLP-ob->LHxxAxisLine[0].LHxxLP;
//vAxis = Normalize(vAxis);
D3DXVec3Normalize(&vAxis,&vAxis);//归一化
//rotate z
//Rotate axis
RotateView_line(speed, vAxis.x, vAxis.y, vAxis.z,ob->LHxxAxisLine[0].LHxxLP,ob->LHxxAxisLine[5].LHxxLP);
//rotate x
RotateView_line(speed, vAxis.x, vAxis.y, vAxis.z,ob->LHxxAxisLine[0].LHxxLP,ob->LHxxAxisLine[1].LHxxLP);
//rotate ob Vertex
//CVector3DLL temp=_CVDLL(_DVDLL(ob->LHxxAxisLine[0].LHxxLP)-ob->LHxxMove);
//RotateView_line(speed, vAxis.x, vAxis.y, vAxis.z,ob->LHxxAxisLine[0].LHxxLP,_CVDLL(ob->LHxxMove));
//ob->LHxxMove+=_DVDLL(temp);
} |
|