我对opengl中对象的位置感到困惑。眼睛位置是0,0,0,投影平面是z = -1。此时,物体是否位于眼睛位置和平面之间(Z =(0到-1))?或者它在投影平面后面?如果有任何特殊原因,也可以这样做吗?
答案 0 :(得分:1)
首先,现代OpenGL没有眼光。也没有相机。没有投影平面。你自己定义这些概念;图形库没有给你。您的工作是将对象从坐标系转换为顶点着色器中的剪辑空间。
我认为你在考虑投射错误。投影不会以与平移或旋转矩阵相同的方式移动对象。如果你看一下上面的链接,你可以看到为了渲染透视投影,你用R = V(ez / pz)计算投影坐标的x和y分量,其中ez是深度投影平面,pz是对象的深度,V是坐标向量,R是投影。几乎总是你会使用ez = 1,这使得该等式成为R = V / pz,允许你将pz放在w坐标中,允许OpenGL进行"透视除法"为了你。假设你的眼睛和平面在正确的位置,投影坐标几乎就像划分z坐标一样简单。您的物体可以位于3D空间的任何位置(甚至在眼睛后面),只要您不将0除以或使用于深度测试的z坐标无效,您就可以将它们投影到您的平面上。
答案 1 :(得分:0)
没有"投影平面"在z = -1。我不知道你从哪里得到这个。经典的GL透视矩阵假设一个眼睛空间,摄像机位于原点并朝-z方向看。
然而,在z <0处存在近平面并且近平面前方的东西将被剪切。你不能把近平面放在z = 0,因为那样,当你试图在那个平面上投射点时,你最终会得到除零。因此,有一个观点是,观看体积不是金字塔,它们的眼睛指向顶部,而金字塔视锥体。
这是顺便说一句。现实世界的眼睛或相机也是如此。投影中心位于镜头后面,因此在任何一种情况下,任何物体都不能无限地靠近光学中心。
你希望大接近裁剪距离的另一个原因是深度缓冲区的精度。前面和近面之间的整个深度范围必须通过有限的位数(通常为24)映射到某个深度值。因此,您希望保持远平面尽可能接近,并远离近平面。尽可能。屏幕空间z坐标的非线性映射使得这更加重要,因为精度在该范围内非均匀分布。