正交投影到透视投影的调整计算

3
我想知道如何调整透视投影,使其看起来像正交投影。例如,假设我有一个10x10的点网格,每个点的z值都不同,在正交投影下,所有点都对齐。在透视投影中,它会根据相机和z深度调整位置。我需要做哪些调整才能使每个点看起来仍然对齐,像在一个正交投影中一样?(当然,直到相机移动为止)
我考虑的方法是从眼睛位置计算一条射线通过z平面(如果这是你所说的),在需要出现的点处跟随射线到达所需深度。虽然我不太确定如何实现。
2个回答

0
典型的OpenGL投影矩阵(从glFrustum或gluPerspective获得)将相机点放置在原点。投影平面位于(0, 0, -1):相机前方一单位。
因此,对于给定的顶点,你需要找到的是在(0, 0, -1)平面上投影时的X和Y位置。这在技术上被称为“光线追踪”,但由于它是一个轴对齐的平面,并且相机位于原点,所以实际上只是简单的算术运算。
vec3 newPosition = oldPosition * (-1.0 / oldPosition.z);

请注意,在此透视投影下插值参数将在窗口空间中是线性的,而不是在眼睛/相机空间中。也就是说,将没有透视正确的插值
另外,请注意,上述“简单算术”并没有考虑到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.

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


太好了 - 我会尝试一下。实际上,我正在尝试创建一种幻觉,而不是类似HUD的东西。然后用户可以探索一个看起来像2D的3D空间。 - melps

-1

如果您正在使用OpenGL,您不需要实现/计算任何东西。您需要做的就是使用glOrtho设置您的相机到正交投影,然后设置您的场景(您的3D点网格)。

稍后当相机移动时,您可以捕获此事件并使用glFrustumgluPerspective“重置”相机到透视投影。但请确保您真的想这样做-突然更改投影效果看起来不好。

如果您正在寻找相机投影的数学知识,我建议您查看此链接。

http://www.songho.ca/opengl/gl_projectionmatrix.html


1
那不是他要问的。他想知道如何实现虚假透视。 - Nicol Bolas
那么当他说:“(当然,直到相机移动为止)”时,他的意思是什么? - Srinath Sridhar
摄像机的位置对计算是有影响的,无论它在 CPU 还是 GPU 上运行都无关紧要。他并不是在谈论使用透视矩阵进行渲染,而是在谈论使用正交矩阵渲染出一个看起来像是透视投影的对象。 - Nicol Bolas
实际上我是指相反的情况 - 使用透视矩阵进行渲染,但让它看起来像正交投影。 - melps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接