您的位置:首页 > 其它

OSG学习笔记18 - 关于物体绕指定点旋转的问题(非坐标轴原点)

2017-03-14 21:15 453 查看
两种解决方案:

1、使用PAT节点,即PositionAttitudeTransform节点类中的,setPivotPoint(const Vec3d&)来设置旋转轴心或缩放轴心。这个是查到的方法,但实践没有成功,在调用这个setPivotPoint()方法时,模型总会发生位移,没有找出原因。

这里贴出一下osg forum里的相关内容,希望能有所帮助。
http://forum.openscenegraph.org/viewtopic.php?t=3721&view=previous
osg::Node* createRoom(osg::Node* loadedModel) // From osgLight example
{
// default scale for this model.
osg::BoundingSphere bs(osg::Vec3(0.0f,0.0f,0.0f),1.0f);

osg::Group* root = new osg::Group;

if (loadedModel)
{
const osg::BoundingSphere& loaded_bs = loadedModel->getBound();

osg::PositionAttitudeTransform* pat = new osg::PositionAttitudeTransform();
pat->setPivotPoint(loaded_bs.center());

可以参考example中的osgLight,osgLaucher,osgLogo。

2、可行方案

其实和之前写的OSG学习笔记17-正确设置物体的缩放矩阵中的内容原理是一样的。

如果需要以场景中的某一点而非原点为轴心,进行旋转或缩放变换,则应先平移当前坐标轴原点(也可以理解为平移这个物体)到指定的轴心点,再进行SRT矩阵变换,再平移回来。——摘自王锐大大的书。

picked->setMatrix(originPos*osg::Matrix::translate(-set_center)
*osg::Matrix::rotate(rotateParameter)*osg::Matrix::translate(set_center));这里的set_center就是想要指定的平移的点。originPos是物体表面顶点矩阵。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: