3D вращение вокруг глобальной осиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 3D вращение вокруг глобальной оси

Сообщение Anonymous »

Я пытаюсь повернуть трехмерный объект вокруг глобальной оси, и у меня возникла проблема: он не вращается вокруг начала координат.
Попробовал следующее

Код: Выделить всё

        float3 middle = //calculated the center of the cuboit
mymesh.setTransform(mymesh.getTransform()
* Matrix::createTranslation(middle)
* Matrix::createRotationY(-time * speed)
* Matrix::createTranslation(middle).invert());
Это прекрасно работает для вращения вокруг локальной оси.
Если я вращаю его вокруг оси Y, все в порядке. Если я поверну его вокруг оси X, то вращение вокруг оси Y будет локальным и больше не будет вращать Объект глобально.
Я читал, что это имеет значение с какой стороны моей матрицы вращения я умножаю свою матрицу, представляющую трехмерный объект.
Если я хочу, чтобы она вращалась вокруг локальной оси, я умножаю ее на левую сторону.

Код: Выделить всё

Result = M * rotation
Результатом является матрица M после вращения.
Если я хочу, чтобы она вращалась вокруг глобальной оси, я умножаю ее с правой стороны:

Код: Выделить всё

Result = rotation * M
Теперь это работает, но перевод больше не работает. Он не вращается вокруг начала координат, но создается впечатление, что это вращение вокруг центра внешней точки кубойта.
Я делаю следующие вычисления:

Код: Выделить всё

        Matrix m = Matrix::createTranslation(middle)
* Matrix::createRotationY(-time * speed)
* Matrix::createTranslation((-1.0)* middle);

mymesh.setTransform(m * mymesh.getTransform());
Чем больше я об этом думаю, тем меньше я это понимаю. теперь я даже задаюсь вопросом, почему сработала первая реализация с вращением вокруг локальной оси.
Переменная middle рассчитывается в зависимости от размера кубиота и представляет его центр.
скажем так будет p1(1,1,1)
Если я переместим свой объект в 3D, например, на 10 по оси z, то мой объект окажется где-то в p2(0,0,10) . Но если я передвину Объект около -p1 назад, поверну его и перемещу назад, то мой Объект все равно не окажется в начале координат, но будет вращаться так же, как в начале координат.
Кажется, я не понимаю чего-то важного. Как мне повернуть вокруг глобальной оси и повернуть ее так, как будто она находится в начале координат? Почему первая реализация работает?
РЕДАКТИРОВАТЬ:
Матрица — это матрица 4x4 для представления сетки, а float3 — это точка для системы координат x,y,z
EDIT2:
ОК, решение проблемы, похоже, состоит в том, чтобы вычислить сделанный перевод. если я знаю вектор для перевода, то я могу переместить объект обратно в начало координат, повернуть его и вернуть туда, где он был.
Я пытался отслеживать центр объекта, добавляя к векторизирую каждое движение, которое я делаю, но когда я меняю форму объекта, центр оказывается неправильным.
Есть ли способ вычислить перевод, сделанный из объекта?
Например, если я передвигаю его дальше ось X на 10 вправо, а затем поверните ее. центр не изменит положение, но просто перевод матрицы вернет неправильное значение.

Подробнее здесь: https://stackoverflow.com/questions/427 ... obalm-axis
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»