查看: 1678|回复: 10

新人求助 操作器:旋转有问题

[复制链接]

该用户从未签到

发表于 2012-10-11 10:05:36 | 显示全部楼层 |阅读模式
自定义的一个操作器
osg::Matrixd CMyCamera::getInverseMatrix(void) const
{
        return osg::Matrixd::translate( -m_vPosition ) * osg::Matrixd::rotate( m_rotation.inverse());
}
osg::Matrixd CMyCamera::getMatrix(void) const
{
        return osg::Matrixd::translate( 0., 0., 0. )*osg::Matrixd::rotate( m_rotation ) *osg::Matrixd::translate( m_vPosition );
}

当我按下 up时
if (ea.getKey() == 0xFF52)//up
{
        m_rotation = osg:uat(osg:egreesToRadians(1.0), osg::Vec3(0,1,0))*m_rotation;
        return true;
}
按下 right 时
if (ea.getKey() == 0xFF53)//Right
{
        m_rotation = osg::Quat(osg::DegreesToRadians(1.0), osg::Vec3(1,0,0))*m_rotation;
        return true;
}
本意是想将摄像机像屏幕的X,Y轴旋转,可是现在的效果是平移了,而不是旋转.....
求助啊  

该用户从未签到

 楼主| 发表于 2012-10-11 10:23:00 | 显示全部楼层
bool CMyCamera::handleKeyDown( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us )
{
        if (ea.getKey() == 0x20)//' '空格
        {
                us.requestRedraw();
                us.requestContinuousUpdate(false);
                return true;
        }
        if (ea.getKey() == 0x2B)//+
        { return true; }
        if (ea.getKey() == 0x2D)//-
        {
                return true;
        }
        if (ea.getKey() == 0xFF52)//up  应该旋转但是不旋转  是不是不是这么做啊  新人求教啊哥哥姐姐们
        {
                m_rotation = osg:uat(osg:egreesToRadians(1.0), osg::Vec3(0,1,0))*m_rotation;
                return true;
        }
        if (ea.getKey() == 0xFF54)//down
        {
                m_rotation = osg::Quat(osg::DegreesToRadians(-1.0), osg::Vec3(0,1,0))*m_rotation;
                return true;
        }
        if (ea.getKey() == 0xFF53)//Right
        {
                m_rotation = osg::Quat(osg::DegreesToRadians(1.0), osg::Vec3(1,0,0))*m_rotation;
                return true;
        }
        if (ea.getKey()== 0xFF51)//Left
        {
                m_rotation = osg::Quat(osg::DegreesToRadians(-1.0), osg::Vec3(1,0,0))*m_rotation;
                return true;
        }
        if (ea.getKey () == 0x4A || ea.getKey () == 0x6A )//j
        {
                m_rotation = osg::Quat(osg::DegreesToRadians(1.0), osg::Vec3(0,0,1))*m_rotation;
                return true;
        }
        if (ea.getKey () == 0x4B || ea.getKey () == 0x6B )//k
        {
                m_rotation = osg::Quat(osg::DegreesToRadians(-1.0), osg::Vec3(0,0,1))*m_rotation;
                return true;
        }
        if (ea.getKey () == 0x41||ea.getKey () == 0x61) //a
        {
                osg::Matrix rotation_matrix;
                rotation_matrix.makeRotate( m_rotation );
                osg::Vec3d dv( 100, 0, 0 );
                m_vPosition += dv * rotation_matrix;
                return true;
        }
        if (ea.getKey () == 0x44||ea.getKey () == 0x64)//d
        {
                osg::Matrix rotation_matrix;
                rotation_matrix.makeRotate( m_rotation );
                osg::Vec3d dv( -100, 0, 0 );
                m_vPosition += dv * rotation_matrix;
                return true;
        }
        if (ea.getKey () == 0x57 || ea.getKey () == 0x77 )//w
        {
                osg::Matrix rotation_matrix;
                rotation_matrix.makeRotate( m_rotation );
                osg::Vec3d dv( 0, 0, 100 );
                m_vPosition += dv * rotation_matrix;
                return true;
        }
        if (ea.getKey () == 0x53 || ea.getKey () == 0x73 )//s
        {
                osg::Matrix rotation_matrix;
                rotation_matrix.makeRotate( m_rotation );
                osg::Vec3d dv( 0, 0, -100 );
                m_vPosition += dv * rotation_matrix;
                return true;
        }
        if (ea.getKey() == 0xFF50)//home
        {
                m_vPosition += osg::Vec3(0,-100,0);
                return true;
        }
        if (ea.getKey() == 0xFF57) //end
        {
                m_vPosition += osg::Vec3(0,100,0);
                return true;
        }
        if (ea.getKey() == 0x46 || ea.getKey() == 0x66)//F
        {
               
                return true ;
        }
        if (ea.getKey() == 0x47 || ea.getKey() == 0x67)//G
        {
               
                //m_vPosition += osg::Vec3(0,1500,0);
                osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&us);
                osg::Vec3 centerPos = viewer->getSceneData()->getBound().center();
                m_vPosition;
                osg::Vec3 fangxiang = m_vPosition - centerPos;

                m_vPosition += fangxiang*0.1;
                return true ;
        }
        if (ea.getKey() == 0x5A || ea.getKey () == 0x7A) //z  测试
        {
                osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&us);
                osg::Vec3 centerPos = viewer->getSceneData()->getBound().center();
                m_vPosition;
                osg::Vec3 fangxiang = m_vPosition - centerPos;

                m_vPosition += (-fangxiang)*0.1;
                return true;
        }
        if (ea.getKey() == 0x58 || ea.getKey () == 0x78) //x  测试
        {
               
                return true;
        }
        if (ea.getKey() == 0x43 || ea.getKey () == 0x63) //c  测试
        {
               
                return true;
        }
        return false;
}

