Я знаю, что предполагаемый способ сделать это максимально простым - использовать:
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-й столбец матрицы никак не умножается на матрицу вращения , просто поместил, где это было раньше ...