查看: 3377|回复: 9

关于世界坐标和模型坐标的转换问题。

[复制链接]

该用户从未签到

发表于 2012-10-10 13:59:54 | 显示全部楼层 |阅读模式
本人现在想实现在一个FBX模型的手节点放置火焰的粒子团,所以能够把粒子团的MatrixTransform定位到手节点的Matrix上。
据本人所知,osg::ComputeLocalToWorld可以实现从模型坐标到世界坐标的转换。以下是本人的代码。
  1. class INodeVisitor: public osg::NodeVisitor
  2. {
  3. public:
  4.         std::string name;
  5.         osg::ref_ptr<osg::Matrix> mas;
  6.         INodeVisitor():osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN){ }

  7.         void setNodeName(std::string _name){
  8.                 name = _name;
  9.                 mas = new osg::Matrix();
  10.         }

  11.         osg::Matrix* getWorldMatrix(){
  12.                 return mas.get();
  13.         }

  14.         void apply(osg::Node& node){
  15.           //     std::cout<<node.getName()<<std::endl;

  16.                 if (node.getName() == name)
  17.                         *mas = osg::computeLocalToWorld(getNodePath());
  18.                
  19.                 traverse(node);
  20.         }
  21. };
复制代码
我通过传递name = "LefthandRope1"字符串到类里面,根据手节点的NodePath来计算出世界坐标矩阵。不知道写的正不正确,呵呵。希望大家指定。
现在问题来了。那我怎么把我的火焰例子团定位呢。我查找到函数osg::computeWorldToLocal(const osg::NodePath& NodePath)貌似可以帮我的忙。
但是我们发现他传递进去的参数是osg::NodePath而不是osg::Matrix.我想这样我们是无法计算出他的模型坐标的吧。请问大家
都是怎么做的呢。我的想法是不是错了呢?请大家指正。

该用户从未签到

发表于 2012-10-10 14:51:35 | 显示全部楼层
根据获得的数据设置位置 matrix

该用户从未签到

 楼主| 发表于 2012-10-10 16:28:32 | 显示全部楼层
liuzhiyu123 发表于 2012-10-10 14:51
根据获得的数据设置位置 matrix

谢谢您的回复,请问您指的是用PositionAttitudeTransform来设置setPosition吗。
不能通过MatrixTransform来setMatrix设置吗。或者是preMult,postMult。烦请指教。

该用户从未签到

发表于 2012-10-11 07:40:30 | 显示全部楼层
PositionAttitudeTransform 继承自 MatrixTransform,您说可以么

该用户从未签到

 楼主| 发表于 2012-10-11 22:15:31 | 显示全部楼层
liuzhiyu123 发表于 2012-10-11 07:40
PositionAttitudeTransform 继承自 MatrixTransform,您说可以么

嗯。非常感谢您的回复,不过这里我有一些处理我还没有相关方面的知识。希望您能帮忙解答下。
如上面所说,我能得到目标节点的世界坐标矩阵,而PositionAttitudeTransform的操作都是跟Vec3有关的。
我不知道怎么从Matrix类型得到Vec3.
所以用MatrixTransform应该是最直接的方法吧。
本人查阅MatrixTransform的Reference,只有setMatrix。以及virtual的computeWorldToLocal方法可能有用。
setMatrix据本人理解是设置模型矩阵,而不是世界坐标矩阵的。
而computeWorldToLocal也不知道怎么重写呢。我现在应该怎么做呢。还有,可能是您记忆错误,PositionAttitudeTransform继承自Transform,而不是MatrixTransform.

希望能得到您的帮助,非常感谢。

该用户从未签到

发表于 2012-10-12 07:41:25 | 显示全部楼层
本帖最后由 liuzhiyu123 于 2012-10-12 07:45 编辑

MatrixTransform setTrans 等方法  直接获得父节点的NodePath osg::computeLocalToworld

还有就是您可能还没有理解图形学里面的矩阵是怎么回事

该用户从未签到

 楼主| 发表于 2012-10-12 22:02:11 | 显示全部楼层
liuzhiyu123 发表于 2012-10-12 07:41
MatrixTransform setTrans 等方法  直接获得父节点的NodePath osg::computeLocalToworld

还有就是您可能 ...

谢谢指正,本人不是学这个出生的。毕设要用到。准备用其他方法来做了,没有相关基础知识做的很累。
准备向游戏方面发展呢。不知道您有什么建议呢。

该用户从未签到

发表于 2012-10-13 00:15:37 | 显示全部楼层
你是要得到模型的世界坐标么?如果是的话那么遍历器写错了
INodeVisitor()sg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN){ }
应该是INodeVisitor():osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_PARENTS){ }
你要往父节点遍历才能得到世界坐标啊。。。
还有只有派生自Referenced才能使用osg::ref_ptr所以osg::ref_ptr<Matrix>mas这样的定义错误!
直接osg::Matrix mas;就行了。。。
得到mas的值以后使用 mas.gettrans()得到坐标,ok~

该用户从未签到

发表于 2012-10-15 07:56:00 | 显示全部楼层
wujita01 发表于 2012-10-12 22:02
谢谢指正,本人不是学这个出生的。毕设要用到。准备用其他方法来做了,没有相关基础知识做的很累。
准备 ...

游戏方面,也分很多方面,渲染,物理,AI,server等等

该用户从未签到

 楼主| 发表于 2012-10-16 00:40:03 | 显示全部楼层
liuzhiyu123 发表于 2012-10-15 07:56
游戏方面,也分很多方面,渲染,物理,AI,server等等

嗯。这些需要慢慢了解,再确定方法。心里上偏向做网页游戏方面的,可能是服务器端。嘿嘿。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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