我正在尝试将由GLSL 中vec3
的同质列表示的点转换。mat4
该矩阵是沿 x 轴简单平移 1。我已尽我所能检查该矩阵确实将它作为这种形式的适当的列主矩阵进入我的着色器:
1 0 0 1
0 1 0 0
0 0 1 0
0 0 0 1
我第一次尝试(matrix * vec4(point, 1)).xyz
,但是我没有在我的场景中看到翻译的效果。在某些时候,出于绝望,我以与我相同的不同方式重新实现了这种转换,并找到了一种可以满足我需求的方式。但是,我不知道为什么只有一个有效:
#version 140
vec3 transformPoint(vec3 point, mat4 matrix)
{
return (matrix * vec4(point, 1)).xyz;
return mat3(matrix[0].xyz, matrix[1].xyz, matrix[2].xyz) * point
+ matrix[3].xyz;
return matrix[0].xyz * point.x
+ matrix[1].xyz * point.y
+ matrix[2].xyz * point.z
+ matrix[3].xyz;
// This works, but is not a full transformation
return point + matrix[3].xyz;
// Only this one works
matrix = transpose(matrix);
return vec3(
dot(matrix[0], vec4(point, 1)),
dot(matrix[1], vec4(point, 1)),
dot(matrix[2], vec4(point, 1)));
}
奇怪的是,如果我使用 Y 平移,则非工作转换会产生影响,但不会对 X 平移产生影响。
我希望我只是忽略了一些明显的东西。有任何想法吗?
更新:
我做了更多的测试,vector * transpose(matrix)
并没有给出与matrix * vector
. 这是怎么回事?