查看: 3429|回复: 7

场景中模型移动的物体坐标系和世界坐标系问题

[复制链接]

该用户从未签到

发表于 2011-12-6 16:59:12 | 显示全部楼层 |阅读模式
大家好,   
      下面是我建的一个节点树。建节点树加入模型的时候就通过setPosition(x0, y0, z0)来确定模型在场景中的初始位置。之后想实现根据需要及时修改模型在场景中的位置。如果通过设置setPosition方法来实现,则这个平移的坐标是相对于(x0,y0,z0)的相对平移值。
      
       问题一:我想实现的是如何通过设置修改后模型的世界坐标值去得到模型在场景中的位置?我想到的一个方法是如果我要设置的模型世界坐标值为(x,y,z),则setPosition(x-x0,y-y0,z-z0);这种方法不知道可行否。
     
       问题二:如果我想实现设置模型1在另外一个模型2的物体坐标系下得平移值,那应该怎么去思考呢?
              
节点树的组织形式
                             root
                          /          \
               PAT节点1     PAT节点2
                     |                 |
                 Node1         Node2
                     |                 |
                 模型1           模型2



谢谢各位!

该用户从未签到

 楼主| 发表于 2011-12-6 17:24:17 | 显示全部楼层
本帖最后由 knightlixiao 于 2011-12-6 19:39 编辑

问题补充:
        osg:ositionAttitudeTransform类中通过 setPivotPoint()方法可以设置原点,这个原点是不是以后setPosition,setScale,这些的参照原点呢?另外setPivotPoint()的参数是世界坐标还是物体坐标。 谢谢!

该用户从未签到

发表于 2011-12-7 09:13:56 | 显示全部楼层
我用MT来控制位置

该用户从未签到

 楼主| 发表于 2011-12-7 12:24:22 | 显示全部楼层
MT和PAT差不多吧,都是相对平移值。

我后来总结了一个方案,可以实现。由于自己是个新手,方法可能不专业、不完善,但想也贴出来和大家交流一下,期待各位不吝指点。谢谢!

1、设置坐标系(其实就是把axes.osg模型加到场景中,做个参照)
1.1、自定义坐标系的默认原点即在世界坐标系的原点(0,0,0)。
1.2、设置自定义坐标系的原点方法是将原始坐标原点平移至自定义的位置,实现代码为setPosition(osg::Vec3(x0,y0,z0));此方法设置的平移矩阵中的值是相对于初始位置的相对平移值,但是由于坐标系的初始原点即在世界坐标系的原点,因此得到自定义的坐标系的原点的世界坐标就是(x0,y0,z0)。

2、添加模型
2.1、模型添加时,默认添加到世界坐标的原点即(0,0,0);这里用sePosition(osg::Vec3(x,y,z))方法设置添加的模型的位置;此方法入上述方法一致,(x,y,z)是指相对平移值(初次加入时是指相对于世界坐标原点的值)。但是由于自定义了坐标系,因此需要知道在自定义坐标系下得坐标(即相对于axes.osg模型的坐标),因此改进方法setPosition(osg::Vec3(x0+x1,y0+y1,z0+z1));这里,(x0,y0,z0)是自定义坐标系的原点,(x1,y1,z1)是模型在自定义坐标系下得坐标,(x0+x1,y0+y1,z0+z1)就是模型的世界坐标了。
2、2  模型的移动的方法是通过变换模型节点父节点上的PAT节点来实现的。因此通过setPosition(osg::Vec3(x,y,z)),此方法中的平移矩阵也是相对初始位置的。而我们现在平移模型的原则是在自定义坐标系下进行的。因此使用setPivotPoint(osg::Vec3(x1,y1,z1))方法将对PAT节点所要操作(平移,旋转,放缩)的参照点设置为(x1,y1,z1)即将PAT节点的操作转化到自定义坐标系下了。这样,在下次对模型进行平移操作直接使用setPosition(osg::Vec3(x,y,z))方法,其中x,y,z参数填写的就是自定义坐标系下的参数了。

坐标系.jpg

该用户从未签到

发表于 2011-12-8 09:41:10 | 显示全部楼层
之后想实现根据需要及时修改模型在场景中的位置。如果通过设置setPosition方法来实现,则这个平移的坐标是相对于(x0,y0,z0)的相对平移值。
请先解释您这句话的意思,这句话已经错了,所以后面的所有分析都不成立

该用户从未签到

发表于 2011-12-8 11:37:25 | 显示全部楼层
问题补充:
        osgsitionAttitudeTransform类中通过 setPivotPoint()方法可以设置原点,这个原点是不是以后setPosition,setScale,这些的参照原点呢?另外setPivotPoint()的参数是世界坐标还是物体坐标。 谢谢!



pat的整体矩阵计算是:-PivotPoint*scale*rotate*Position(具体可参考PositionAttitudeTransform::computeLocalToWorldMatrix函数),因此,setPivotPoint()实际是物体坐标系内的描述。

该用户从未签到

 楼主| 发表于 2011-12-9 22:26:23 | 显示全部楼层
本帖最后由 knightlixiao 于 2011-12-9 22:27 编辑
array 发表于 2011-12-8 09:41
请先解释您这句话的意思,这句话已经错了,所以后面的所有分析都不成立


这个问题源于我问问题的时候对本意想对问题做简化,没想到错了。
我的实际节点树是:
                               root
                            /           \
                      PAT1          PAT2
                        |                  |
                      PAT11        PAT22
                        |                   |
                      Node1         Node2
                        |                    |
                       模型1          模型2      

之所以要怎么建节点树,是我想通过PAT1节点将模型加到指定的坐标位置PAT->setPosition(x0,y0,z0);而PAT11节点是为了以后通过setPosition()方法修改模型在场景中的位置。(感觉方法比较笨)
这样的情况下,PAT11->setPosition(x,y,z)之后,(x,y,z)是不是应该就是相对于(x0,y0,z0)的相对值了呢?我也做过实验好像是这样的。不知道这样是否正确,谢谢提点!   

该用户从未签到

发表于 2011-12-13 09:50:55 | 显示全部楼层
setPosition设置的永远都是当前坐标系下的绝对坐标,没有相对的概念。请正确判断和理解“当前坐标系”
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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