gpt4 book ai didi

opengl - 正交到透视调整计算

转载 作者:行者123 更新时间:2023-12-01 14:59:28 25 4
gpt4 key购买 nike

我想知道如何调整透视投影以使其看起来像正交投影。例如,假设我有一个 10x10 的点网格,每个点都有不同的 z 值,在正交投影下所有点都排列得很好。在透视投影下,它当然会调整相对于相机的位置和 z 深度。我需要对每个点进行哪些调整,看起来好像它仍然排成一行并且在正交投影中? (当然,直到相机移动)。

我正在考虑从眼睛位置通过 z 平面(如果这就是你所说的)在我希望它出现的点计算一条光线,并跟随光线直到要求的深度。虽然我不太确定如何实现这一点。

最佳答案

典型的 OpenGL 投影矩阵(从 glFrustum 或 gluPerspective 得到的)将相机点放在原点。投影平面在(0, 0, -1):相机前一个单位。

因此,对于给定的顶点,您需要找到的是投影到 (0, 0, -1) 平面上的 X 和 Y 位置。这在技术上是“光线追踪”,但由于它是一个轴对齐的平面,并且相机位于原点,所以它实际上只是简单的算术:

vec3 newPosition = oldPosition * (-1.0 / oldPosition.z);

请注意,在此透视投影下的插值参数在窗口 空间中是线性的,而不是眼睛/相机空间。也就是说,不会有perspective correct interpolation。 .

另请注意,上述“简单算术”并未考虑 FOV。要处理这个问题,您需要通过透视矩阵的左上部分来转换 oldPosition 的 X 和 Y。或者只是从投影矩阵中提取 0,0 和 1,1 值并将它们与 oldPosition 的 X 和 Y 相乘。这负责缩放。


请注意,因为您没有说明整体目标。

OpenGL 不要求您使用单个投影矩阵渲染整个场景。您可以正交渲染某些场景,同时对其余场景使用透视矩阵。这通常在游戏中完成,其中 HUD 和文本元素以正交方式呈现,而游戏本身处于 3D 视角。

如果这是您正在做的,您需要做的就是像下面这样的事情:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(...);
glMatrixMode(GL_MODELVIEW);

//Render my perspective stuff here.

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(...);
glMatrixMode(GL_MODELVIEW);

// Render my orthographic stuff here.

如果您的正交对象与透视对象重叠,您可能希望在正交渲染期间关闭深度测试。

关于opengl - 正交到透视调整计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6962992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com