2016-08-03 4 views
1

Я пытаюсь написать орбитальную камеру (на основе glm :: quat) для моего приложения OpenGL. У меня есть несколько вопросов:Камера орбиты (C++, GLM)

  1. я делаю силам ли ViewMatrix из RotationMatrix + позиции камеры?

    camera_quat = glm :: quat (glm :: vec3 (tmp_pitch, tmp_yaw, 0)) * camera_quat;

    float pitch = camera_quat.pitch(); 
    float yaw = camera_quat.yaw(); 
    
    glm::mat4 rotate = glm::mat4_cast(camera_quat); 
    
    glm::vec3 view_direction(cos(yaw) * cos(pitch), sin(pitch), -sin(yaw) * cos(pitch)); 
    camera_position = target - view_direction * radius; 
    
    glm::mat4 translate = glm::translate(camera_position); 
    
    glm::mat4 view_matrix = **???**; 
    
  2. Является ли эта линия правильно ?: glm::vec3 view_direction(cos(yaw) * cos(pitch), sin(pitch), -sin(yaw) * cos(pitch));

P.S. Извините, если мой английский плохой. Это не мой родной язык, я русский. Надеюсь, вы можете мне помочь. Заранее спасибо!

+0

Если у вас есть кватернион, почему вы используете углы Эйлера как рыскания, тангажа и крена? –

+0

Недавно я начал использовать кватернионы ... Новичок в этом случае :( – Saitei

+0

Я пытаюсь повернуть камеру вокруг какого-то объекта с помощью джойстика. Tmp_ (yaw/pitch) Позвольте мне построить временное quat для одного кадра – Saitei

ответ

1

Если изменить translate матрицу

glm::mat4 translate = glm::translate(-camera_position); 

, это должно быть просто

glm::mat4 view_matrix = rotation * translation; 

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

view_matrix = glm::translate(0, 0, -radius) * rotate * glm::translate(-target); 
+0

Спасибо для ответа. Но не могли бы вы объяснить, почему мы принимаем отрицательное значение цели и радиуса? Я действительно не могу понять эту часть решения ... цель - положение в мировом пространстве, не так ли? – Saitei

+0

Да, целевое положение находится в мировом пространстве. Матрица представления не предназначена для позиционирования объекта (камеры). Вместо этого он имеет целью трансформировать сцену, так что камера будет в начале координат. Вот почему все участвующие матрицы инвертированы (я предполагаю, что матрица вращения уже инвертирована) и в обратном порядке. –

+0

О, я вижу! Поэтому я могу заменить его на glm :: inverse (glm :: translate (0, 0, radius) * rotate * glm :: translate (target)), правильно? (матрица вращения не инвертирована) Я должен просто инвертировать матрицу модели? Если это так, спасибо за ответ! Ты мне очень помог, большое спасибо! – Saitei

Смежные вопросы