查看: 3961|回复: 8

如何在viewer中使用camera

[复制链接]

该用户从未签到

发表于 2008-6-11 11:26:08 | 显示全部楼层 |阅读模式
我想在osg::viewer中使用camera有两种方法:

(1)使用viewer自带的camera,即viewer.getCamera()

(2)自定义camera

使用第一种方法简单,但如果要控制camera的位置,如何实现?

如果采用第二种方法,要将自定义的camera作为viewer的主摄像机,是不是使用osgViewer::Viewer::setCameraWithFocus(osg::Camera *camera)或osg::View::setCamera(osg::Camera *camera)  ?另外,如何在自定义camera上添加几何体?

我使用setViewMatrixAsLookAt后,camera并没有发生变化,如何控制camera呢,是使用方法(1)还是(2)实现呢?

请给出具体的思路或代码,谢谢!

[ 本帖最后由 vruser 于 2008-6-11 13:03 编辑 ]

该用户从未签到

发表于 2008-6-12 12:45:25 | 显示全部楼层
申请一个osg::Camera对象,再设置camera的参数,这个可以参看osg::Camera类~然后viewer.setCamera()就可以了~~~~~在自定义camera上添加几何体,需要继承osg::NodeCallBack更新回调~~

setViewMatrixAsLookAt肯定是可以的,可能你的代码写得有问题吧~~如果你想写一个漫游的话,就得继承写一个manipulator~~~~~~

该用户从未签到

发表于 2008-6-14 08:29:24 | 显示全部楼层
我也遇到该帖一样的问题,高手们是不是能针对这个问题发个专题啊?

该用户从未签到

发表于 2008-6-30 21:51:52 | 显示全部楼层
您好,这是我根据一个例子修改的:
  1.             AdapterWidget( parent, name, shareWidget, f )
  2.         {
  3.             getCamera()->setViewport(new osg::Viewport(0,0,width(),height()));
  4.             
  5.             //设置投影矩阵
  6.             getCamera()->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(width())/static_cast<double>(height()), 10.0f, 10000.0f);
  7.             
  8.             getCamera()->setGraphicsContext(getGraphicsWindow());   
  9.             
  10.         setThreadingModel(osgViewer::Viewer::SingleThreaded);
  11.             
  12.             //设置视点
  13.             //只有这句是我加的
  14.         getCamera()->setViewMatrixAsLookAt( osg::Vec3(100.0, -20.0, 0.0), osg::Vec3(0.0, 0.0, 0.0), osg::Vec3(1.0, 1.0, 0.0) );
  15.        
  16.             connect(&_timer, SIGNAL(timeout()), this, SLOT(updateGL()));
  17.             _timer.start(10);
  18.         }
复制代码
好像AsLookAt没什么效果。

是不是在执行“updateGL()“时,视点被重新设置过了?
我想修改回调函数,但我怕破坏例子中原有的功能,就是可以用鼠标旋转模型的那个。
谢谢。

[ 本帖最后由 HelloWorld! 于 2008-7-1 11:16 编辑 ]

该用户从未签到

发表于 2008-7-4 17:20:50 | 显示全部楼层
。。。可以自己顶一下吗?

该用户从未签到

发表于 2008-7-4 18:51:11 | 显示全部楼层
在回调函数里调用setViewMatrixAsLookAt试一下,仿真循环没开始之前设置视点矩阵可能是无效的。

抱歉最近很难抽出固定的时间回复问题~~过些日子会好些的。
到时候我再试着写一写有关OSG摄像机的教程吧

该用户从未签到

发表于 2008-7-6 11:27:20 | 显示全部楼层
您好:
我一直是在OSG附带的例子的基础上写程序的,例子中已经有通过鼠标移动视点的功能了,我不想破坏原来的功能。
我在程序中没有找到像是“setUpdateCallback“之类的语句,所以我也不知道例子中的回调函数在哪儿。

该用户从未签到

发表于 2008-7-6 15:20:27 | 显示全部楼层
不必担心破坏什么功能~~开发库存在的目的就是供人使用的。OSG附带的例子也不是什么都好,很多代码的写法都是值得商榷和改良的~~
自己加上回调函数来实验吧,或者也可以尝试在仿真循环中直接添加setViewMatrix的代码,应该不会影响其它线程,虽然还是有程序崩溃的潜在风险

该用户从未签到

发表于 2008-7-7 09:07:00 | 显示全部楼层
谢谢,我这就去崩溃。。。不是,我去实验回调函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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