查看: 2520|回复: 9

请问,怎么通过漫游器的方式改变摄相机的位置和姿态

[复制链接]

该用户从未签到

发表于 2012-9-25 22:05:54 | 显示全部楼层 |阅读模式
1,我想做一个程序:
在空间中放置一个物体。用osg来模拟相机,把相机放在不同的位置,以不同的姿态(旋转),来拍摄这个物体。
2.我想到的方法是用漫游器来做,这样可能会方便一些,具体是不是,我也不清楚。
漫游器代码
  1. #pragma once
  2. //RTManipulator.h头文件
  3. #include <osgGA/CameraManipulator>

  4. class CRTManipulator : public osgGA::CameraManipulator
  5. {
  6. public:
  7.         CRTManipulator(void);
  8.         ~CRTManipulator(void);
  9. public:
  10.         /** set the position of the matrix manipulator using a 4x4 Matrix.*/
  11.         virtual void setByMatrix(const osg::Matrixd& matrix);

  12.         /** set the position of the matrix manipulator using a 4x4 Matrix.*/
  13.         virtual void setByInverseMatrix(const osg::Matrixd& matrix) { setByMatrix(osg::Matrixd::inverse(matrix)); }

  14.         /** get the position of the manipulator as 4x4 Matrix.*/
  15.         virtual osg::Matrixd getMatrix() const;

  16.         /** get the position of the manipulator as a inverse matrix of the manipulator, typically used as a model view matrix.*/
  17.         virtual osg::Matrixd getInverseMatrix() const;
  18. private:
  19.         osg::Vec3   _center;
  20.         osg::Quat   _rotation;
  21. };
复制代码
  1. #include "RTManipulator.h"

  2. CRTManipulator::CRTManipulator(void)
  3. {
  4.         _center = osg::Vec3(0.0,100.0,0.0);
  5.         _rotation = osg::Quat(0,osg::Vec3(0.0,0.0,1.0));
  6. }

  7. CRTManipulator::~CRTManipulator(void)
  8. {
  9. }

  10. void CRTManipulator::setByMatrix(const osg::Matrixd& matrix)
  11. {
  12.         _center = matrix.getTrans();
  13.         _rotation = matrix.getRotate();
  14. }

  15. osg::Matrixd CRTManipulator::getMatrix() const
  16. {
  17.         return osg::Matrixd::rotate(_rotation)*osg::Matrixd::translate(_center);
  18. }

  19. osg::Matrixd CRTManipulator::getInverseMatrix() const
  20. {
  21.         return osg::Matrixd::translate(-_center)*osg::Matrixd::rotate(_rotation.inverse());
  22. }
复制代码
在主函数里面
  1. viewer->setCameraManipulator(new CRTManipulator());
复制代码
我现在就做了这么多,有两个问题:
1.这么做对不对
2.怎么来改变摄相机的位置和姿态。(假如说我已知了摄相机的旋转和平移矩阵)

该用户从未签到

 楼主| 发表于 2012-9-25 22:06:23 | 显示全部楼层
救我。:'(:'(

该用户从未签到

发表于 2012-9-26 07:56:58 | 显示全部楼层
您的漫游器直接作用的就是MasterCamera和SlaveCamera ,其他相机无法体验,EventHandler或UpdateCallback都可以。

该用户从未签到

 楼主| 发表于 2012-9-26 10:10:13 来自手机 | 显示全部楼层
liuzhiyu123 发表于 2012-9-26 07:56
您的漫游器直接作用的就是MasterCamera和SlaveCamera ,其他相机无法体验,EventHandler或UpdateCallback都 ...

什么意思。能不能说明白一点?

该用户从未签到

发表于 2012-9-27 09:42:08 | 显示全部楼层
您的Manipulator看起来没有太大问题,OSG会自动调用虚函数getInverseMatrix来设置主相机的观察矩阵。那么您现在的问题是什么

该用户从未签到

 楼主| 发表于 2012-9-28 19:41:18 | 显示全部楼层
本帖最后由 lglgaigogo 于 2012-9-28 20:45 编辑
array 发表于 2012-9-27 09:42
您的Manipulator看起来没有太大问题,OSG会自动调用虚函数getInverseMatrix来设置主相机的观察矩阵。那么您 ...


1.我是不是要调用 view->getCameraManipulator()->setByMatrix()来在需要的地放设置摄相机的位置和姿态?
2.如果我还想模拟摄相机的内参,我应该怎么做?是不是调用camera的setProjectionMatrixAsPerspective这个函数?
现在我对viewer、camera的关系还不是很清晰。一个viewer可以有多个camera什么的,比较迷惑。
谢谢array,我在看您的书。

其实,我现在只是想达到
glMatrixMode(GL_MODELVIEW);
        glLoadMatrixd( gl_para );
这样的效果。我应该怎么做。

该用户从未签到

发表于 2012-9-29 07:51:51 | 显示全部楼层
lglgaigogo 发表于 2012-9-28 19:41
1.我是不是要调用 view->getCameraManipulator()->setByMatrix()来在需要的地放设置摄相机的位置和姿态 ...

直接设置camera的viewmatrix和projectionmatrix就可以了

该用户从未签到

 楼主| 发表于 2012-9-29 10:22:52 | 显示全部楼层
liuzhiyu123 发表于 2012-9-29 07:51
直接设置camera的viewmatrix和projectionmatrix就可以了

谢谢先。我去试试。

该用户从未签到

发表于 2012-9-29 20:19:03 | 显示全部楼层
直接使用漫游器里面的handle()函数来改变相机的参数,
当然这些参数要在getiversematrix()中被使用。
array的书有点难度,我感觉现在还不适合你,你先可以看 freesouth的osg程序设计来入门 然后再看array的

该用户从未签到

发表于 2012-9-29 20:20:15 | 显示全部楼层
看了你的回帖强烈建议你先看freesouth的书
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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