查看: 2903|回复: 12

求教关于斜投影的问题

[复制链接]

该用户从未签到

发表于 2008-8-27 19:12:11 | 显示全部楼层 |阅读模式
我使用斜投影函数,然后用osgviewer来观察
viewer.getCamera()->setProjectionMatrixAsFrustum(-0.46630,0,-0.34972,0.34972,1,35000);
视点是默认的没有动,应当只看到模型的左边一半,但是为什么整个模型都能看到呢? 仅仅位置有点偏移,
然后又实验了一下
viewer.getCamera()->setProjectionMatrixAsFrustum(-0.46630,0.466300,0,0.34972,1,35000);
第三个 参数修改了一下 ,确实垂直方向 上只能看到上面一半
感到非常困惑,希望能够有人指点迷津!

该用户从未签到

发表于 2008-8-27 20:29:48 | 显示全部楼层
位置偏移就对了,要注意透视投影的特点,只要在视截锥体范围以内的物体都会被看到。所以您的视线是呈四棱锥形状扩展开的,“应当只看到模型的左边一半”这句话并不正确。
如果想实现您所说的效果,可以考虑使用正交投影,但是这并不符合我们用眼睛观察的特点

该用户从未签到

 楼主| 发表于 2008-8-27 22:32:28 | 显示全部楼层
是的,谢谢版主回复,比如说我现在视点在Z轴正方向,往负方向看,同时模型在原点,这个时候我用frustum来截取, left 为 -5 而right 为0 ,这个时候 不应当是 只看到模型的左半部分吗? 而且无论视截锥体远近如何变化,也只能看到模型的左半部分么。 我这里面用osgviewer 来看 自带模型的时候比如cow.osg,这个时候模型在屏幕上是正中间的位置的。然后我取出视点来看 是在原点位置,而参考点也是在z 轴,但是将投影setProjectionMatrixAsFrustum(-0.46630,0,-0.34972,0.34972,1,35000);
的时候却是整个cow 都投在了屏幕上面,我觉得应当是只有左边一半投影到屏幕上啊!

该用户从未签到

 楼主| 发表于 2008-8-27 22:48:57 | 显示全部楼层
说的不形象啊! 1.jpg
这里借用 nate robin的 演示程序截图给老大看看!
就是这样的!
而我这里面程序则是
2.jpg

该用户从未签到

发表于 2008-8-27 23:26:23 | 显示全部楼层
要注意视点的位置,如果你没设置Trackball或者其它的漫游器的话,那么视点的确在原点,指向Z-,但是由于模型也在原点,其实你看到的只会是一片黑。
但恰恰漫游器的作用之一就是按照“囊括场景到视野中”的原则重新设置摄像机的观察矩阵。所以事实上摄像机已经不在原点了,你不妨用getViewMatrix看看它到底在哪儿。
那么为什么能看到模型想必也就不言而喻了吧

该用户从未签到

发表于 2008-8-27 23:58:28 | 显示全部楼层
你可以看看osgwindows这个例子,我觉得可能是你想要的效果。

该用户从未签到

 楼主| 发表于 2008-8-28 12:27:43 | 显示全部楼层
是的看了一下 ,我用的osgviewer ,用的就是getViewMatrix,取出的矩阵是点是改变了,但是观察的时候感觉视点还是没有变化?? 难道 视点设置对 osgviewer不起作用?

该用户从未签到

发表于 2008-8-28 14:18:16 | 显示全部楼层
原帖由 solenduo 于 2008-8-28 12:27 发表
是的看了一下 ,我用的osgviewer ,用的就是getViewMatrix,取出的矩阵是点是改变了,但是观察的时候感觉视点还是没有变化?? 难道 视点设置对 osgviewer不起作用?


getViewMatrix要在仿真循环中才能取到正确的摄像机观察矩阵。要注意TrackBall漫游器所自动设置的摄像机视点并不在Y-轴上(也就是OpenGL的Z轴,注意OSG和OpenGL坐标系差了90度),而是偏向(X+,Y-,Z+)的方向,因此有可能看到位于原点的物体的全貌,参见简陋的附图
example.PNG

该用户从未签到

 楼主| 发表于 2008-8-28 17:00:19 | 显示全部楼层
多谢! 受益多多!

该用户从未签到

发表于 2009-12-2 17:04:53 | 显示全部楼层
顶上来。我遇到了与楼主一样的问题,且没有看懂array的解释。不知楼主懂了没有。
这个问题换句话说就是,多通道的程序,两台机器的frustum设置为bottom、top、zNear、zFar都一样,left和right之间的距离相等,只不过其中一台的right等于另一台的left。那么这两台机器屏幕上的画面应该是可以拼起来的,对吧?
可一运行就是拼不起来。两个屏幕上显示的东西总是有交集。
有趣的是,看了这个帖子之后我也像楼主一样尝试了一下“垂直方向”,即两个屏幕上下拼(一台的bottom等于另一台的top),果然能拼上。但左右就是不行。
同困惑,求助。

该用户从未签到

发表于 2009-12-2 17:12:21 | 显示全部楼层
注意glFrustum是视锥体投影,因此,“left和right之间的距离相等,只不过其中一台的right等于另一台的left。那么这两台机器屏幕上的画面应该是可以拼起来的”,这句话是错的!正确的方法是对各个窗口的投影矩阵乘一个切分矩阵(因而它不再是标准的视锥体了),参看osgcamera例子中的做法

该用户从未签到

发表于 2009-12-3 08:44:44 | 显示全部楼层
多谢版主。回帖很快啊~我这就去看看osgcamera。

该用户从未签到

发表于 2009-12-3 15:24:10 | 显示全部楼层
本帖最后由 KNUP 于 2009-12-3 20:14 编辑

欧啦,解决。谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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