查看: 4029|回复: 9

已知模型的节点名,怎样得到模型所在的位置?

[复制链接]

该用户从未签到

发表于 2008-6-24 11:31:15 | 显示全部楼层 |阅读模式
我相通过输入模型的节点名,首先在场景中判断有没有此模型,如果有,将视点转移到此模型上。需要知道模型所在的位置,请问该怎么做呢?NAVY的教程上有一个相应的例子,不过没有看懂。
  现在的一个问题是不知道怎么取得模型的变换矩阵。

该用户从未签到

发表于 2008-6-24 13:38:24 | 显示全部楼层
使用osg::computeLocalToWorld函数得到模型的世界坐标系矩阵。NodePath是当前模型节点到场景根节点的路径,可以使用访问器NodeVisitor的getNodePath()方法设法取得。

该用户从未签到

 楼主| 发表于 2008-6-24 13:53:36 | 显示全部楼层
我是这样做的:osg::Matrix Nodematrix;
        Nodematrix = osg::computeWorldToLocal(Nodevistor.getNodePath());
但是Nodematrix没有变化,我相应该是节点路径没有找对,能具体指点一下怎么样找到节点路径吗?

该用户从未签到

发表于 2008-6-24 22:37:26 | 显示全部楼层
继承一个新的访问器:class UserVisitor :public NodeVisitor
然后重载它的apply方法。正如NAVY教程中所述的那样

也可以参考Node::getWorldMatrices函数的实现过程

该用户从未签到

发表于 2008-6-24 23:02:05 | 显示全部楼层


像NAVY一样访问器是非常简便的,你也可以递归遍历场景,得到节点,再通过包围盒也可以得到直接得到模型的位置~~~~~

该用户从未签到

 楼主| 发表于 2008-6-25 09:32:35 | 显示全部楼层
我现在就是换了用包围盒,找到了中心点,但是是模型坐标,得不到世界坐标啊!

该用户从未签到

发表于 2008-6-25 14:05:07 | 显示全部楼层
不同的访问器有不同的功能实现,ComputeBoundsVisitor不是用来取得世界坐标的。

可以执行场景叶节点的getWorldMatrices函数,取得矩阵列表,然后极联所有的矩阵得到世界坐标;更好的方法是参考NAVY的实现,自己编写访问器,并使用叶节点的accept方法,取得NodePath之后再使用computeWorldToLocal函数。
不知您看不懂NAVY教程的哪一段代码或者思路?

该用户从未签到

 楼主| 发表于 2008-7-4 13:56:35 | 显示全部楼层
现在搞明白了,谢谢array和Flysky

该用户从未签到

发表于 2008-7-7 21:51:32 | 显示全部楼层
osg::Matrix& mMatrixWorld
osg::NodePath np = node->getParentalNodePaths()[0];
osg::Matrix matrixWorld = osg::computeLocalToWorld(np);

这样就得到世界坐标系矩阵了,反之

osg::Matrix& matrixLocal = osg::computeWorldToLocal(np);

得到局部坐标系矩阵。

然后
osg::Matrix::getTrans()
就可以得到坐标点了。

该用户从未签到

 楼主| 发表于 2008-7-8 16:09:52 | 显示全部楼层
呵呵用syloud的方法试了一下,也可以实现,谢谢了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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