查看: 1361|回复: 3

扩展TrackballManipulator的关键步骤出 问题

[复制链接]

该用户从未签到

发表于 2011-11-22 10:46:50 | 显示全部楼层 |阅读模式
这个是从书中TrackballManipulator扩展的,setByMatrix很重要,用来直接设置漫游器的相机矩阵,这是原书代码中没有实现的,自己写了,发现有问题,m_vRotation的三个值好像不是对应于heading, pitch, roll的,有人解决过吗?或者有更好的实现方法?比如把m_vRotation这个旋转三角度直接用矩阵替换的?


// 直接设置相机观察矩阵  的逆矩阵
void osgGA::WalkTravelManipulator::setByMatrix(const osg::Matrix &matrix)  
{  
        m_vPosition = matrix.getTrans();
        osg:uat qut= matrix.getRotate();
       

        double heading, pitch, roll;

        QuatToHPR(qut,heading, pitch, roll);

        /*osg::Matrixd mat;  
        mat=Matrixd::rotate( qut );
        */
        //qut.normalize();

        m_vRotation.x()=pitch;
        m_vRotation.y()=roll;
        m_vRotation.z()=heading;
}  

//四元数转化为欧拉角
void osgGA::WalkTravelManipulator::QuatToHPR(const osg::Quat& q, double& heading, double& pitch, double& roll)
{
        osg::Vec3d Y1 = q * osg::Vec3d(0.0,1.0,0.0);

        // 方向向量垂直,属于gambal lock,约定此时roll=0.0
        if(Y1.z()>0.9999)
        {
                heading = 2.0 * atan2(q.z(), q.w());
                pitch = osg:I_2;
                roll = 0.0;
                return;
        }
        if(Y1.z()<-0.9999)
        {
                heading = 2.0 * atan2(q.z(), q.w());
                pitch = -osg::PI_2;
                roll = 0.0;
                return;
        }

        heading = atan2(-Y1.x(),Y1.y());                  // 和Y轴夹角,所以是atan2(-x,y)
        pitch = asin(Y1.z());

        osg::Vec3d X1 = q * osg::Vec3d(1.0,0.0,0.0);
        osg::Vec3d X2 = osg::Vec3d(Y1.y(),-Y1.x(),0.0);

        osg::Quat temp;
        temp.makeRotate(X2,X1);
        double sinhalfangle = sqrt( temp.x() * temp.x() + temp.y() * temp.y() + temp.z() * temp.z() );
        roll = 2.0 * atan2( sinhalfangle, temp.w() );
}

该用户从未签到

 楼主| 发表于 2011-11-22 11:03:12 | 显示全部楼层
写错了,应该是TravelManipulator

该用户从未签到

发表于 2011-11-23 13:38:37 | 显示全部楼层
我不知道您说的TravelManipulator是什么,它如何实现我也无从得知

该用户从未签到

发表于 2011-11-25 15:39:42 | 显示全部楼层
好的方法你可以参考TrackballManipulator,旋转使用四元数表示,加上一个position即可实现摄影机的定位。在setMatrix时可按TrackballManipulator中的setMaxtrix来做(TrackballManipulator中的distance考虑为0)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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