查看: 2402|回复: 20

各位:请问:getViewMatrixAsLookAt不起作用怎么办

[复制链接]

该用户从未签到

发表于 2012-12-21 15:07:16 | 显示全部楼层 |阅读模式
我在单视图多相机的使用过程中,相机设置getViewMatrixAsLookAt()完全不起作用,即便viewer.setCameraManipulator(NULL)也是一样,这是为什么呢?代码如下:
//创建从属相机
        osg::Camera* cameraClient = new osg::Camera();
        viewer->setCameraManipulator(NULL);
        cameraClient->setViewMatrixAsLookAt(vieweye,viewcenter,viewup);
        cameraClient->setViewport(new osg::Viewport(0,0, 400, 400));
        cameraClient->setGraphicsContext(gc);
        GLenum bufferClient = traits->doubleBuffer ? GL_BACK : GL_FRONT;
        cameraClient->setDrawBuffer(bufferClient);
        cameraClient->setReadBuffer(bufferClient);       
        //添加从属相机
        viewer->addSlave(cameraClient,osg::Matrix::scale(aspectRatio,1.0,1.0),osg::Matrix()) ;

该用户从未签到

 楼主| 发表于 2012-12-21 15:24:33 | 显示全部楼层
另:viewer->setCameraManipulator(NULL)后,鼠标依旧可以操作场景

该用户从未签到

发表于 2012-12-21 15:40:53 | 显示全部楼层
本帖最后由 wanggang8826 于 2012-12-21 15:50 编辑

据说,默认情况下camera是自动计算远近裁剪面的,不知和这是否有关。
你尝试一下
camera->setComputeNearFarMode(osg::CUllSetings:: DO_NOT_COMPUTE_NEAR_FAR);

该用户从未签到

 楼主| 发表于 2012-12-21 15:46:21 | 显示全部楼层
wanggang8826 发表于 2012-12-21 15:40
据说,默认情况下camera是自动计算远近裁剪面的,不知和这是否有关。
你尝试一下
camera->setComputeNear ...

谢谢你的建议,还是不行啊

该用户从未签到

发表于 2012-12-21 15:52:26 | 显示全部楼层
你指的“完全不起作用”是什么状态?

cameraClient->setViewport(new osg::Viewport(0,0, 400, 400));
改成
cameraClient->setViewport(new osg::Viewport(200,200, 400, 400));
没有变化吗?

该用户从未签到

 楼主| 发表于 2012-12-21 15:56:00 | 显示全部楼层
wanggang8826 发表于 2012-12-21 15:52
你指的“完全不起作用”是什么状态?

cameraClient->setViewport(new osg::Viewport(0,0, 400, 400)); ...

视口设置是可以的,但是setViewMatrixAsLookAt()就是相机视点设置没有作用,显示的还是默认的状态

该用户从未签到

发表于 2012-12-21 15:58:47 | 显示全部楼层
把这段代码看明白了,你就知道slaveCamera 怎么使用了
  1. void View::Slave::updateSlaveImplementation(View& view)
  2. {
  3.     if (!view.getCamera()) return;

  4.     if (_camera->getReferenceFrame()==osg::Transform::RELATIVE_RF)
  5.     {
  6.         _camera->setProjectionMatrix(view.getCamera()->getProjectionMatrix() * _projectionOffset);
  7.         _camera->setViewMatrix(view.getCamera()->getViewMatrix() * _viewOffset);
  8.     }

  9.     _camera->inheritCullSettings(*(view.getCamera()), _camera->getInheritanceMask());
  10. }
复制代码

该用户从未签到

发表于 2012-12-21 16:02:53 | 显示全部楼层
你这样试试:
osgGA::TrackballManipulator *tm = new  osgGA::TrackballManipulator;
tm->setAutoComputeHomePosition(false);
viewer->setCameraManipulator(tm);

该用户从未签到

 楼主| 发表于 2012-12-21 16:26:04 | 显示全部楼层
wanggang8826 发表于 2012-12-21 16:02
你这样试试:
osgGA::TrackballManipulator *tm = new  osgGA::TrackballManipulator;
tm->setAutoComput ...

视点移到了加载的模型内部,但是与视点的参数设置还是不符,而且从相机与主相机的显示依旧相同,视点设置还是没有起作用

该用户从未签到

发表于 2012-12-21 16:27:17 | 显示全部楼层
lichen 发表于 2012-12-21 16:26
视点移到了加载的模型内部,但是与视点的参数设置还是不符,而且从相机与主相机的显示依旧相同,视点设置 ...

