В чем проблема с моей проекционной матрицей, из-за которой куб полностью исчезает? - PullRequest
1 голос
/ 04 июля 2019

Я следил за серией учебников по Game Engine, которую курировал YouTuber 'thebennybox', и столкнулся с проблемой. Предполагается, что кубовая сетка должна отображаться на экране, и в этом конкретном эпизоде ​​цель состоит в том, чтобы исправить растяжение объекта из-за нечетких пропорций. Однако, когда я попытался реализовать тот же код, куб разгоняется целиком. Я просматривал материал несколько раз, так что проблемы в других частях кода, или я еще не заметил свою ошибку в репликации кода [из этого видео: https://youtu.be/cgaixZEaDCg].

Код перед реализацией матрицы:

public void render() 
{
    shader.bind();
    shader.setUniform("transform", transform.getTransformation());
    mesh.draw();
}

и после:

public void render() 
{
    shader.bind();
    shader.setUniform("transform", transform.getProjectedTransformation());
    mesh.draw();
} 

Эта новая процедура преобразования "getPerspectiveTransformation ()" выглядит так это:

public Matrix4f getProjectedTransformation()
{
    Matrix4f transformationMatrix = getTransformation();
    Matrix4f projectionMatrix = new Matrix4f().initProjection(fov, width, height, zNear, zFar);

    return projectionMatrix.mul(transformationMatrix);
}

И впоследствии вызывает 'MatProjection' для Matrix4f, а также обычную процедуру 'getTransformation', которая, как я знаю, работает в одиночку:

public Matrix4f initProjection(float fov, float width, float height, float zNear, float zFar)
{
    float ar = width/height;
    float tanHalfFOV = (float)Math.tan(Math.toRadians(fov / 2));
    float zRange = zNear - zFar;

    m[0][0] = 1.0f / (tanHalfFOV * ar); m[0][1] = 0;                    m[0][2] = 0;    m[0][3] = 0;
    m[1][0] = 0;                        m[1][1] = 1.0f / tanHalfFOV;    m[1][2] = 0;    m[1][3] = 0;
    m[2][0] = 0;                        m[2][1] = 0;                    m[2][2] = (-zNear - zFar)/zRange;   m[2][3] = 2 * zFar * zNear / zRange;
    m[2][0] = 0;                        m[2][1] = 0;                    m[2][2] = 1;    m[2][3] = 0;

    return this;
}

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

Если у вас есть совет по отладке или вы считаете, что проблема в элементарных фрагментах кода, которые я не включил, я предоставлю любые другие блоки.

РЕДАКТИРОВАТЬ: я использую OpenGL для рендеринга и JFrame для оконного менеджера.

1 Ответ

0 голосов
/ 04 июля 2019

У вас есть опечатка при настройке последней строки матрицы.Вы должны использовать индекс [3], но вместо этого повторно использовать индекс [2].

Ваша матрица должна быть:

m[0][0] = 1.0f / (tanHalfFOV * ar); m[0][1] = 0;                    m[0][2] = 0;    m[0][3] = 0;
m[1][0] = 0;                        m[1][1] = 1.0f / tanHalfFOV;    m[1][2] = 0;    m[1][3] = 0;
m[2][0] = 0;                        m[2][1] = 0;                    m[2][2] = (-zNear - zFar)/zRange;   m[2][3] = 2 * zFar * zNear / zRange;
m[3][0] = 0;                        m[3][1] = 0;                    m[3][2] = 1;    m[3][3] = 0;
...