3

列で表されるポイントを 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。どうしたの?

4

1 に答える 1

1

transformPoint() を呼び出す前に、mat4 変数を初期化する方法に関する追加情報はありません。デフォルトでは、gsl の行列はすべて列優先ですが、渡した行列は行優先である可能性が非常に高いと思います。これは、transpose(matrix) の後にのみ機能する理由を説明しています。

于 2015-03-28T18:40:50.787 に答える