看那段代码,先弄明白了,OK?

该用户从未签到

发表于 2012-12-21 16:30:25 | 显示全部楼层
lichen 发表于 2012-12-21 16:26
视点移到了加载的模型内部,但是与视点的参数设置还是不符,而且从相机与主相机的显示依旧相同,视点设置 ...

(⊙o⊙)…,好吧,先放着吧。说不定下周一就搞定了

该用户从未签到

 楼主| 发表于 2012-12-21 16:35:18 | 显示全部楼层
liuzhiyu123 发表于 2012-12-21 16:27
看那段代码,先弄明白了,OK?

好吧

该用户从未签到

发表于 2012-12-21 16:42:20 | 显示全部楼层
lichen 发表于 2012-12-21 16:35
好吧

您还没有搞清slaveCamera 看懂那段代码 就行了

该用户从未签到

发表于 2012-12-21 18:50:14 | 显示全部楼层
liuzhuyu123给你解释的那么清楚怎么就不懂。。。起作用的是viewer->addSlave(cameraClient,osg::Matrix::scale(aspectRatio,1.0,1.0),osg::Matrix()) ;更确切的是函数里面的参数2和参数3;
addslave->(cameranode,true)是添加从相机,什么叫“从”,“主”让你往哪看,你就要往哪看,“从”只能相对于“主”

不过我始终觉得如果使用多相机还是不要使用addslave,参数二三比较难设置。。。(个人意见。。)
就定义一个相机节点cameranode,然后根节点->addchild(cameranode);
所以   //添加从属相机
        viewer->addSlave(cameraClient,osg::Matrix::scale(aspectRatio,1.0,1.0),osg::Matrix()) ;
换成root->addchild(cameraClient);你设置的 cameraClient->setViewMatrixAsLookAt(vieweye,viewcenter,viewup);就有用了。。。

该用户从未签到

 楼主| 发表于 2012-12-22 19:43:51 | 显示全部楼层
liuzhiyu123 发表于 2012-12-21 16:42
您还没有搞清slaveCamera 看懂那段代码 就行了

终于明白了,谢谢谢谢!

该用户从未签到

 楼主| 发表于 2012-12-22 21:02:47 | 显示全部楼层
buaahc 发表于 2012-12-21 18:50
liuzhuyu123给你解释的那么清楚怎么就不懂。。。起作用的是viewer->addSlave(cameraClient,osg::Matrix::sc ...

还是用的addSlave,第二三个参数的确不好设置,我用的osg::Matrix::lookAt(lefteye,leftcenter,viewup)来实现相机的反转,但是又想让画面沿y轴翻转180度即投影画面左右颠倒,请问有没有什么好的办法解决呢?

该用户从未签到

发表于 2012-12-23 14:28:47 | 显示全部楼层
调整viewup使其转180度,我不知道您在不会调二三参数的情况下为什么还要用addslave。。。

该用户从未签到

 楼主| 发表于 2012-12-23 17:08:43 | 显示全部楼层
buaahc 发表于 2012-12-23 14:28
调整viewup使其转180度,我不知道您在不会调二三参数的情况下为什么还要用addslave。。。

因为我做的是个漫游,相机的视点是变化的而彼此间的相对位置不变,我觉得采用主从模式好像更好一些,不知道是不是,请指教,对osg我还不是太懂。
另外我说的翻转是指使图像沿竖直的中心轴翻转,实现左右的换位,修改up的值只能实现上下的翻转,请指教。谢谢!
如下图 无标题副本.jpg 左下角的后视镜形成的图像想要左右换位

该用户从未签到

发表于 2012-12-24 07:54:46 | 显示全部楼层
调整纹理坐标啊,slaveCamera HUD 都能实现你要的效果 就是根据主相机实时更新从相机的位置,viewOffset 很好理解

该用户从未签到

 楼主| 发表于 2012-12-24 21:11:10 | 显示全部楼层
liuzhiyu123 发表于 2012-12-24 07:54
调整纹理坐标啊,slaveCamera HUD 都能实现你要的效果 就是根据主相机实时更新从相机的位置,viewOffset 很 ...

这个不是纹理呀,这是相机的投影,我是想让相机看到的内容在成像的时候进行翻转,就像镜子的反射效果一样,请问能不能实现呢

该用户从未签到

发表于 2012-12-25 09:27:53 | 显示全部楼层
谁说是纹理了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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