私の単純な 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 を使用しました。