2017-07-17 9 views
1

私は通常のキューブ(-1、-1,1,1,1)と私のカメラマトリックス(ビューと投影)を持っています。 投影行列は透視投影です。 特定のカメラからどの領域が見えるかを見たいと思います。私は錐台のように私の立方体を伸ばして、私は他のカメラからの結果を見ることができるようにしたいことを視覚化する。ワールドコーディネートとして視聴錐体を取得

マイIdear:

はviewProjectionMatrixの逆を取得し、それを私のcubecoordinateを掛け:

glm::vec4 CubeCoordinates[8]{           
    glm::vec4(-1.0f, -1.0f, 1.0f, 1.0f), 
    glm::vec4(-1.0f, 1.0f, 1.0f, 1.0f), 
    glm::vec4(1.0f, 1.0f, 1.0f, 1.0f), 
    glm::vec4(1.0f, -1.0f, 1.0f, 1.0f), 
    glm::vec4(-1.0f, -1.0f, -1.0f, 1.0f), 
    glm::vec4(-1.0f, 1.0f, -1.0f, 1.0f), 
    glm::vec4(1.0f, 1.0f, -1.0f, 1.0f), 
    glm::vec4(1.0f, -1.0f, -1.0f, 1.0f) }; 

glm::mat4 InvertedViewProjectionMatrix = glm::inverse(refCamera.GetViewProjectionMatrix()); 

for (uint32_t i = 0; i < 8; ++i) 
{ 
    CameraEdgesWorldSpace[i] = InvertedViewProjectionMatrix * CubeCoordinates[i]; 
} 

今cubecoordinatesはワールド空間であることと、錐台のようになります。 しかし、アウトカムの座標は間違っています。

viewProjectionMatrixはどこでも好きなので、正しく動作していることを保証できます。

計算が間違っていますか?または私は行列を逆転させるために間違ったコマンドを使用します(私はGLMを初めて使用しています)?

+3

あなたはパースペクティブディバイドがありません。投影(または逆投影)の後、w座標はもはや1になりません。 – BDL

+0

だから私はwで分けなければならない? – Thomas

+0

はい。それでも問題が解決しない場合は、カメラマトリックスの値と除算後の結果ベクトルを示す例を追加してください。 – BDL

答えて

2

投影行列は、アイ座標をクリップ座標にマッピングします。さて、あなたはバックプロジェクションのクリップ座標を持っていません。あなたはNDCしか持っていません。

どのようにNDCからクリップ座標に変換しますか?まあ、ユークリッドの座標よりむしろ均質で作業していることに注意してください(それゆえ、第4次元のw)。同次座標は、非ゼロ定数による乗算に関して不変であるように起こる。つまり、(a, b, c, d)のポイントは、k以外の場合は(k*a, k*b, k*c, k*d)に相当します。

1/wを掛けてクリップ座標からNDCに移動します。これは定数による乗算です!したがって、NDC自体は有効なクリップ座標であるため、バック・プロジェクトを作成できます。

ここで、均質からユークリッド座標に移動するには、常にwで割ります。 OpenGLで通常そうしない理由は、アフィン変換はwに影響しないため、通常は1のままです。しかし、この場合ではなく、投影行列とその逆行列の両方がw座標に影響します。

したがって、コメントでBDLによって指摘されているように、wで除算がありません。目に見える立方体をNDC座標で取り出し、それらを後方変換の連鎖に通し、最後にwで割ってユークリッド座標に移動する必要があります。実際には、wで除算をスキップしても構いません。同種の座標にとどまり、別のカメラからのビューでその座標をレンダリングすることができます。

関連する問題