OSG围绕物体中心旋转等变化

该博客详细介绍了在osg中如何使物体围绕自身中心进行旋转。首先,通过移动物体到视图中心,然后应用旋转操作,接着将物体移回原始位置。如果物体不在其局部坐标系的中心,需要额外调整物体中心。通过矩阵运算,确保物体在旋转前后位置相对不变,从而实现以物体中心为旋转点的效果。这种方法适用于任何需要基于物体中心进行变换的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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());

这样的操作,适用于所有需要以物体为中心的变化操作。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值