|
楼主 |
发表于 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参数填写的就是自定义坐标系下的参数了。
|
|