Вращение локальной координаты OpenGl

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

в настоящее время мой код вращения/перевода/масштабирования выглядит так

glm::mat4 myMatrix = glm::translate(glm::mat4(1.0f),trans);
glm::mat4 Model = glm::mat4(1.f);
glm::mat4 myScalingMatrix = glm::scale(sx, sy ,sz);
glm::vec3 myRotationAxis( 0, 1, 0);
glm::mat4 myRotationMatrix =glm::rotate(glm::mat4(1.0f),rot, myRotationAxis);

Model= myScalingMatrix* myRotationMatrix*myMatrix;
glm::mat4 MVP = Projection* View * Model;

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

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

РЕДАКТИРОВАТЬ 1: Слегка измененный код, который был предложен в разделе ответов, по-прежнему дает ту же ошибку.

glm::mat4 Model = glm::mat4(1.f);
glm::mat4 myScalingMatrix = glm::scale(sx, sy ,sz);
glm::vec3 myRotationAxis( 0, 1, 0);
glm::mat4 myRotationMatrix =glm::rotate(glm::mat4(1.0f),rot, myRotationAxis);

glm::vec4 trans(x,y,z,1);
glm::vec4 vTrans = myRotationMatrix* trans ;
glm::mat4 myMatrix = glm::translate(glm::mat4(1.0f),vTrans.x,vTrans.y,vTrans.z);
Model= myScalingMatrix* myRotationMatrix*myMatrix;

person I Phantasm I    schedule 19.03.2014    source источник


Ответы (1)


Вам нужно применить матрицу вращения к вектору перевода (транс).

Итак, если предположить, что trans является vec4, ваш код будет таким:

glm::mat4 Model = glm::mat4(1.f);
glm::mat4 myScalingMatrix = glm::scale(sx, sy ,sz);
glm::vec3 myRotationAxis( 0, 1, 0);
glm::mat4 myRotationMatrix =glm::rotate(glm::mat4(1.0f),rot, myRotationAxis);

glm::vec4 vTrans = myRotationMatrix * trans;


glm::mat4 myMatrix = glm::translate(glm::mat4(1.0f), vTrans.xyz);

Model= myScalingMatrix* myRotationMatrix*myMatrix;
glm::mat4 MVP = Projection* View * Model;

конвертировать vec4 в vec3

Итак, чтобы завершить ответ, если центр модели не равен (0,0,0) , вам нужно будет вычислить границы вашей модели и перевести ее на половину меньше, чем нижняя левая вершина модели.

Это хорошо объяснено здесь: локальное происхождение модели

В соответствии с предоставленным кодом ответ является лучшим из доступных ... если вам нужны дополнительные подробности, предоставьте несколько снимков экрана и подробную информацию о расчетах вашей проекции и матрицы просмотра.

person j-p    schedule 19.03.2014
comment
Небольшая проблема, из-за которой я не могу скомпилировать код, транс - это vec3, который легко решается путем преобразования его в vec4, но, по-видимому, vec4 несовместим с переводом glm. - person I Phantasm I; 19.03.2014
comment
возьмите 3 первых компонента: - person j-p; 19.03.2014
comment
Получил рабочий код, но он вращает мою модель вокруг глобального источника, а не своего собственного локального источника, а затем переводит ее на основе вращения, поэтому перевод - это то, к чему я стремлюсь, а вращение - нет. - person I Phantasm I; 19.03.2014
comment
Он вращается вокруг центра модели. если его вершины не центрированы (0,0,0), вы должны перевести его до поворота на разницу между modelCenter и (0,0,0). Таким образом, у вас будет 2 новых перевода (вперед и назад), чтобы получить эффективный центр модели на (0,0,0) - person j-p; 19.03.2014
comment
Туда и обратно (извините за мои английские утечки) - person j-p; 19.03.2014
comment
хм, ну, моя модель центрирована относительно начала координат, и я могу заставить вращение работать, как задумано, просто изменив порядок четвертой строки в вашем примере, так что glm::vec4 vTrans = trans*myRotationMatrix; заставляет вращение работать, как задумано, но тормозит перевод. также ваш английский в порядке! - person I Phantasm I; 19.03.2014
comment
Если вы вычислите среднее значение всех ваших вершин сразу после загрузки или настройки вашей модели, действительно ли вы получите в результате (0,0,0)? А также глобальная ориентация вашей модели (независимо от ее положения) должна быть ожидаемой в обоих случаях, поэтому transrot и rottrans должны придавать модели одинаковую ориентацию, это просто изменение ее положения. - person j-p; 19.03.2014
comment
я получил (0,0,0), когда сложил все вершины, есть другие идеи? - person I Phantasm I; 19.03.2014
comment
glm::vec4 vTrans = trans * myRotationMatrix отличается от glm::vec4 vTrans = myRotationMatrix * trans; (Я дважды проверяю это, но я совершенно уверен, что матрица * вектор отличается от вектора * матрицы) - person j-p; 19.03.2014
comment
Возможно, я путаю вас, когда говорю rottrans и transrot, я указывал на Matrix (RotationMatrix * TranslationMatrix), а не на переменные в коде. - person j-p; 19.03.2014
comment
нет, проблема все еще сохраняется, может быть, это что-то другое, чем эта часть кода? нравится, как я вычисляю матрицу вида и проекции? Вы хотите, чтобы я обновил вопрос своим недавно обновленным кодом из вашего ответа, чтобы убедиться, что я ничего не пропустил? - person I Phantasm I; 19.03.2014
comment
Хорошо, вопрос обновлен, спасибо за ваше время, у меня так долго была эта проблема, надеюсь, вы сможете разгадать тайну! - person I Phantasm I; 19.03.2014
comment
Я не вижу здесь никакой ошибки, покажите, может быть, больше кода (расчеты матрицы проекта и модели) и несколько снимков экрана. - person j-p; 19.03.2014
comment
В соответствии с предоставленным кодом ответ является лучшим из доступных ... если вам нужны дополнительные подробности, предоставьте несколько снимков экрана и подробную информацию о расчетах вашей проекции и матрицы просмотра. - person j-p; 20.03.2014