文章目录
坐标空间
模型空间(model space)或 对象空间(object space)或 局部空间(local space)
和某个模型或对象有关
世界空间(world space)
可以用于描述绝对位置。是最宏观的一个空间。
模型变换(model transform)
在模型空间和世界空间中,unity 使用的是左手系。
顶点变换的第一步,就是将顶点坐标从模型空间变换到世界空间中,称为模型变换。
观察空间(view space)或 摄像机空间(camera space)
对于观察空间,unity使用的是右手系。
观察空间可以看作是模型空间的一个特例——该模型为摄像机。
观察变换
顶点变换的第二步,就是将顶点坐标从世界空间变换到观察空间中,称为观察变换。
观察空间投影到屏幕空间
从观察空间(三维)转换到屏幕空间(二维)的操作叫做投影(projection)。
裁剪空间(clip space齐次裁剪空间)或 裁剪矩阵(clip matrix)或 投影矩阵(projection matrix)
裁剪矩阵 / 投影矩阵:观察空间 --> 裁剪空间
视锥体(view frustum)
视锥体由6个平面(称为裁剪平面 clip planes)包围而成。
视锥体有两种类型,涉及两种投影类型:
- 正交投影
平行线会一直保持平行
2D游戏 / 小地图 - 透视投影
近大远小
3D游戏
左图为透视投影,右图为正交投影
左图为透视投影的视锥体,右图为正交投影的视锥体。
近剪裁平面(near clip plane)和远剪裁平面(far clip plane)决定了摄像机可以看的深度范围。
透视摄像机的参数对透视投影视锥体的影响:
正交摄像机的参数对正交投影视锥体的影响:
屏幕空间(screen space)
屏幕空间是一个二维空间,因此,我们必须把顶点从裁剪空间投影到屏幕空间中,来生成对应的2D坐标。这个过程可以理解成有两个步骤。
首先,我们需要进行标准齐次除法(homogeneous division),也被称为透视除法(perspective division)。就是用齐次坐标系的w分量去除以x、y、z分量。在OpenGL中,我们把这一步得到的坐标叫做归一化的设备坐标(Normalized DeviceCoordinates, NDC)。经过这一步,我们可以把坐标从齐次裁剪坐标空间转换到NDC中。经过透视投影变换后的裁剪空间,经过齐次除法后会变换到一个立方体内。
而对于正交投影来说,它的裁剪空间实际已经是一个立方体了,而且由于经过正交投影矩阵变换后的顶点的w分量是1,因此齐次除法并不会对顶点的x、y、z坐标产生影响。
小结
顶点变换的步骤:
- 模型变换:模型空间 --> 世界空间
- 观察变换:世界空间 --> 观察空间
- 裁剪矩阵 / 投影矩阵:观察空间 --> 裁剪空间
- 裁剪空间 --> 屏幕空间
unity只有在观察空间使用了右手系。
法线变换
在游戏中,模型的一个顶点往往会携带额外的信息,而顶点法线就是其中一种信息。当我们变换一个模型的时候,不仅需要变换它的顶点,还需要变换顶点法线,以便在后续处理(如片元着色器)中计算光照等。
一般来说,点和绝大部分方向矢量都可以使用同一个4×4或3×3的变换矩阵M把其从坐标空间A变换到坐标空间B中。但在变换法线的时候,如果使用同一个变换矩阵,可能就无法确保维持法线的垂直性。
切线是由两个顶点之间的差值计算得到的,因此我们可以直接使用用于变换顶点的变换矩阵来变换切线。
即:使用原变换矩阵的逆转置矩阵来变化法线即可得到正确结果。