该用户从未签到

发表于 2012-10-11 10:31:10 | 显示全部楼层
OSG内部会自动调用getInverseMatrix()来得到观察矩阵并设置给主相机,您的getInverseMatrix和getMatrix的计算过程好像不太一致?

该用户从未签到

 楼主| 发表于 2012-10-11 10:36:28 | 显示全部楼层
array 发表于 2012-10-11 10:31
OSG内部会自动调用getInverseMatrix()来得到观察矩阵并设置给主相机,您的getInverseMatrix和getMatrix的计 ...

是一致的吧 加个0,0,0是不影响的恩. 现在的效果是按下上下左右 不是旋转....  怎么办啊 这种getInverseMatrix和getMatrix  应该怎么去旋转呢?

该用户从未签到

 楼主| 发表于 2012-10-11 10:58:49 | 显示全部楼层
bnysyuqian 发表于 2012-10-11 10:36
是一致的吧 加个0,0,0是不影响的恩. 现在的效果是按下上下左右 不是旋转....  怎么办啊 这种getInverseMa ...

或者有没有一种比较简单的操作器,上下控制抬头低头, 左右控制左转右转类似的 CSouth中virtual void setByMatrix(const osg::Matrixd& matrix);virtual void setByInverseMatrix(const osg::Matrixd& matrix);没有实现切换操作器的时候就不知道飞到哪里去了...

该用户从未签到

发表于 2012-10-11 11:15:29 | 显示全部楼层
注意漫游器控制的总是您的视点和视角,而非您看到的物体,所以不排除您的确是旋转了,但是因为没有旋转轴的关系,您实际上绕场景原点转动的。如果您观察的物体距离原点很远的话,也许您看到的就是仿佛上下移动一样了

该用户从未签到

 楼主| 发表于 2012-10-11 11:32:07 | 显示全部楼层
array 发表于 2012-10-11 11:15
注意漫游器控制的总是您的视点和视角,而非您看到的物体,所以不排除您的确是旋转了,但是因为没有旋转轴的 ...

是这样的,那么怎么指定旋转轴呢?非常感谢

该用户从未签到

发表于 2012-10-11 14:09:55 | 显示全部楼层
对于矩阵运算而言,这是一个纯粹的数学问题了。一般来说就是translate(-P) * R * translate(P),不过您还是先斟酌一下这是否就是自己的需求吧

该用户从未签到

 楼主| 发表于 2012-10-11 15:59:07 | 显示全部楼层
array 发表于 2012-10-11 14:09
对于矩阵运算而言,这是一个纯粹的数学问题了。一般来说就是translate(-P) * R * translate(P),不过您还是 ...

非常感谢

该用户从未签到

发表于 2012-10-11 21:46:06 | 显示全部楼层
学习了!

该用户从未签到

发表于 2012-10-12 07:58:48 | 显示全部楼层
根据 setTransformation 设置也是可以的 如果不明白漫游器里面的参数,这个函数更直接一点
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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