OSG物体围绕自身中心旋转变化
创建场景时,默认旋转中心是view中心。
想要以物体以自身中心为旋转基点的话,思路是把物体先移动到中心,变化后再移动回原来位置。
osg::Matrix view_matrix = _view->getMatrix();
auto trans_temp = view_matrix.getTrans();
// 将场景先移动到view中心
view_matrix *= osg::Matrix::translate(-trans_temp );
// 旋转
view_matrix *= osg::Matrix::rotate(osg::inDegrees(1.0), osg::Vec3d(0,0,1);
// 移动回原来位置
view_matrix *= osg::Matrix::translate(trans_temp );
如果物体导入的物体在局部坐标系中,不处于中心位置,上面的移动就不够了。需要再将物体中心移动到中心点。
但是由于多移动了一个物体center的translate。在旋转时matrix的trans值此时不为零,再在之后操作中matrix.getTrans的值已经不是之前的trans。
所以要多做一步操作,这里的解决方法是,将center也进行matrix的操作,这样物体和物体中心的位置还是相对不变。
// 获取物体中心点
osg::Vec3d center = _model->getBound().center();
*matrix_center *= osg::Matrix::translate(center);
osg::Matrix view_matrix = _view->getMatrix();
auto trans_temp = view_matrix.getTrans();
// 将场景先移动到view中心
view_matrix *= osg::Matrix::translate(-trans_temp );
// 获得新的物体中心
*matrix_center *= view_matrix ;
view_matrix *= osg::Matrix::translate(-matrix_center->getTrans());
// 旋转
view_matrix *= osg::Matrix::rotate(osg::inDegrees(1.0), osg::Vec3d(0,0,1);
// 移动回原来位置
matrix *= osg::Matrix::translate(trans_temp + matrix_center->getTrans());
这样的操作,适用于所有需要以物体为中心的变化操作。