【发布时间】:2019-07-26 00:26:30
【问题描述】:
我有 fov 角度 = 60,width = 640 和 height = 480 窗口,near = 0.01 和 far = 100 个平面,我使用 glm::perspective() 得到投影矩阵
glm::perspective(glm::radians(fov),
width / height,
zNear,
zFar);
效果很好。
然后我想将投影类型更改为正交,但我不知道如何正确计算glm::ortho() 的输入参数。
我尝试了很多方法,但问题是切换到模型对象的正交投影大小后变成另一个。
让我有一个中心在 (0.5, 0.5, 0.5) 和长度大小为 1 的立方体,mEye 在 (0.5, 0.5, 3),mTarget 在 (0.5, 0.5, 0.5) 和 mUp (0, 1, 0)。查看矩阵为glm::lookAt(mEye, mTarget, mUp)
使用透视投影效果很好。使用glm::ortho(-width, width, -height, height, zNear, zFar),我的立方体变成了窗口中心的一个小像素。
我也试过实现这个变体How to switch between Perspective and Orthographic cameras keeping size of desired object
但结果(几乎)和以前一样。
那么,第一个问题是如何计算正交参数以保存对象的原始视图大小/相机位置?
另外,使用
进行缩放auto distance = glm::length(mTarget - mEye)
mEye = mTarget - glm::normalize(mTarget - mEye) * distance;
对正交没有影响。 那么第二个问题是在正射投影的情况下如何实现缩放?
附: 我假设我正确理解了正交。模型的比例不取决于深度,但我仍然可以决定相机在哪里正确设置模型的大小并使用缩放。此外,我认为这是一项简单而微不足道的任务,例如,在开发 3D 查看器/编辑器/等时。如果不是,请纠正我。
【问题讨论】:
-
“所以,第一个问题是如何计算正交参数以保存对象的原始视图大小/相机位置” - 没有办法。透视投影描述了从针孔相机看到的世界中的 3D 点到视口的 2D 点的映射。正交投影项目平行。所以只能有 1 个平面(深度),其中透视投影与正交投影相匹配。在链接的问题中,switch 实现的 Z 距离正好为 100。
-
“在正射投影的情况下如何实现缩放”改变x和y比例。
标签: c++ opengl glm-math perspectivecamera orthographic