Как правильно преобразовать (перевести, повернуть, масштабировать) объект, используя матрицы GLM или JOML для современного OpenGL - PullRequest
0 голосов
/ 09 июня 2018

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

Мой код Java:

Matrix4f moveOriginMat = new Matrix4f();
Vector3d centroid = new Vector3f(pickedObject.getCentroid().getX() + translationMatrix.m30(), pickedObject.getCentroid().getY() + translationMatrix.m31(), pickedObject.getCentroid().getZ() + translationMatrix.m32());
moveOriginMat.translation(-(float)centroid.x * (scaleMat.m00() - 1), -(float)centroid.y * (scaleMat.m11() - 1), -(float)centroid.z * (scaleMat.m22() - 1));
modelMatrix.set(moveOriginMat);
modelMatrix.mul(scaleMat);
modelMatrix.mul(xRotationMatrix);
modelMatrix.mul(yRotationMatrix);
modelMatrix.mul(zRotationMatrix);
modelMatrix.mul(translationMatrix);

Что я делаю не так?Мне нужно вращать объект вокруг его собственных осей, а не вокруг центра мира.

1 Ответ

0 голосов
/ 09 июня 2018

Решение:

Matrix4f moveOriginMat = new Matrix4f();
Vector3d centroid = getPickedObjectLocalCentroid();
moveOriginMat.translation(-(float)centroid.x * (scaleMat.m00() - 1), -(float)centroid.y * (scaleMat.m11() - 1), -(float)centroid.z * (scaleMat.m22() - 1));
modelMatrix.set(moveOriginMat);
modelMatrix.mul(scaleMat);
modelMatrix.translate((float)centroid.x, (float)centroid.y, (float)centroid.z);
modelMatrix.mul(zRotationMatrix);
modelMatrix.mul(yRotationMatrix);
modelMatrix.mul(xRotationMatrix);
modelMatrix.translate(-(float)centroid.x, -(float)centroid.y, -(float)centroid.z);
modelMatrix.mul(translationMatrix);

Мне просто нужно было добавить перевод в источник до поворота и перевод обратно после этого.Знаки для перевода также смутили меня.

...