OpenGL-ES меняет угол зрения в усеченной пирамиде

Посмотрим, смогу ли я объяснить себя.

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

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

Спасибо


person Frank Bapple    schedule 08.06.2010    source источник


Ответы (2)


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

person Julián Muriel Tejo Rodríguez    schedule 04.08.2011

Суть в том, чтобы понимать, что ортогональный вид — это вид с нулевым FOV и положением камеры на бесконечности. Таким образом, есть способ приблизиться к ортогональному виду, уменьшив 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);
}
person sam hocevar    schedule 06.12.2011