opengl - 如何修复透视投影失真?

标签 opengl matrix graphics perspectivecamera metal

我是图形编程新手。我从来没有意志力坐下来研读任何冗长的 OpenGL 教程,但当 Apple 发布 Metal 时我感到非常兴奋,从那以后我已经取得了很大的进步。我理解所有矩阵数学背后的推理(当然不是它们是如何推导的),但我在预测时遇到了困难。对于正交投影矩阵,没有深度,因此在这种情况下您最好放弃 3D 图形。然而,虽然我的透视投影一开始似乎效果很好,但当我将立方体平移远离投影中心时,我注意到了一些事情:

My cube, centered.

After shifting the cube's position.

现在我可能完全错了,但这种扭曲感觉并不现实。也许在纹理化和更复杂之后它会有意义,但我不确定。在该项目中,我有一个投影矩阵、一个世界 View 矩阵和立方体的模型 View 矩阵。矩阵按以下顺序相乘:prMatrix * (wvMatrix * mvMatrix) * <vertex> 。是否有某种方法可以保持对象的比例,无论它们位于透视截锥体内的哪个位置?

最佳答案

正如 reto koradi 提到的,视野参数非常重要。

如果您将 window 视为您所看到的世界的物理窗口,并将您的眼睛视为观察点,您可以想象出一座金字塔。对于小窗口,如果您距离显示器足够远,金字塔将非常尖:因此视野很小。我想说,当你真正以 20-30 度的角度观看时,你可能会以 90 度或更大的视野进行绘制(因为你的窗口不是全屏而是相当小)。

这会导致严重的失真,如果您确实从近距离观察 window ,则需要这种失真才能看起来正确。

关于opengl - 如何修复透视投影失真?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34626164/

相关文章:

c - OpenGL -- GL_LINE_LOOP --

matrix - crc32_combine() 的矩阵技巧的逆是什么?

c++ - Vulkan Vulkan.hpp 从对象实例中获取对象类型

c# - 如何绘制亚像素线

java - PaintComponent 从未被调用

opengl - 使用 GL_ARB_clear_texture 会引发访问冲突异常

c++ - 更改 OpenGL 的 z 缓冲区的值

c++ - 使用 glutMouseFunc 获取访问冲突读取位置 0x000000b0

algorithm - 如何求解线性矩阵方程 : AX-XA=B efficiently?

R错误: "number of items to replace is not a multiple of replacement length"