2013-06-11 1 views
1

Я работаю над установкой 3D-рендеринга (все математические операции с GLM для OpenGL), и все работает правильно, за исключением того, как я предпочел бы, чтобы мои преобразования работали. создать матрицу для каждого объекта следующим образом:Направление вращения в GLM-матрице с использованием кватернионов

matrix = mat4(1); 
vec3 scale = GetWorldScale(); 
vec3 pos = GetWorldPosition(); // Returns pos + parent->pos 
quat rot = GetWorldRotationQuat(); // Returns parent->rot * rot 

matrix = glm::translate(matrix, pos); 
matrix *= mat4_cast(rot); 
matrix = glm::scale(matrix, scale); 

right = matrix[0].xyz; 
up = matrix[1].xyz; 
direction = matrix[2].xyz; 

Используя это, как правило, работает правильно, за исключением того, что я не знаю, как настроить его часть для предпочтения. То есть, используя это, трансляция по оси X перевернута (например, левая положительна, а вперед положительна на оси Z, но я менее дискриминанта этого), и вращение по оси Y перевернуто.

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

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

+0

хорошо, вы получили еще с кватернионами за один раз, чем я, через 2 года. –

+0

Непонятно, что означают эти направления. Или что означают эти преобразования. Мир, вообще говоря, не имеет вращения. –

+0

Gam: Ну, я тоже могу использовать эйлеры (мне еще предстоит понять/убедиться в преимуществах кватернионов, но они пригодны для использования). Nicol: Кажется, я понимаю, но вы знаете, что я имею в виду в том, как должна вести себя каждая ось. – babybluesedan

ответ

0

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

Давайте рассмотрим пример: у вас есть один дочерний объект c и его родительский p. Каждый из них имеет трансляцию t, вращение r и масштаб s. Чтобы это было просто, каждая из них - это матрицы 4x4. В настоящее время вы

matrix = p.t * c.t * p.r * c.r * p.s * c.s 

Итак, представьте, локальную систему координат ребенка, который трансформируется этой матрицей (XYZ осей длины 1). Очки умножаются справа, поэтому мы должны прочитать их справа налево. Во-первых, система координат масштабируется дочерним элементом, а затем масштабируется родителем. Затем он поворачивается ребенком. Затем родителем. И теперь применяется перевод ребенка. Это означает, что детский перевод применяется во вращающейся системе координат. Поскольку вы уже применили как родительские , так и вращения родителя, он поворачивается в систему координат родителя. Таким образом, координаты ребенка интерпретируются так, как если бы они были родительскими координатами.

Так что вы должны делать: в вашем методе вычислить объектную матрицу m = c.t * c.r * c.s. Тогда мировая матрица вашего объекта определяется как wm = pm * m, где родительская матрица pm является мировой матрицей родителя. Таким образом, вы будете в конечном итоге на матрице:

c.wm = (c.pm) * (c.o) = (p.t * p.r * p.s) * (c.t * c.r * c.s) 

И это означает, что перевод ребенка в системе координат ребенка, а также перевод родителя в системе координат родителя.