Проекция в OpenGl (ошибка с осью Z)

Я не знаю почему, но кажется, что моя ось z прослушивается (кажется, это удваивает значение или что-то в этом роде)

Это должен быть куб

https://scontent-mad1-1.xx.fbcdn.net/hphotos-xtp1/v/t34.0-12/11998230_879538255460372_61658668_n.jpg?oh=dd08fee0a66e37bf8f3aae2fba107fa1&oe=55F6170C

Однако кажется, что это "больше в глубине", что кажется неправильным

Мой pr_Matrix:

    mat4 mat4::prespective(float fov, float aspectRatio, float near, float far){
        mat4 result;

        float yScale = 1.0f / tan(toRadians(fov/2.0f));
        float xScale = yScale / aspectRatio;

        float frustumLength = far - near;

        result.elements[0 + 0 * 4] = xScale;
        result.elements[1 + 1 * 4] = yScale;
        result.elements[2 + 2 * 4] = -(far + near) / frustumLength;
        result.elements[3 + 2 * 4] = -1.0f;
        result.elements[2 + 3 * 4] = -(2.0f * far * near) / frustumLength;

        return result;
    }

Мой ml_Matrix:

        maths::mat4 &ProjectionMatrix(){

            maths::mat4 m_ProjM = maths::mat4::identity();

            m_ProjM *= maths::mat4::translation(m_Position);

            m_ProjM *= maths::mat4::rotation(m_Rotation.x, maths::vec3(1, 0, 0));
            m_ProjM *= maths::mat4::rotation(m_Rotation.y, maths::vec3(0, 1, 0));
            m_ProjM *= maths::mat4::rotation(m_Rotation.z, maths::vec3(0, 0, 1));

            maths::mat4 scale_matrix = maths::mat4(m_Scale);
            scale_matrix.elements[3 + 3 * 4] = 1.0f;

            m_ProjM *= scale_matrix;
            return m_ProjM;
        }

Мой vw_matrix (камера)

        void update(){
            maths::mat4 newMatrix = maths::mat4::identity();
            newMatrix *= maths::mat4::rotation(m_Pitch, maths::vec3(1, 0, 0));
            newMatrix *= maths::mat4::rotation(m_Yaw, maths::vec3(0, 1, 0));
            newMatrix *= maths::mat4::translation(maths::vec3(-m_Pos.x, -m_Pos.y, -m_Pos.z));
            m_ViewMatrix = newMatrix;
        }

Мое умножение матриц в коде glsl:

vec4 worldPosition = ml_matrix * vec4(position, 1.0);
vec4 positionRelativeToCamera = vw_matrix * worldPosition;
gl_Position = pr_matrix * positionRelativeToCamera;

Редактировать: я думаю, я понял! (Буду перепроверять математику, как только у меня будет время) Большинство уроков (так, источник моего кода) используют mat4::prespective(float fov, float aspectRatio, float near, float far), но они не говорят, что "fov" означает "fovy" (то есть "вертикальное поле зрения"), результаты, похоже, теперь повторяют "обычный fov в играх" с этим простым изменением:

        float xScale = 1.0f / tan(toRadians(fov/2.0f));
        float yScale = xScale * aspectRatio;

Спасибо за то, что указали на это как на проблему от Хена Henk De Boer

2 ответа

Решение

Это просто результат FOV, FOV, который вы предоставляете, сильно меняет внешний вид изображения. Это вопрос личного вкуса, что вы выбираете. Чтобы получить сцену с естественным ощущением, что-то между 45-60 хорошо, но вы можете улучшить это, чтобы сцена выглядела более быстрой или более динамичной. Обратите внимание, что следующее изображение имеет в два раза ту же самую геометрию, но док справа выходит намного дальше в область просмотра с углом обзора 90 градусов.

введите описание изображения здесь

Я предполагаю, что при объявлении:

mat4 result;

Вы вызываете конструктор по умолчанию, который инициализирует матрицу для идентификации.

Затем в последующем коде, который устанавливает матрицу, вам нужно вызвать:

result.elements[3 + 3 * 4] = 0.0f;

Кроме того, для чего это стоит, в моем коде строки:

result.elements[3 + 2 * 4] = -1.0f;
result.elements[2 + 3 * 4] = -(2.0f * far * near) / frustumLength;

Не отрицаются. ТБХ, я не уверен, стоит ли беспокоиться об этом.

Другие вопросы по тегам