由于顶点数据将通过投影矩阵进行变换以获得剪辑坐标。我想知道这两个单位是否相同? 例如,如果我有一个点P(20,20,20),我的剪裁量定义如下:
gluPerspective( 45.0, //The camera angle
( double )w / ( double )h, //The width-to-height ratio
2.0, //The near z clipping coordinate
2000.0 ); //The far z clipping coordinate
如果我认为20英寸,那么2.0和2000.0也必须以英寸为单位吗?它们是相互关联的,还是完全独立的?
谢谢,
答案 0 :(得分:3)
您可能会在此处找到OpenGL Technical FAQ "Transformations" section。
您选择英寸作为基础“世界坐标”单位。您会注意到FAQ定义了“对象坐标”,“眼睛坐标”和“剪辑坐标”。
转换位于它们之间 - 模型视图矩阵从对象转换为眼睛,从眼睛到剪辑的投影矩阵等。
将此视为一系列黑盒子(投影矩阵)很有用,它们采用各种坐标系统,移动/缩放/剪切它们,并吐出一个新的。(/ p>
现在,您可以在概念上将ModelView矩阵黑盒分成两部分:“模型”和“视图”矩阵。 songho.ca OpenGL Tutorials有一个显示此内容的transformation page。
所以你可以看看:
Object coords -> (ModelView matrix) -> Eye coords -> ...
......等同于:
Object coords -> (Model matrix) -> World coords -> (View matrix) -> Eye coords -> ...
这为你提供了这两个盒子之间的“世界坐标”。
请注意,您的“对象坐标”和“世界坐标”通常可能具有相同的单位,但起源不同。
他们可能也有不同的单位。例如,您可以方便地定义标准高度的角色对象,只需在关联的模型矩阵中修改坐标缩放,以制作更高或更笨重的角色对象。 1个物体高度单位可能会扩展为1.2个世界高度单位。
(注意你可以更加细分,有一个“Arm矩阵”从“Arm space”翻译成“Torso space”,一个“Torso矩阵”从那里转到“Object space”等)
通常只有相机定位和定位 - 即翻译和旋转。如果是这种情况,“世界空间”和“眼睛空间”也将共享单位。
通过这个迂回过程,我们现在看到我们的“世界空间”和我们的“眼睛空间”,以及我们的许多“物体空间”,都在你选择的单位:英寸。
gluPerspective
总是根据“与观众的距离”(也就是与眼睛的距离)来指定近距离和远距离平面 - 请参阅its manual page。
暗示距离在眼睛坐标空间;我们知道它们显示的矩阵从眼睛空间变换到剪辑空间,并且根据矩阵的构造方式,很明显zNear和zFar等将在眼睛空间单元中。
zNear
和zFar
之间的关系对于透视划分非常重要。除其他外,这导致more depth precision at the front of the view volume。
当然,他们也会定义你将要渲染的最近和最远的东西。
如果您查看上述手册页中有关投影矩阵的构造方式,并且您对IEEE-754浮点数的行为有所了解,如果将zNear设置得太近,则可以推断一些有趣的行为,或者你的zFar太远或太高了zNear等的倍数
(顺便说一下,我强烈推荐Essential Math for Games and Interactive Applications book这里。另外,如果你想让自己的思绪有点夸张,那么GDC2007的一个有趣的小演示题目是"Projection Matrix Tricks" (pdf)。)
答案 1 :(得分:2)
是的,它们是相关的,两者共享相同的距离,但是(20,20,20)是距离世界中心点的距离,而gluPerspective中的值是指距相机的距离。 如果我错过了解你的问题,请不要让我。