Обновление локальной позиции / вращения / масштаба из глобальной позиции / вращения / масштаба?

Предполагая, что у меня есть класс, который содержит 3 вектора (один для положения, один для масштаба и один для вращения), я могу использовать их для генерации матрицы преобразования, которая символизирует положение, вращение и размер объекта в трехмерном пространстве. Затем я добавляю parent / child отношения между объектами, и я умножаю локальную матрицу преобразования дочернего элемента на глобальную матрицу родителя, я получаю глобальную дочернюю матрицу, и именно эту я использую для рендеринга объектов, поэтому, когда родитель вращается, ребенок вращается вокруг него как орбита. Теперь Мне нужно иметь возможность получить локальное преобразование дочернего элемента (не всю матрицу, а только отдельные компоненты). Я знаю глобальное преобразование дочернего элемента и знаю глобальное преобразование родительского элемента.

Я могу получить локальное преобразование дочернего элемента, умножив глобальное преобразование дочернего элемента на обратное преобразование родительского элемента. Однако ДЕЙСТВИТЕЛЬНО мне нужно сделать это конкретно:

1. Чтобы иметь возможность получить локальную позицию ребенка, просто зная его глобальную позицию и глобальную позицию родителя БЕЗ генерация любых матриц;

2. Чтобы иметь возможность получить локальное вращение ребенка, просто зная его глобальное вращение и глобальное вращение родителя БЕЗ генерация любых матриц;

3. Чтобы иметь возможность получить локальный масштаб ребенка, просто зная его глобальный масштаб и глобальный масштаб родителя БЕЗ генерация любых матриц;

0

Решение

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]