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

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

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

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

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

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


person ulak blade    schedule 23.09.2013    source источник
comment
Ну что ты пробовал? В чем конкретно ваша проблема, например, с пунктом 1?   -  person Hulk    schedule 23.09.2013
comment
Что ж, мне нужно, чтобы он был умным, как система в Unity3D. В Unity3D каждый раз, когда вы меняете вращение объекта, положения его дочерних элементов автоматически меняются, поэтому они вращаются вместе с ним. Обычно мне нужно, чтобы он обновлял все каждый раз, но единственный способ сделать это - сгенерировать матрицы. Я не знаю, есть ли более быстрый способ.   -  person ulak blade    schedule 23.09.2013
comment
Не могли бы вы объяснить, почему вы не хотите создавать какие-либо матрицы? Возможно, если бы вы могли сказать конечную цель, мы могли бы попытаться ее достичь, вместо того, чтобы концентрироваться на промежуточной цели - избежать генерации матриц преобразования.   -  person Michael    schedule 23.09.2013
comment
Все эти ценности взаимосвязаны. Вы не можете просто составить два перевода, поскольку локальный перевод дает другой результат в зависимости от глобального масштаба и поворотов. Другими словами, чтобы узнать локальное положение, вам нужно глобальное положение, а также положение, масштаб и поворот родителя. Матрицы работают быстро, и это действительно лучший способ сделать это.   -  person Peter    schedule 23.09.2013


Ответы (1)


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

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

person Sorin    schedule 23.09.2013