自分で説明できるか見てみましょう。
glFrustum ビューを設定すると、遠近効果が得られます。近くのもの 近くて大きい... 遠いもの 遠くて小さい。この効果を生み出すために、すべてが Z 軸に沿って収縮しているように見えます。
あまり縮まないようにする方法はありますか?透視図を正射図に近づけるには....しかし、遠近法を完全に失うほどではありませんか?
ありがとう
角度は、2 つのパラメーターによって適合されます。最も近いクリッピング プレーンの高さ (上部パラメーターと下部パラメーターによって決定されます)、および最も近いクリッピング プレーンの距離 (zNearest によって決定されます)。画像を縮小しすぎないように透視マトリックスを作成するには、高さを小さくするか、クリッピング プレーンをさらに近くに設定します。
問題は、正射投影ビューとは、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);
}