OpenGL中的坐标是什么(我使用OpenGL ES 2.0 for Android,但我现在大多只想理解这个理论......)3d世界实际上是什么意思?
说我将我的模型矩阵转换为x,y,z模型在哪里?多远,什么是单位?
此外,如果我从顶点缓冲区对象显示点,将每个点定义为具有任意x,y和z的范围(范围为(-∞,∞)),该怎么办?当MVP乘以这个位置时,这意味着什么?
答案 0 :(得分:3)
3D点(x,y,z)实际上在4D中表示为同质点(x,y,z,1)所以我们 可以用4x4矩阵表示所有期望的变换 - 特别是这允许平移和透视投影。
然后使用4x4 模型 - 视图 - 投影(MVP)矩阵转换此点 一个点(x',y',z',w')。
MVP矩阵只是将这三个矩阵相乘,形成复合变换。
对于剪辑坐标中的一个点是可见的,它必须(在投影之后)位于剪裁体积,这是一个轴对齐的立方体,角点位于(-1 ,-1,-1)和(+ 1,+ 1,+ 1)。 通过除以w'来投射点 - 即(x',y',z',w')被映射 to(x'/ w',y'/ w',z'/ w') - 如果这三个值都位于区间[-1,+ 1]中,那么它是可见的,我们说这个点在< em>规范化设备坐标。这种划分允许透视预测在透视投影中发生。
这是有趣的部分,剪辑实际上发生在4D(在此透视分割发生之前)。因此,对于可见的点,x',y',z'的幅度必须小于w'的幅度。如果该点在剪辑中存活,则发生透视分割。
最后,视口转换将幸存点从规范化设备坐标映射到实际设备坐标。这里我们有一个实际的设备坐标(x,y),它是帧缓冲区中的2D地址,z是深度缓冲区范围内的深度值。点然后发送到光栅化器。
总之,OpenGL管道的第一部分是这样的:
建模转换是仿射变换,可以用表格的矩阵表示
_ _
| a b c d |
M = | e f g h |
| i j k l |
| 0 0 0 1 |
- -
点P =(x,y,z,1)实际上被认为是列向量[x y z 1] ^ T和 通过乘以右边P'= M P(至少从概念上来说 - 硬件可以转换为evethying但它仍然是相同的东西)转换为P'。通过仿射变换,我可以缩放,旋转,剪切,平移......保留平行线的任何东西。请注意,M的最后一行是标识 - 这很重要,因为我们不希望M用w坐标进行清理 - 稍后我们将使用投影矩阵。
注意,我们可以通过使用w = 0表示方向向量(例如,表面法线) 有效地忽略了翻译组件。实际上,为了正确地变换表面法线,我们使用相关的法线矩阵,它是M的上3x3矩阵的逆转置:
_ _ ^ -T
| a b c |
N = | e f g |
| i j k |
- -
这保留了法线与各自平面的正交性。
例如,下面是一个矩阵,用s统一缩放一个对象,围绕z轴旋转CCW旋转θ,并将结果转换为(4,5,6):
_ _
| s * cos(theta) -s * sin(theta) 0 4 |
| s * sin(theta) s * cos(theta) 0 5 |
| 0 0 1 6 |
| 0 0 0 1 |
- -
视图变换V是一种刚性变换,它只是一个旋转和平移,它改变坐标,使摄像机位于原点,并“向外看”-z轴。
投影矩阵P是事物变得奇怪的地方 - 至少对于透视投影而言。在这里,我们必须将视图视锥体转换为规范剪切立方体。这不是仿射变换。这是最终乘以1 / w将派上用场的地方。这里使用形式
的矩阵 P = | a 0 0 0 |
| 0 b 0 0 |
| 0 0 c d |
| 0 0 -1 0 |
请注意,最后一行不是标识。点(x,y,z,1)映射到 (a * x,b * y,c * z + d,-z)。之后,在透视师之后你会得到
(-a*x/z, -b*y/z, -(c*z + d)/z)
通过-z看到那个除法 - 这是透视透视的来源。 由于剪切的顶点将具有z < 0,这实际上是一个积极的分裂。
无论如何,我会把故事留在那里......
答案 1 :(得分:2)
当您创建图形世界时,3D,2D - 无关紧要,您需要定义一个与此世界一致的坐标系。你定义它的方式并不重要,只要它是一致的。
这如何适用于OpenGL?
每个3D元素的位置将由其顶点以及您对其进行的任何变换(例如缩放,平移等)定义。例如,如果你渲染一个中心位于{2,3,4}且半径为1的球体,这个信息可以让你知道球体在世界的哪个位置,以及它是否应该被渲染。
在OpenGL中,您可以定义一个摄像头 - 它实际上是用户的视口。该摄像机位于一定位置,指向某个方向,并以一定角度旋转。此外,相机具有投影角度,可以接收通过一定角度看到的视觉信息(在某种意义上,这可以被认为是相机的镜头&#34;)。
一旦所有世界都存在于相同的一致坐标系中,您就可以让相机准确地捕捉在您的世界中漂浮的3D元素,因为位置和位置相同。元素的大小相对于摄像机的位置和属性。