我正在尝试理解视图矩阵。我正在使用顶点着色器来直接操作视图矩阵值。我对视图矩阵似乎所在的坐标系感到困惑。
#version 450
layout(location = 0) out vec4 outColor;
layout (push_constant) uniform PushConstants {
mat4 proj;
} pc;
const vec2 kGeometry[] = vec2[](
vec2(-1, -1), vec2(1, -1), vec2(1, 1),
vec2(1,1), vec2(-1, 1), vec2(-1, -1)
);
const vec4 kColor[] = vec4[](
vec4(1, 0, 0, 1), vec4(0, 1, 0, 1), vec4(0, 0, 1, 1),
vec4(1, 0, 1, 1), vec4(1, 1, 0, 1), vec4(0, 1, 1, 1)
);
void main() {
vec2 p = kGeometry[gl_VertexIndex];
outColor = kColor[gl_VertexIndex];
mat4 view = mat4(1);
view[3].z = -3; // !!! Translate camera on Z. Expected +3, not -3 to see quad.
gl_Position = pc.proj * view * vec4(p, 0, 1);
}
我会参考这些图表:
绘制的四边形,视图矩阵位于 (0, 0, -3):
A) 我希望模型顶点和视图矩阵都位于图 #1 (D1) 所示的右手坐标系中。这是一个右手坐标系,+Y 指向下方,并且 +Z 进入屏幕。
B) D2 在屏幕上显示一个四边形,中心位于 (0,0,0)。我希望相机指向-Z;这是通过眼睛显示的。
C) D3 显示了如果我将 -Z 上的视图矩阵平移 3,使其在 (0,0,-3) 处结束,我预计会发生什么。我希望四边形位于相机后面,因此不可见。然而,将相机定位在这个位置确实显示了四边形。
D) D4 显示了视图矩阵实际所在的坐标系。相机看起来看起来像+Z。
E) D5 显示如果我将视图矩阵转换为 (2, 3, -5) 会发生什么。四边形出现在窗口的右下角。相机似乎在俯视+Z。
F) D6 显示如果我
inverse(viewMat)
会发生什么。在这里,我将视图矩阵定位在 (2, 3, 5)。四边形出现在左上角。相机似乎是向下看 -Z 轴,但坐标系似乎是左手的。
我认为模型顶点被转换为 RH 坐标系,如 D1。但是,当我翻译视图矩阵时,结果不是我预期的那样。
我不是100%确定视图矩阵在什么坐标系中,我也不明白为什么它不是RH,就像D1一样。
默认情况下,对于 Vulkan,顶点着色器的输出剪辑空间坐标在 XY 中为 -1 到 1,在 Z 中为 0 到 1。与 OpenGL 相比,Y 原点翻转(左上角,Y 指向下方)。
从对象坐标到剪辑空间的坐标系完全取决于您——它完全取决于应用程序,而不是 API 强制要求的。你只需要确保矩阵和模型彼此一致......