2

次の問題に glm 数学ライブラリを使用しています: 2D 画面位置を 3D ワールド空間に変換します。

問題を追跡するために、コードを次のように簡略化しました。

    float screenW = 800.0f;
    float screenH = 600.0f;
    glm::vec4 viewport = glm::vec4(0.0f, 0.0f, screenW, screenH);
    glm::mat4 tmpView(1.0f);
    glm::mat4 tmpProj = glm::perspective( 90.0f, screenW/screenH, 0.1f, 100000.0f);
    glm::vec3 screenPos = glm::vec3(0.0f, 0.0f, 1.0f);
    glm::vec3 worldPos = glm::unProject(screenPos, tmpView, tmpProj, viewport);

この場合、glm::unProject を使用すると、worldPos は (0, 0, 1) になると予想されます。ただし、(127100.12、-95325.094、-95325.094) として送信されます。

glm::unProject がすべきことを誤解していますか? 関数をトレースしたところ、問題なく動作しているようです。

4

1 に答える 1

3

screenPos の Z コンポーネントは、深度バッファーの値に対応します。したがって、0.0f はニア クリップ プレーンで、1.0f はファー クリップ プレーンです。

画面から 1 ユニット離れたワールド位置を見つけたい場合は、ベクトルを再スケーリングできます。

worldPos = worldPos / (worldPos.z * -1.f);

また、screenPos 0,0 は画面の左下隅を指定し、worldPos 0,0 は画面の中心であることにも注意してください。したがって、0,0,1 は -1.3333,-1,-1 になり、400,300,1 は 0,0,-1 になります。

于 2012-01-09T19:23:50.513 に答える