0

私の単純な WebGL アプリでは、(頂点シェーダーの) gl_position を次のように計算します。

gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);

aVertexPosition には、(ワールド座標の) 頂点位置が含まれます。

aVertexPosition の値 (x、y、z) を取得するために gl_position を使用して逆変換を実行しようとしましたが、このプロセスは少し難しいようです。

アプリで使用したデータと行列:

  • 射影行列:

    [1.0282340049743652, 0,                  0,                    0, 
    0,                   1.5423510074615479, 0,                    0, 
    0,                   0,                  -1.0004000663757324, -1, 
    0,                   0,                  -20.00400161743164,   0] 
    
  • モデル ビュー マトリックス:

    [203830718994,          0.563721776008606,   -0.5349519848823547, 0, 
    -3.6513849721586666e-9, 0.6883545517921448,   0.7253743410110474, 0, 
    0.7771459817886353,     -0.45649290084838867, 0.4331955313682556, 0, 
    -0.00007212938362499699,-1000,                -9290,              1] 
    
  • aVertexPosition: [10.0, 15.0, 72.0]
  • vertex: aVertexPosition の同種バージョン: [10.0, 15.0, 72.0, 1.0]

頂点シェーダーで gl_position を計算するプロセスをシミュレートするために、次のアプローチに従いました。

    mat4.multiply(mvpro, modelViewMatrix,projectionMatrix);
    vec4.transformMat4(vertex, vertex, mvpro);

上記の計算の結果、新しい頂点を取得しました (gl_position の値と同じである必要があります)。

    [-65.04684448242188, 72063.734375, 668851.375, -72 ]

次に、次の逆変換を適用して、元の頂点の座標を取得しました。

    mat4.invert(invMvpro,mvpro);
    vec4.transformMat4(vertex,vertex, invMvpro);

頂点は次のとおりです。

    [10.014994621276855, 14.986272811889648, 72, 1.0005537271499634].

ご覧のとおり、上記の値は元の値 [10、15、72] と比べてわずかにずれています。

すべての計算に glMatrix バージョン 2 を使用しました。

4

0 に答える 0