其原理是给模型设置新的中心,模型会移动,旋转后再把模型移回原来的中心。实现的效果是模型可以以任意点为旋转中心,且不会跳动。
设置旋转中心的方法,m_move和m_rotationMat是自定义的
void SetCenter(const Vec3d& center)
{
m_move = _center - center;
m_rotationMat = Matrixd::translate(m_move.x(), m_move.y(), m_move.z()) *
Matrixd::rotate(_rotation.inverse());
_center = Vec3d(0., 0., -_distance) * getMatrix();
}
重写getMatrix()
Matrixd getMatrix() const
{
Matrix viewMat =
Matrixd::translate(m_rotationMat(3, 0), m_rotationMat(3, 1), m_rotationMat(3, 2) + _distance) *
Matrixd::rotate(_rotation) *
Matrixd::translate(_center - m_move);
//相机设置视觉矩阵
m_pViewer->getCamera()->setViewMatrix(Matrix::inverse(viewMat));
return viewMat;
}