【问题标题】:How to preserve the perception of angle between walls when the camera is rotating in OpenGL?当相机在OpenGL中旋转时,如何保持对墙壁之间角度的感知?
【发布时间】:2012-08-18 02:08:09
【问题描述】:

我正在建造许多不同形状的房间:平行四边形、矩形、菱形、正方形等。观众应该从不同的角度看房间,然后左右转动头,然后猜测它们的形状房间。所以这里“对墙之间角度的感知”非常重要。我的问题是:

1) 大部分锐角从远处看都是90度,

2) 当观众向左或向右转头时,墙壁之间的角度以及墙壁的长度似乎会发生变化。

正如我到目前为止所读到的,这是使用透视投影的结果;但是,如果使用正交投影,我的屏幕将没有深度(没有深度感知),而且由于我在房间内,所以房间的大小应该大于裁剪区域,这会产生非常垃圾的图像。

我只是想知道有什么方法可以避免或至少最小化这种变形效果?我应该建立自己的投影(介于 glortho 和 glprospective 之间)吗?

还值得一提的是,我使用“glutlookatfunction”来定位相机和观察点。眼睛 位置 始终 是 房间 的 一个 角落 , 初始 观察 点 是 观察者 的 对 角 . 通过 按 左右 箭头 键 , 观察 点 在 环绕 房间 的 假想 圆 上 移动 , 就像 OpenGL 的 大部分到目前为止我看到的程序。你认为如果我移动墙上的观察点会更好吗?或者旋转房间而不是改变观察点?

我添加了一些图片以更好地说明我的问题:

这是我的平行四边形房间:

parallelogram.png

正如您在此处看到的,锐角(本应为 60 度)似乎至少为 90 度。这是我的长方形房间,它根本不会让你有置身于长方形房间的感觉:

Rectangle.png

【问题讨论】:

  • most of the cute angels 天哪,你的项目有可爱的天使?
  • 你确定你的投影矩阵考虑了你的显示纵横比吗?你如何构建你的投影矩阵?
  • 是的,伙计,我通过“glutget”函数获取屏幕的宽度和高度并计算纵横比,即1.25,以发送到“gluperspective(90,aspect,1.0,30.0)” .我玩过远投影平面的值,将其从 100.0 降低到 30.0(房间大小为 20 X 10),但我没有看到任何改进。
  • 改变 'z far' 不会对投影矩阵的视场/失真产生影响。
  • 另外,请尝试在您的回复-cmets 中使用@ 作为标题,以通知作者您的回复。

标签: opengl camera


【解决方案1】:

我会说,您的相机 FOV 太大,但没有看到实际问题。

根据您的评论,您的相机有 112.5° 的水平 FOV,我认为这会在屏幕边缘引入“不自然的失真”:简单的 OpenGL 透视投影是线性的,并且 FOV 太宽。

您可能想看看这个article 比较相机和人眼,因为您想判断用户的感知。

您应该尝试减少相机的水平 FOV,可能在 80-90° 范围内,看看是否有帮助。

作为最后的手段,您可以切换到non-linear projections,但在切换到此之前,您应该做出明智的选择,应该有心理物理学研究(例如this)可能对您有所帮助。

【讨论】:

  • @ 感谢您的回复,但不幸的是,我无法通过减少水平 FOV 来实现任何改进。也许我添加到帖子中的图片更好地显示了我的问题。
  • @OmidRanjbar 确实,角度看起来不正确,但我无法说出原因,缺少照明、照明、阴影?别的东西?我必须说我不知道​​什么对角度感知很重要。
  • 我没用灯光,好像是很基础的问题。
猜你喜欢
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多