Вычисление матрицы поиска с использованием вершинного шейдера OpenGL 3.x

Я следовал этому посту, чтобы построить матрицу типов GluLookAt.

Вычисление матрицы LookAt

            Method calculateLookAtMatrix(glm::vec3 eye, glm::vec3 center, glm::vec3 up)

glm::vec3 zaxis = glm::normalize(center - eye);
glm::vec3 xaxis = glm::normalize(glm::cross(up, zaxis));
glm::vec3 yaxis = glm::cross(zaxis, xaxis);

lookAtMatrix[0][0] = xaxis.x;
lookAtMatrix[0][1] = yaxis.x;
lookAtMatrix[0][2] = zaxis.x;

lookAtMatrix[1][0] = xaxis.y;
lookAtMatrix[1][1] = yaxis.y;
lookAtMatrix[1][2] = zaxis.y;

lookAtMatrix[2][0] = xaxis.z;
lookAtMatrix[2][1] = yaxis.z;
lookAtMatrix[2][2] = zaxis.z;

lookAtMatrix[3][0] = glm::dot(xaxis, -eye);
lookAtMatrix[3][1] = glm::dot(yaxis, -eye);
lookAtMatrix[3][2] = glm::dot(zaxis, -eye);

lookAtMatrix[3][3] = 1;

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

Шейдер выглядит следующим образом.

 gl_Position =   lookAtMatrix * position * perspectiveMatrix;

Если передать lookAtMatrix в качестве матрицы идентификаторов, сцена визуализируется правильно, однако с помощью кода выше, чтобы установить матрицу как …

    eye(0.0f,0.0f,10.0f);
center(0.0f,0.0f,0.0f);
up(0.0f,0.0f,1.0f);

приводит к пустой сцене. Сцена представляет собой сетку 10×10, нарисованную по X / Y, поэтому я бы ожидал уменьшенного вида сцены.

(Я поиграл со строками и столбцами, но я на 99,9% уверен, что они в порядке, так как матрица перспективы в порядке)

1

Решение

gl_Position =   lookAtMatrix * position * perspectiveMatrix;

Это не правильно. Вы хотите преобразовать свою позицию с помощью lookAtMatrix, а затем преобразовать результат этого с помощьюpectiveMatrix.

При использовании векторов столбцов / главных векторов и матриц столбцов вы хотите умножить матрицу и вектор, поместив вектор с правой стороны матрицы.

Таким образом, ваше умножение должно в конечном итоге выглядеть следующим образом:

gl_Position =   perspectiveMatrix * lookAtMatrix * position;

Сказав это, я не уверен, почему у вас изначально была позиция слева, поэтому мне интересно, выполняете ли вы какую-то матричную транспозицию где-то в вашем конвейере. Если это решение не работает, вам может понадобиться показать больше кода.

4

Другие решения

eye(0.0f,0.0f,10.0f);
center(0.0f,0.0f,0.0f);
up(0.0f,0.0f,1.0f);

up направление вектора параллельно направлению взгляда. Это не разрешено

Помните: направление вверх определяет, что означает «вверх» для вида. Он определяет вращение вокруг направления взгляда. Если направление вверх является направление взгляда, то математика больше не работает.

3

По вопросам рекламы [email protected]