作为我学习的OpenGL我经常绊倒在所谓的眼睛空间坐标。
如果我是正确的,你通常有三个矩阵。 模型矩阵,视图矩阵和投影矩阵。 虽然我不能完全肯定背后的数学是如何工作的,我知道的坐标转换到世界空间,视图空间和屏幕空间。
但如果是眼睛的空间,以及矩阵我需要转换到眼睛的空间?
作为我学习的OpenGL我经常绊倒在所谓的眼睛空间坐标。
如果我是正确的,你通常有三个矩阵。 模型矩阵,视图矩阵和投影矩阵。 虽然我不能完全肯定背后的数学是如何工作的,我知道的坐标转换到世界空间,视图空间和屏幕空间。
但如果是眼睛的空间,以及矩阵我需要转换到眼睛的空间?
也许显示了各个空间之间的关系如下图将帮助:
根据如果你正在使用的固定功能管线(你是,如果你调用glMatrixMode()
例如),或使用着色器,操作是相同的-它只是是否您直接在着色器代码,他们的问题,或OpenGL的管道有助于你的工作。
虽然在固定功能管线方面讨论的事情是厌恶,它使谈话更加简单,所以我会从那里开始。
在传统的OpenGL(即,版本的OpenGL 3.1,或使用兼容性配置文件之前),两个矩阵堆栈被定义: 模型-视图 ,和投影 ,而当一个应用程序在各堆的顶部开始的矩阵是单位矩阵(1.0上对角线,0.0对于所有其他元件)。 如果您在空间坐标绘制,你有效地归一化设备坐标 (国家数据中心),使该片段流出在X,Y和Z的视口转换范围[-1,1]之外的任何顶点(如通过调用设置glViewport()
就是映射的NDC到窗口坐标(当然,视坐标,真的,但最常见的视口和窗口都是一样的大小和位置),以及深度值的深度范围内 (这是[ 0,1]默认情况下)。
现在,在大多数应用中,自行指定了第一次转型是投影变换 ,其中有两个品种:正交和透视投影。 正投影保持角度,并通常在科学和工程应用中使用,因为它不变形的线段的相对长度。 在传统的OpenGL,正投影由任一指定glOrtho
或gluOrtho2D
。 更常用的是透视变换 ,这模仿眼睛的工作原理(即,对象远离眼睛比接近更小),以及由任一指定glFrustum
或gluPerspective
。 为透视投影,它们所限定的视锥 ,其在眼睛的位置,这是在眼坐标指定锚定截头棱锥。 在眼的坐标,“眼睛”是位于原点,并低头-Z轴。 您的近端和远端剪切面被指定为沿-Z轴的距离 。 如果您在眼坐标渲染,近和远剪裁平面之间指定的任何几何形状,和视锥内将不被剔除,而将化身出现在视口中。 这里的一个透视投影的示图,其与图像平面关系 。
映入眼帘的是位于视锥的顶点。
最后转换要讨论的是模型视图变换,这是负责移动坐标系统(而不是对象;多个上,在一个时刻),使得它们的相对位置以及向眼睛和视锥。 常见的造型变换是平移 , 缩放 , 旋转和剪切机 (其中有OpenGL中没有原生支持)。
一般来说,3D模型局部坐标系仿照周围(例如,在中心原点指定球体的坐标)。 造型变换使用,这样当你使您的本地建模对象的“当前”坐标系转换到新的位置,它的定位在正确的地方。
有一个模型之间没有差异的数学变换和观看变换。 这只是一般,造型变换用于特定的模型和控制glPushMatrix()
和glPopMatrix()
操作,其中观看转型通常是先规定,并影响所有后续的建模操作。
现在,如果你这样做是现代的OpenGL(核心配置版本3.1和前锋),你必须做逻辑所有这些操作自己(你可能只能指定一个变换折叠两种模型视图和投影变换成一个单一的矩阵乘法) 。 矩阵通常被指定为着色器uniforms
。 有没有矩阵堆栈,模型 - 视图与投影变换的分离,你需要得到你的数学正确效仿管道。 (顺便说一句,在透视除法和视口转换步骤由OpenGL的执行你的顶点着色器完成后-你不需要做数学题[你可以,除非你不把W 1.0在不伤害任何东西您gl_Position
顶点着色器输出)。
眼睛空间,视图空间和照相机的空间是同一件事的所有同义词:相对于相机的世界。