查看: 3175|回复: 6

设置场景漫游器后能否改变照相机位置?

[复制链接]

该用户从未签到

发表于 2008-8-26 18:05:03 | 显示全部楼层 |阅读模式
我想在调用viewer.setCameraManipulator(new osgGA:riveManipulator);设置漫游器后调用viewer.getCamera()->setViewMatrix(temp1);改变照相机一开始出来的位置,但始终改不了,视点一直停在原来的地方不动。
还有,下面这段代码中,为什么我把
  1. viewer.run()
复制代码
换成
  1. while (!viewer.done())
  2.         viewer.frame();
复制代码
后场景就显示不出来了呢?
  1. int _tmain(int argc, _TCHAR* argv[])
  2. {
  3.         osg::ref_ptr<osg::Group> rootnode = new osg::Group;
  4.         // load the sky dome
  5.         osg::ref_ptr<osg::Node> sky = osgDB::readNodeFile("skydome.osg");

  6.         // load the terrain  
  7.         osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile("lz.osg");

  8.         if (sky.get())
  9.                 rootnode->addChild(sky.get());

  10.         osgViewer::Viewer viewer;

  11.         viewer.getCamera()->setProjectionMatrixAsPerspective(80., 1., 1., 100. );
  12.         // add a viewport to the viewer and attach the scene graph.
  13.         viewer.setSceneData(rootnode.get());
  14.         if (!viewer.getSceneData())
  15.                 return 1;

  16.         const osg::BoundingSphere& boundingSphere=loadedModel->getBound();

  17.         osg::MatrixList MLi=loadedModel->getWorldMatrices();
  18.         osg::Matrix temp1;
  19.         osg::Matrix temp2;
  20.        
  21.         temp1.makeTranslate(boundingSphere._center * MLi[0]);
  22.         while (!viewer.done())
  23.         {
  24.                 viewer.frame();
  25.         }
  26.         return 0;
  27. }
复制代码

该用户从未签到

发表于 2008-8-26 19:36:10 | 显示全部楼层
viewer.run()包括了对漫游器的设置,如果用while循环的话,要自己设置setCameraManipulator,否则一开始视点在原点

还有setViewMatrix要在场景仿真循环(最好是更新回调中)完成;如果在仿真循环开始之前的话,观察矩阵会被漫游器重置

该用户从未签到

 楼主| 发表于 2008-8-27 09:36:15 | 显示全部楼层
原帖由 array 于 2008-8-26 19:36 发表
viewer.run()包括了对漫游器的设置,如果用while循环的话,要自己设置setCameraManipulator,否则一开始视点在原点

还有setViewMatrix要在场景仿真循环(最好是更新回调中)完成;如果在仿真循环开始之前的话,观 ...


就算是在原点也不应该什么都看不到啊;
还有,我把程序改成了下面这样,还是什么都没有啊
  1. temp1.makeTranslate(boundingSphere._center * MLi[0]);
  2.         while (!viewer.done())
  3.         {
  4.                 viewer.getCamera()->setViewMatrix(temp1);
  5.                 viewer.frame();
  6.         }
复制代码

该用户从未签到

发表于 2008-8-27 10:01:31 | 显示全部楼层
先用Trackball漫游器看一看场景是不是加载进来了,然后看一看观察矩阵的设置是否正确。
观察者在原点,而模型也在原点的话,此时看到的恐怕是一片黑,因为被挡住了

该用户从未签到

 楼主| 发表于 2008-8-27 10:12:19 | 显示全部楼层
原帖由 array 于 2008-8-27 10:01 发表
先用Trackball漫游器看一看场景是不是加载进来了,然后看一看观察矩阵的设置是否正确。
观察者在原点,而模型也在原点的话,此时看到的恐怕是一片黑,因为被挡住了

试过了,用Trackball和Drive漫游器的时候都能看见场景,但是一取消漫游器就看不见了。

该用户从未签到

发表于 2008-8-28 00:01:39 | 显示全部楼层
我在加载skydome.osg的时候发现它的位置并不是在原点,我也不知道为什么。所以我就先把它setScale(0.001,0.001,0.001)然后在一边调整它的位置一边把它一点点放大。另外你镜头的方向对么?换一下试试?

该用户从未签到

 楼主| 发表于 2008-8-28 09:27:47 | 显示全部楼层
镜头方向是默认的,应该能看到的,因为我用viewer.run()的时候是可以看到的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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