最近在项目中要做三维旋转,通过鼠标来实现地图的三维旋转。
项目中使用的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();