irrlicht (鬼火)来实现cloud compare中的三维旋转功能

最近在项目中要做三维旋转,通过鼠标来实现地图的三维旋转。

项目中使用的3d引擎是irrlicht,3d 旋转功能是完全模仿cloud compare做的。

在<<计算机图形学>>中的第五章的 <<几何变换>>中详细讲解了二维和三维的各种变换(平移、旋转、缩放等),

以下代码是通过鼠标来实现地图的三维旋转的核心代码:

如果有不懂的地方,请联系我 714028760

 

/*

matrix4        irrlicht中封装的矩阵类

quaternion     irrlicht中封装的四元数类

m_AuxY = vector3df(0,1,0);

m_AuxX = vector3df(0,0,0);

*/

quaternion         mrQuaternion;

vector3df          MouseTrace = m_AuxY * (m_mouseStartPos.Y - mouse.Y) *0.1+ m_AuxX * (m_mouseStartPos.X - mouse.X) *0.1;

 

//获取旋转轴

vector3df RotateAsix = MouseTrace.crossProduct(m_AuxZ);

RotateAsix.normalize();

//获取旋转角度

float angle = MouseTrace.getLength();

 

matrix4            mrMatrix;

matrix4    mrt, mrt1;

//相机的目标点

vector3df target = camera->getTarget();

//相机位置

vector3df pos = camera->getPosition();

//相机的upvector

vector3df upVec = camera->getUpVector();

 

//设置逆平移矩阵

mrt1.setInverseTranslation(pos);

//设置平移矩阵

mrt.setTranslation(pos);

 

//通过旋转轴和旋转角度构造四元数

mrQuaternion.fromAngleAxis(core::degToRad(angle), RotateAsix);

//通过四元数来获得旋转矩阵

mrQuaternion.getMatrixCenter(mrMatrix, target, vector3df());

 

//

mrMatrix.rotateVect(upVec);

mrMatrix *= mrt1;

mrMatrix *= mrt;

mrMatrix.transformVect(pos);

 

upVec.normalize();

camera->setPosition(pos);

camera->setUpVector(upVec);

 

 

m_AuxY = upVec;

m_AuxZ = pos - camera->getTarget();

m_AuxX = m_AuxY.crossProduct(m_AuxZ);

m_AuxX.normalize();

你可能感兴趣的:(irrlicht,irrlicht,三维旋转)