列で表されるポイントを GLSLvec3
で同種に変換しようとしています。mat4
行列は、x 軸に沿って 1 だけ単純に平行移動したものです。マトリックスが実際にこの形式の適切な列優先マトリックスとしてシェーダーに作成されることをできる限り確認しました。
1 0 0 1
0 1 0 0
0 0 1 0
0 0 0 1
最初に を試し(matrix * vec4(point, 1)).xyz
ましたが、シーンに変換の効果が見られませんでした。ある時点で、絶望から、私はこの変換を自分と同等と思われるさまざまな方法で再実装し、自分が望んでいたことを行う方法を見つけました。ただし、なぜその1つだけが機能するのかを理解するのに途方に暮れています:
#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
。どうしたの?