查看: 3292|回复: 3

模型绕轴旋转出现问题,请高手帮忙!!!

[复制链接]

该用户从未签到

发表于 2009-12-25 11:39:27 | 显示全部楼层 |阅读模式
我是在3D Max8中建模,完成一个箱子,然后导成osg文件,现在要打开一个箱门,箱门绕Z轴旋转,在3D Max中手动测量了门的宽度,最后旋转有偏差。代码如下:
osg::Matrixf max;
osg::MatrixTransform* pMat = dynamic_cast<osg::MatrixTransform*>(_node.get());//要旋转的箱门
osg::BoundingSphere bsh = _node.get()->getBound();//取得包围球
//先移回原点    _GeometryAttr._fLength为在3D Max中手动测量的门的宽度
max.identity();
max.makeTranslate(-(bsh._center._v[0]-_GeometryAttr._fLength/2),-(bsh._center._v[1]),0.0f);
pMat->postMult(max);
//进行旋转 绕Z轴旋转
max.identity();
max.makeRotate(osg:egreesToRadians(-90.0f),0.0f,0.0f,1.0f);
pMat->postMult(max);
//再移回原处
max.identity();
max.makeTranslate((bsh._center._v[0]-_GeometryAttr._fLength/2),(bsh._center._v[1]),0.0f);
pMat->postMult(max);

该用户从未签到

发表于 2009-12-25 12:26:08 | 显示全部楼层
首先不必写的这么麻烦,您完全可以把自己的代码写成如下的形式:

  1. pMat->postMult( osg::Matrix::translate(-...) * osg::Matrix::rotate(...) * osg::Matrix::translate(...) )
复制代码
其次,我不知道您所谓的“有偏差”是偏差了多少,也许您可以更详细地说明一下。这无非是一个空间变换矩阵的计算问题

最后,我不清楚您这里用MatrixTranform::postMult()是否合适?通常我们会使用setMatrix()来直接进行设置

该用户从未签到

 楼主| 发表于 2009-12-25 13:25:20 | 显示全部楼层
2# array
有偏差就是,并不是按照箱门的一边旋转,而是距离箱门一边有一定距离的轴旋转。

该用户从未签到

发表于 2009-12-25 13:33:06 | 显示全部楼层
那么调整您的GeometryAttr._fLength设置值就好了~~也许是您自己量测不准而已
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表