2013-09-23 2 views
0

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

я могу получить ребенка локального преобразования путем умножения ребенка глобального преобразования путем преобразования inversed.However родителя мне действительно нужно, чтобы быть в состоянии сделать это конкретно:

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

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

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

+1

Ну, что вы пробовали? Что конкретно представляет собой проблема с пунктом 1, например? – Hulk

+0

Ну, мне нужно, чтобы она была умной, как система в Unity3D.In Unity3D каждый раз, когда вы меняете вращение объекта, позиции его детей автоматически меняются, поэтому они вращаются вместе с ним. В любом случае, мне нужно, чтобы он обновлял все каждый раз, но единственный способ сделать это - создать матрицы. Я не знаю, есть ли более быстрый способ. –

+1

Не могли бы вы объяснить, почему вы не хотите создавать какие-либо матрицы? Возможно, если бы вы могли сказать конечную цель, мы могли бы попытаться достичь ее, вместо того, чтобы сосредоточиться на промежуточной цели избегать генерации матриц преобразования. – Michael

ответ

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^