Это только частичный ответ, потому что я собираюсь делать преобразования на уровне объекта и на уровне группы, и я почти уверен, что что-то пойдет не так, как было указано в ответе, который я вывешенный.
ою программу моделирования, и я хотел бы сделать преобразования для объектов в их собственном пространстве, а затем назначить этот единственный объект группе для вращения вокруг другой оси, вокруг которой вращается группа. Однако я также хотел бы иметь возможность выполнять преобразования в собственном пространстве объекта при его объединении.
Манипулируя отдельным объектом, я выбираю центр объекта.
glm::mat4 transform;
transform = glm::translate(transform, - obj.meshCenter);
glm::mat4 transform1;
transform1 = glm::translate(transform1, obj.meshCenter);
obj.rotation = transform1*obj.thisRot*transform;
Затем я отправляю это в шейдер,
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(obj.translation*obj.rotation*objscale);
Теперь я хотел бы повернуть этот объект вокруг другой оси, скажем, оси (5,0,0) из 45 градусов.
Теперь у меня есть:
glm::mat4 groupR;
groupR = glm::rotate(groupR,glm::degrees(45.0f),glm::vec3(5,0,0));
obj.groupRotation = groupR;
glUniformMatrix4fv(modelLoc, 1, GL_FALSE,
glm::value_ptr(obj.groupRotation*obj.translation*obj.rotation*objscale)
Теперь я переместил объект из его локального пространства в пространство группы. У меня возникли некоторые трудности, связанные с преобразованием в собственном пространстве объекта в сочетании с вращением группы. У меня был ограниченный успех, когда я установил ось groupR в (0,1,0) следующим образом:
///Translating object in its own space///
glm::mat4 R = obj.groupRotation;
obj.translation = glm::inverse(R) * obj.translate * R;
проблема здесь в том, что это будет корректно переводить объект только в его собственное пространство, если ось вращения R (вращение группы) равна (0,1,0):
///Rotating object in its own space///
glm::mat4 R = obj.groupRotation;
obj.rotation = glm::inverse(R) * obj.rot * R;
Опять же, вращения неверны. Я думаю, что, возможно, мне придется отменить перевод оси groupR? а затем повторно применить его где-нибудь?