13

私はしばらくの間、錐台面を抽出するグリブ/ハートマン法に取り組んできましたが、ほとんど成功していません。シーンをカリングするためのカメラビュー錐台を構築したいと思います。

私は右手の座標系で列メジャー行列を使用しています。(OpenGLスタイル-私はC#とPlaystation Mobileを使用していますが、計算は同じである必要があります)

飛行機をWorld-Spaceに配置したいので、View-Projection Matrix(つまり、projectionMatrix * viewMatrix)から錐台を構築します。ビューマトリックスは、カメラのワールドトランスフォームの逆です。

問題は; 何を微調整しても、正しい錐台が得られないようです。明らかな何かが欠けているのではないかと思います。

z軸を見下ろしながらカメラを左または右に「ストローフィング」すると、飛行機の法線が変化し、常にシーンの原点を指すようになります。これにより、飛行機は世界空間にないように見えます。 ..。。

4

2 に答える 2

11

射影行列からの平面は、Gribb/Hartmann 法を使用して次のように抽出できます (列優先)。

void extract_planes_from_projmat(
        const float mat[4][4],
        float left[4], float right[4],
        float bottom[4], float top[4],
        float near[4], float far[4])
{
    for (int i = 4; i--; ) left[i]      = mat[i][3] + mat[i][0];
    for (int i = 4; i--; ) right[i]     = mat[i][3] - mat[i][0];
    for (int i = 4; i--; ) bottom[i]    = mat[i][3] + mat[i][1];
    for (int i = 4; i--; ) top[i]       = mat[i][3] - mat[i][1];
    for (int i = 4; i--; ) near[i]      = mat[i][3] + mat[i][2];
    for (int i = 4; i--; ) far[i]       = mat[i][3] - mat[i][2];
}

mat4射影行列とモデル ビュー行列の積はどこにありますか。

見る:

注: マトリックス コンポーネントが正規化されておらず、ヘッセ正規形平面が必要な場合は、結果の平面を正規化する必要があります。

于 2016-01-23T07:38:38.173 に答える