Дело в том, что нужно понимать, что ортографический вид - это вид с FOV, равным нулю, и положением камеры на бесконечности. Таким образом, есть способ приблизиться к орфографическому виду, уменьшив угол обзора и переместив камеру далеко.
Я могу предложить следующий код, который вычисляет почти ортогональную проекционную камеру по заданному значению theta
FOV. Я использую его в личном проекте, хотя он использует собственные классы матрицы, а не glOrtho
и 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);
}