Невозможно повернуть объект из другого места, которое не является исходной точкой - PullRequest
0 голосов
/ 21 марта 2019

Я знаю, что предполагаемый способ сделать это максимально простым - использовать:

glTranslate(a,b,c);
glRotate(...);
glTranslate(-a,-b,-c);

Но в этом случае я использую буферы, чтобы сделать вещи более понятными и быстрыми, дело в том, что я делаю эквивалент, который:

iMat4x4 tempModel;
iMat4x4 tempModel2;


tempModel = math::translate(tempModel, iVec3(0.5f * size.x, 0.5f * size.y, 0.0f));
model[3].z = model[3].w = 0;
model[3] = model[3] + tempModel[3];

model = math::rotate(model, rotation, iVec3(0.0f, 0.0f, 1.0f));

tempModel2 = math::translate(tempModel2, iVec3(-0.5f * size.x, -0.5f * size.y, 0.0f));
model[3].z = model[3].w = 0;
model[3] = model[3] + tempModel2[3];

Но все же, когда я делаю что-то вроде object->rotation = sin(Time::WorldTime), я получаю объект, вращающийся из верхнего левого угла.

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

1 Ответ

1 голос
/ 21 марта 2019

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


Объяснение

[Матрица вращения R, смещение перевода t - матрица T, точка модели p.]

Прямое добавление матрицы перевода T эквивалентно с предварительным умножением на это, что означает, что смещение добавляется к выходной точке:

p --> R*p + t
  ( = T*R*p )

Итак, конечная точка:

p' = R*p - t + t = R*p
 ( = T*inv(T)*R )

Матрица переводаи его обратное (смещение -t) компенсирует друг друга, и вы получаете эффективный поворот относительно начала координат.

С другой стороны, после умножения на переводматрица эквивалентна предварительному применению перевода:

p --> R*(p - t)
  ( = R*inv(T)*p )

Таким образом, правильная конечная точка:

p' = R*(p - t) + t
 ( = T*R*inv(T)*p )

Обратите внимание, что эффективное смещение не отменяется, поскольку T и inv(T) не рядом сдруг с другом в выражении.


Правильный код

model_final = tempModel1 * model * tempModel2;
            //    T      *   R   *   inv(T)

(Или используя любую из функций вашей библиотеки, которая умножает матрицы в «обычных»)как указано выше)

...