Есть ли способ извлечь матрицу преобразования из матрицы представления в GLM? - PullRequest
0 голосов
/ 03 апреля 2019

Мне нужно извлечь матрицу преобразования из моей камеры, чтобы назначить ее для меша.

Я работаю над проектом компьютерной графики в школе, цель которого - смоделировать руки персонажа в перспективе от первого лица.

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

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

m_yaw += (x - m_mouseLastPosition.x) * m_rotateSpeed;

m_pitch -= (y - m_mouseLastPosition.y) * m_rotateSpeed;

Вот так я обновляю матрицу вида, когда она меняется

glm::vec3 newFront;

newFront.x = -cos(glm::radians(m_yaw)) * cos(glm::radians(m_pitch));

newFront.y = sin(glm::radians(m_yaw)) * cos(glm::radians(m_pitch));

newFront.z = sin(glm::radians(m_pitch));

m_front = glm::normalize(newFront);

m_right = glm::normalize(glm::cross(m_front, m_worldUp));

m_up = glm::normalize(glm::cross(m_right, m_front));

m_viewMatrix = glm::lookAt(m_position, (m_position + m_front), m_up);

Прямо сейчас я могу назначить положение камеры для моей сетки, как это

m_mesh.m_transform = glm::translate(glm::mat4(1.0f), m_camera.m_position);

Я могу успешно назначить положение камеры, но не поворот.

Что я ожидаю, так это назначить полную камеру transform моей сетке или извлеким вращение независимо и назначим ее сетке после.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Большое спасибо за ваши ответы, они очень помогли.

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

glm настолько нов для меня, что я не был знаком с тем, как он обрабатывает умножения матриц.

Окончательный код принимает матрицу перевода с положением камеры, затем я поворачиваю результирующую матрицу по оси Y с моим шагом и, наконец, получаюсь, что получающаяся матрица поворачивается по оси X с моим рысканием.

m_mesh.m_transform = glm::rotate(glm::rotate(glm::translate(glm::mat4(1.0f), camera.m_position), glm::radians(-camera.m_yaw), glm::vec3(0.0f, 1.0f, 0.0f)), glm::radians(-camera.m_pitch), glm::vec3(1.0f, 0.0f, 0.0f));
0 голосов
/ 03 апреля 2019

Шаги по настройке матрицы проекции вида модели, которой я всегда следовал (что не означает, что она на 100% правильная), и кажется, что у вас проблемы:

// Eye position is in world coordinate system, as is scene_center. up_vector is normalized.
glm::dmat4 view = glm::lookat(eye_position, scene_center, up_vector);
glm::dmat4 proj = glm::perspective(field_of_view, aspect, near_x, far_x);

// This converts the model from it's units, to the units of the world coordinate system
glm::dmat4 model = glm::scale(glm::dmat4(1.0), glm::dvec3(1.0, 1.0, 1.0));
// Add model level rotations here utilizing glm::rotate

// offset is where the objects 0,0 should be mapped to in the world coordinate system
model = glm::translate(model, offset);
// Order of course matters here. 
glm::dvec3 mvp = proj * view * model; 

Надеюсь, это поможет.

...