查看: 1225|回复: 3

漫游过程控制镜头旋转问题

[复制链接]

该用户从未签到

发表于 2014-4-1 09:33:43 | 显示全部楼层 |阅读模式
为了实现在漫游过程中自己控制镜头,我做了以下几个事情:
1、在AnimationPathManipulator中添加了两个变量:
osg::Vec3f _vRotation; //旋转
float _fAngle; //角度

2、在handle函数中定义了左右键的操作:
else if (ea.getKey() == '37')//left arrow
                        {
                                _fAngle -= 0.2;
                                _vRotation._v[2] -= osg:egreesToRadians(_fAngle);
                        }

3、重载了getInverseMatrix函数:
osg::Matrixd AnimationPathManipulator::getInverseMatrix() const
{
        osg::Matrixd mat = _matrix;
        mat.makeRotate(_vRotation._v[0], osg::Vec3f(1.0f, 0.0f, 0.0f),
                           _vRotation._v[1], osg::Vec3f(0.0f, 1.0f, 0.0f),
                           _vRotation._v[2], osg::Vec3f(0.0f, 0.0f, 1.0f));

        return osg::Matrixd::inverse(mat);
}

现在问题是:_vRotation的初始值设置成多少才能保证镜头默认情况下不发生旋转,我简单的认为设置成(0,0,0),发现镜头被大尺度不知道反转到哪里去了,也可能是我本身的思路有问题,因为没太搞明白矩阵旋转。有点儿着急,什么先去弄明白四元数之类的就不要建议了,希望哪位熟悉这部分的能够点出问题,我尽快改正,在线等。
非常谢谢!

该用户从未签到

 楼主| 发表于 2014-4-1 09:40:32 | 显示全部楼层
应该是我把makerotate理解错了,看到另一个帖子里array说makerotate(v1, v2)其意义是求取向量v1旋转到向量v2的旋转值,但是这里的变量怎样设置我不太明白,初始状态makerotate的两个向量应该都是镜头的朝向向量且相等表示不旋转,根据左右键去操作修改第二个值实现旋转。我如何得到当前镜头的朝向向量呢?

该用户从未签到

发表于 2014-4-1 10:54:46 | 显示全部楼层
1. makerotate是多态的,这里的用法是依次绕三个轴旋转一定角度,其实就是我们熟知的欧拉角。
2. 你这里的_vRotation._v[0]应该是俯仰角。因为俯仰角默认是朝下的,你想平视就设成osg:I_2。
_vRotation._v[1]应该是翻滚角。很少用到。
_vRotation._v[2]应该是偏航角。说白了就是左右看。

3.事件响应时,很少三个角一起变化,一般只俯仰或左右,自己做好判断,还有限制幅度和步长。

该用户从未签到

发表于 2014-4-1 10:59:00 | 显示全部楼层
还有一个书写可以简化_vRotation[0]或者_vRotation.x()
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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