查看: 6042|回复: 14

正交投影下漫游器的问题

[复制链接]

该用户从未签到

发表于 2010-6-30 15:50:38 | 显示全部楼层 |阅读模式
在透视投影下,需要更清楚地看清一个物体,那么通常的做法就是将相机走近一些。
在正交投影下,不论相机走近还是走远,物体在屏幕上呈现的大小都是一定的,因此,需要更清楚地看清楚这个物体,能够做的就是增加缩放矩阵,将场景直接放大。

现在存在一个难以解决的问题:
我的场景用户可能会随时切换透视投影和正交投影,当然,切换的过程中,我需要同时将相机漫游器也一并切换过去。
这里说说我的情况吧:
在透视投影下,我的相机张角是30度(makePerspective(30.0f, ...)方式制作的投影矩阵)。在透视投影下,鼠标的滚轮可以随意控制相机视点的位置,实现“走近走远”,走近时,场景在屏幕上的呈现大小就变大了一些。这个没什么问题。

切换到正交投影之后,我仍然需要使用鼠标滚轮来实现类似的功能,当然需要使用缩放阵来解决问题。那么相机每向前走一个单位距离,我需要往缩放阵里面增加多少个单位呢?

该用户从未签到

 楼主| 发表于 2010-6-30 16:02:31 | 显示全部楼层
其实在正交投影下,我滚动鼠标的滚轮,仍然也将相机的视点向前移动了。滚轮每滚动一格,视点向前移动了10个单位。由于是正交投影,视点前后移动根本不会改变场景在屏幕上的呈现大小,此时,我使用如下代码来计算缩放量:
const float flt = cos(30.0 * PI / 180.0f);  // 相机的张角就是30度
const osg::Vec3 vecScale = osg::Vec3(1.0f, 1.0f, 1.0f) * (flt + 1.0f);
若是滚轮向后反向拨动,那么上面的变量flt要加上负号;

为了测试我这种计算方式是否正确,我故意将变量flt的值设反,投影矩阵仍然保持为透视方式。那么此时滚动鼠标滚轮,应该发现场景的缩放正好和走近的效果抵消,场景不动。不过事与愿违,场景每次都被缩小。百思不得其解,望指点。

该用户从未签到

 楼主| 发表于 2010-6-30 16:11:03 | 显示全部楼层
用一个更简化的问题来概括:
现在我的场景处于透视投影,相机张角为30度。
现在相机的位置向前移动了1个单位(相机逼近物体),我需要同时给场景跟节点乘上一个什么样的缩放,才能保证场景在窗口上呈现的大小基本不变?

该用户从未签到

发表于 2010-6-30 16:25:23 | 显示全部楼层
您的缩放矩阵是如何应用到投影矩阵的设置中的?这一点您并没有阐述,注意直接projMat * scaleMat的结果并不是简单的缩放场景——而是需要根据投影矩阵的公式计算得出结论

该用户从未签到

 楼主| 发表于 2010-6-30 16:57:45 | 显示全部楼层
没有将缩放应用到投影矩阵中,计算出来的缩放量,还是乘到模型视图矩阵里面去了

该用户从未签到

发表于 2010-7-1 08:47:16 | 显示全部楼层
那么我想您很难简单地保证“场景的缩放正好和走近的效果抵消”,验证和更改您的算法的方法是:把所有的矩阵级联操作写成计算公式,然后判断如何在模型视点矩阵中改动来迎合投影矩阵的改变值,事实上我个人觉得这不太可能?

该用户从未签到

 楼主| 发表于 2010-7-1 10:12:41 | 显示全部楼层
其实我需要的效果是这样的
1、用户在透视模式下正常漫游
2、用户随时可以通过菜单功能,切换到正交模式下,继续漫游。切换之后,相机视口能够看到的场景范围基本不变。反过来,正交模式下,用户也随时可能切换回透视模式,相机视口能够看到的场景范围也应该基本不变。
3、由于这是一个虚拟城市系统,因此,模型大部分都是PageLOD,也就是说,在正交模式下,仍然需要有效的控制相机的远近,否则PageLOD的调度将失效或者出错。

那么,我需要做的是:
  实现一个正交模式下的漫游器,能够旋转视线、能够前后左右上下平移视点位置。尤其相机视点在前后运动时,需要同时在模型视图矩阵里面增加缩放,否则无论怎么移动视点位置,模型的大小都不会改变(没了近大远小)。
这里我面临的麻烦是:目前是正交模式,我应该如何设置上述的缩放,才能保证当前看到的场景范围,和透视投影基本一致呢?(这里有一点利好:在透视投影下,我绝对不会给模型视图矩阵增加缩放)

该用户从未签到

 楼主| 发表于 2010-7-1 10:12:57 | 显示全部楼层
其实我需要的效果是这样的
1、用户在透视模式下正常漫游
2、用户随时可以通过菜单功能,切换到正交模式下,继续漫游。切换之后,相机视口能够看到的场景范围基本不变。反过来,正交模式下,用户也随时可能切换回透视模式,相机视口能够看到的场景范围也应该基本不变。
3、由于这是一个虚拟城市系统,因此,模型大部分都是PageLOD,也就是说,在正交模式下,仍然需要有效的控制相机的远近,否则PageLOD的调度将失效或者出错。

那么,我需要做的是:
  实现一个正交模式下的漫游器,能够旋转视线、能够前后左右上下平移视点位置。尤其相机视点在前后运动时,需要同时在模型视图矩阵里面增加缩放,否则无论怎么移动视点位置,模型的大小都不会改变(没了近大远小)。
这里我面临的麻烦是:目前是正交模式,我应该如何设置上述的缩放,才能保证当前看到的场景范围,和透视投影基本一致呢?(这里有一点利好:在透视投影下,我绝对不会给模型视图矩阵增加缩放)

该用户从未签到

 楼主| 发表于 2010-7-1 10:15:25 | 显示全部楼层
这个问题要是解决不了,我基本上就无法完成用户的需求。这是一个巨大的需求啊!

该用户从未签到

发表于 2010-7-1 10:35:04 | 显示全部楼层
我应该如何设置上述的缩放,才能保证当前看到的场景范围,和透视投影基本一致呢

唯一的方法是列出矩阵级联的结果公式,然后从中判断是否有完成此要求的可能性;否则您只能另辟蹊径了

该用户从未签到

 楼主| 发表于 2010-7-1 15:44:47 | 显示全部楼层
简直是个灾难!
这种需求乍一看觉得是理所当然的,而且是非常简单的,实际上竟然都存在无法实现的风险。

该用户从未签到

发表于 2010-7-1 17:15:05 | 显示全部楼层
呵呵,事实上我是第一次听说这样的需求~~也许您的设想完全可以用别的方式来解决?

该用户从未签到

发表于 2013-5-9 18:51:39 | 显示全部楼层
有两种方法,第一种方法是放大缩小场景中的对象,还有一种就是对left, right,top,bottom进行缩放

该用户从未签到

发表于 2013-5-10 08:17:30 | 显示全部楼层
这个帖子 真的是好久好久了

该用户从未签到

发表于 2020-8-1 17:54:35 | 显示全部楼层
时隔这么久,  冒昧的问一句, 楼主解决这个问题了吗,  或者说osg现在的版本3.6.0 支持 正交投影下, 视图的缩放操作吗,   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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