2015-02-14 4 views
1

У меня есть вопрос относительно использования кватернионов для вращения моего графического объекта.Вращение объекта с кватернионом

У меня есть Transform класс, который имеет следующий конструктор с параметрами по умолчанию:

Transform(const glm::vec3& pos = glm::vec3(0.0), const glm::quat& rot = glm::quat(1.0, 0.0, 0.0, 0.0), 
    const glm::vec3& scale = glm::vec3(1.0)) 
{ 
    m_pos = pos; 
    m_rot = rot; 
    m_scale = scale; 
} 

В моем классе Transform вычислить MVP следующим образом:

glm::mat4 Transform::GetModelMatrix() const 
{ 
    glm::mat4 translate = glm::translate(glm::mat4(1.0), m_pos); 
    glm::mat4 rotate = glm::mat4_cast(m_rot); 
    glm::mat4 scale = glm::scale(glm::mat4(1.0), m_scale); 

    return translate * rotate * scale; 
} 

Проблема я столкнулся в том, что когда я использую const glm::quat& rot = glm::quat(1.0, 0.0, 0.0, 0.0), мой объект появляется нормально на экране. На следующем рисунке показано это: enter image description here

Однако, если я пытаюсь использовать, например const glm::quat& rot = glm::quat(glm::radians(90.0f), 0.0, 1.0, 0.0) (вращение на оси у на 90 градусов) мой объект выглядит, как будто это было уменьшено. На следующем изображении показано следующее: enter image description here

Я не могу понять, что вызывает его, когда я пытаюсь повернуть его. Я пропустил что-то важное?

Если это какой-либо значимости, ниже, как рассчитать мой вид матрицы:

glm::mat4 Camera::GetView() const 
{ 
    glm::mat4 view = glm::lookAt(m_pos, m_pos + m_forward, m_up); 

    return view; 
} 
+2

GLM не имеет кватернион конструктора угла и ось с указанием. Вы непосредственно инициализируете записи кватернионов своими значениями, в результате чего возникает какой-то странный ненормализованный кватернион. – derhass

+0

@derhass, как я должен был инициализировать его? –

ответ

1

AFAIK вы можете инициализировать в GLM :: Quat с помощью:

glm::vec3 angles(degToRad(rotx), degToRad(roty), degToRad(rotz)); 
glm::quat rotation(angles); 

Где rotx, roty, rotz - углы поворота вокруг оси x, y и z и degToRad преобразует углы в радианы. Поэтому для Вашего случая:

glm::vec3 angles(degToRad(0), degToRad(90), degToRad(0)); 
glm::quat rotation(angles); 

С уважением