3

自分で説明できるか見てみましょう。

glFrustum ビューを設定すると、遠近効果が得られます。近くのもの 近くて大きい... 遠いもの 遠くて小さい。この効果を生み出すために、すべてが Z 軸に沿って収縮しているように見えます。

あまり縮まないようにする方法はありますか?透視図を正射図に近づけるには....しかし、遠近法を完全に失うほどではありませんか?

ありがとう

4

2 に答える 2

2

角度は、2 つのパラメーターによって適合されます。最も近いクリッピング プレーンの高さ (上部パラメーターと下部パラメーターによって決定されます)、および最も近いクリッピング プレーンの距離 (zNearest によって決定されます)。画像を縮小しすぎないように透視マトリックスを作成するには、高さを小さくするか、クリッピング プレーンをさらに近くに設定します。

于 2011-08-04T02:09:40.217 に答える
1

問題は、正射投影ビューとは、FOV がゼロで、カメラ位置が無限遠のビューであることを理解することです。そのため、FOV を減らしてカメラを遠くに移動することで、正投影ビューに近づく方法があります。

theta与えられたFOV 値から近正射投影カメラを計算する次のコードを提案できます。glOrtho個人的なプロジェクトで使用していますが、 andではなくカスタム マトリックス クラスを使用しているglFrustumため、正しくない可能性があります。しかし、それが良い一般的なアイデアを与えることを願っています。

void SetFov(int width, int height, float theta)
{
    float near = -(width + height);
    float far = width + height;

    /* Set the projection matrix */
    if (theta < 1e-4f)
    {
        /* The easy way: purely orthogonal projection. */
        glOrtho(0, width, 0, height, near, far);
        return;
    }

    /* Compute a view that approximates the glOrtho view when theta
     * approaches zero. This view ensures that the z=0 plane fills
     * the screen. */
    float t1 = tanf(theta / 2);
    float t2 = t1 * width / height;
    float dist = width / (2.0f * t1);

    near += dist;
    far += dist;

    if (near <= 0.0f)
    {
        far -= (near - 1.0f);
        near = 1.0f;
    }

    glTranslate3f(-0.5f * width, -0.5f * height, -dist);
    glFrustum(-near * t1, near * t1,  -near * t2, near * t2, near, far);
}
于 2011-12-06T15:31:28.990 に答える