查看: 3087|回复: 4

请教高手:如何操作Camera的ViewMatrix?

[复制链接]

该用户从未签到

发表于 2009-3-4 20:50:07 | 显示全部楼层 |阅读模式
具体的说就是关于下面几个函数的用法:
setViewMatrixAsLookAt
getViewMatrixAsLookAt
我想知道参数的含义以及具体的用户。如果操作那些矩阵?
比如我想将视点距离模型远一点 如何操作?

在线等回答...

该用户从未签到

发表于 2009-3-4 20:57:15 | 显示全部楼层
建议先参看OpenGL编程指南等书籍,矩阵变换是重中之重,无论OSG编程还是OpenGL编程都离不开它。
简单说来,setViewMatrixAsLookAt设置的是观察矩阵,人眼从eye位置观察center位置,并认为up位置为向上方向;
setProjectionMatrix是设置投影矩阵,即场景是如何投影到摄像机视平面上的;
setViewport则设置视口的大小,事实上也可以理解为一个窗口矩阵WindowMatrix

那么从世界三维坐标 v 转换到窗口坐标 v' 就是
v' = v * ViewMatrix * ProjMatrix * WindowMatrix
后面的级联矩阵就是我们熟悉的MVPW矩阵

该用户从未签到

 楼主| 发表于 2009-3-4 21:19:21 | 显示全部楼层
我先用GetViewMatrixAsLookAt获取了eye后 修改了这个值 再用setViewMatrixAsLookAt设置回去。好像不起作用 因为我再次读取的时候 它还是原来的值.

Vec3f eye,center,up;
pSceneView->getCamera()->getViewMatrixAsLookAt(eye,center,up);       
Vec3f ratVec(10,10,1.0);
eye+=ratVec;       
pSceneView->getCamera()->setViewMatrixAsLookAt(eye,center,up);

Vec3f eye2;
pSceneView->getCamera()->getViewMatrixAsLookAt(eye2,center,up);

可以看到eye2的数据就是我新设置的值。
可是在我刷新Canvas后显示上一点变化都没有 而且当代码再次执行到这里的时候 我发现读出来的数据还是没有修改以前的数据。
是不是setViewMatrixAsLookAt后还有什么操作来让这个设置起作用.

新做OSG 坐标转换的原理倒也明白 可是不知道在OSG里面怎么用.

该用户从未签到

发表于 2009-3-4 21:35:13 | 显示全部楼层
没有什么限制,不过如果您要直接操作摄像机的观察矩阵的话,需要自己重载漫游器或者不使用漫游器。
即:
setCameraManipulator( NULL );
或者
setCameraManipulator( yourManipulator );
还要注意viewer.run()会自动指定一个漫游器,请使用仿真循环以及viewer.frame()

该用户从未签到

 楼主| 发表于 2009-3-4 22:39:29 | 显示全部楼层
非常感谢谢谢 有点眉目了 研究Manipulator去了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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