OpenGL-ES меняет угол зрения в усечённой области - PullRequest
3 голосов
/ 08 июня 2010

Давайте посмотрим, смогу ли я объяснить себя.

Когда вы настроите представление glFrustum, оно даст эффект перспективы.Близкие вещи рядом и большие ... далекие вещи далеко и маленькие.Все выглядит так, как будто оно сжимается вдоль своей оси Z, чтобы создать этот эффект.

Есть ли способ сделать так, чтобы оно НЕ сильно уменьшалось?Чтобы приблизить перспективный вид к ортографическому виду .... но не так ли много, чтобы полностью потерять перспективу?

Спасибо

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

Угол определяется двумя параметрами: высотой ближайшей плоскости отсечения (определяется параметрами top и bottom) и расстоянием до ближайшей плоскости отсечения (определяется zNearest). Чтобы сделать матрицу перспективы такой, чтобы она не слишком сильно уменьшала изображение, вы можете установить меньшую высоту или дальнейшую ближайшую плоскость отсечения.

1 голос
/ 06 декабря 2011

Дело в том, что нужно понимать, что ортографический вид - это вид с 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);
}
...