查看: 2192|回复: 3

追踪球漫游器的问题

[复制链接]

该用户从未签到

发表于 2009-6-9 12:05:52 | 显示全部楼层 |阅读模式
我想自己写一个漫游器  基类是继承系统自带的漫游器  只是有些函数 我在子类中覆盖掉了,在函数handle的FRAME事件中,我利用view获取相机的位置,从而获取获取eye、center、up三个值,但是eye、center值是相同的,不知道为什么,我在另外一个事件处理器中获取这个三个值,eye、center是不同的,不知道这是为什么,望大家指教,谢谢!!!
下面是主要代码:
  case(osgGA::GUIEventAdapter::FRAME):
                if (_thrown)
                {
                        if (calcMovement()) us.requestRedraw();
                }
                if (g_iflag == 1)
                {
                        osg::Vec3 axis;
                        float angle;
                        osg::Camera* camera = view->getCamera();
                        osg::Vec3 eye,center,up;
                        camera->getViewMatrixAsLookAt(eye,center,up);

                        osg::Vec3 tmp = eye - center;//相机的方向


                        axis = g_vcenter ^ tmp;
                        axis.normalize();

                        float t = tmp.normalize() * g_vcenter.normalize();

                        if (t > 1.0) t = 1.0;
                        if (t < -1.0) t = -1.0;
                        angle = acos(t);
                        osg:uat new_rotate;
                        new_rotate.makeRotate(angle,axis);
                        _rotation = _rotation*new_rotate;
               
                        us.requestRedraw();  //重新绘制

                        g_iflag =0;
                }

[ 本帖最后由 zhufu0208 于 2009-6-9 12:09 编辑 ]

该用户从未签到

发表于 2009-6-9 12:55:04 | 显示全部楼层
建议最好是从漫游器的getInverseMatrix()中分解eye,center,up这三个值,因为不能保证当前摄像机就是漫游器控制的相机,以及不能保证上一次漫游器的设置已经正确应用到摄像机上。使用Matrix::getLookAt()就可以

该用户从未签到

 楼主| 发表于 2009-6-9 15:04:43 | 显示全部楼层
在函数handle的FRAME事件中
我是这样写的
osgViewer::view*  view  =  dynamic_cast<osgViewer::view*>(&us);

osg::Camera*  camera = view ->getCamera();

osg::vec3 eye,center,up;
camera>getMatrix->getLookat(eye,center,up);

这样获取的三个值还是相同的

您说的从 getInverseMatrix()中分解eye,center,up这三个值,它的返回值是一个矩阵,麻烦您指教下如何分解这三个值,getInverseMatrix()函数中的代码如下:
return osg::Matrixd::translate(-_center)*osg::Matrixd::rotate(_rotation.inverse())*osg::Matrixd::translate(0.0,0.0,-_distance);
上面只有center的值,不知道是否还要深入的分解,望您指教下,谢谢!!!

该用户从未签到

发表于 2009-6-9 15:23:12 | 显示全部楼层
使用getInverseMatrix().getLookAt()获取数据
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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