我试图在GLSL中使用一个齐次mat4
将由一列vec3
表示的点进行变换。该矩阵是沿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轴平移上没有任何影响。希望我只是忽略了一些显而易见的东西。有什么想法吗?
更新:我进行了更多测试,向量*转置矩阵不会给出与矩阵*向量相同的结果。发生了什么?