查看: 1606|回复: 5

顶点变换问题求教

[复制链接]

该用户从未签到

发表于 2011-6-22 13:00:33 | 显示全部楼层 |阅读模式
本帖最后由 oman 于 2011-6-22 13:39 编辑

如果将DraggerTransformCallback中的receive函数中移动部分修改成如下(外部使用使用TabPlaneDragger):
case osgManipulator::MotionCommand::MOVE:
                {
                        // Transform the command's motion matrix into local motion matrix.
                        osg::Matrix localMotionMatrix = _localToWorld * command.getWorldToLocal()
                                * command.getMotionMatrix()
                                * command.getLocalToWorld() * _worldToLocal;

                        // Transform by the localMotionMatrix
                        //_transform->setMatrix(localMotionMatrix * _startMotionMatrix);

                        const osgManipulator::TranslateInPlaneCommand& cmd=static_cast<const osgManipulator::TranslateInPlaneCommand&>(command);
                       
                        const osg::Vec3d& trans=cmd.getTranslation();
                        if (m_vertices.valid())
                        {
                                for( int index=0; index<m_vertices->size(); ++index)
                                {
                                        if (index!= 2)
                                        {
                                                (*(m_vertices.get()))[index]+=trans;
                                               //// (*(m_vertices.get()))[index]=localMotionMatrix.preMult((*(m_vertices.get()))[index]);////也不行
                                        }
                                }
                        }

                        return true;
                }

m_vertices就是构成Dragger的一个多边形平面,目的是在拖动时除一个顶点外其余顶点根据拖动变换其顶点值,而不是移动整个几何体(即拖动操作效果不是修改变换节点的矩阵,而是直接修改变换节点下的几何顶点数据),结果变换的不对,幅度太大,方向也不是沿着这个平面方向,但如果是移动几何体的话(正常给变换节点设置变换矩阵)是正确的(_transform->setMatrix(localMotionMatrix * _startMotionMatrix);),是沿着平面方向移动,而且始终跟随鼠标变化幅度移动。这是什么原因?是哪里有问题,还请明人指点。

该用户从未签到

 楼主| 发表于 2011-6-22 13:13:16 | 显示全部楼层
画图补充说明一下,要实现的效果就是下图2实现的结果,将尖点外的五个顶点数据进行修改,修改后的位置与图1移动操作后位置相同(当然,两者要做相同的移动变换),尖点顶点数据不变。
1.png
2.png

该用户从未签到

发表于 2011-6-22 14:13:58 | 显示全部楼层
这个你可以变通下,既然不能直接这么做,你可以先考虑拆分几何体,然后关联更新回调的方式来实现~~~说实在的,我一般不直接修改任何OSG的源代码,除非非改不可,不然你的程序很难维持更新,功能肯定有很多种变通实现的方法的~~

该用户从未签到

 楼主| 发表于 2011-6-22 14:36:09 | 显示全部楼层
没有修改任何osg代码,我只是为了能够更方便的说明白,跟这问题无关的就简化了,事实是我是在派生的自己的DraggerTransformCallback里做的,没有修改任何osg代码

该用户从未签到

 楼主| 发表于 2011-6-22 14:50:45 | 显示全部楼层
已解决,原因是把变化量累加了

该用户从未签到

发表于 2011-10-23 12:46:07 | 显示全部楼层
Mark一下,学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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