Для проекта в Unity3D я пытаюсь преобразовать все объекты в мире, меняя фреймы.Это означает, что источник нового кадра поворачивается, переводится и масштабируется для соответствия источнику старого кадра, затем эта операция применяется ко всем другим объектам (включая старый источник).Для этого мне нужен обобщенный, 3-мерный (таким образом, 4x4) Transformation-Matrix.
Я смотрел на использование встроенного в Unity метода Matrix4x4.TRS (), но это кажется бесполезным, так как это толькоприменяет перевод, вращение и масштабирование к определенной точке.То, что я ищу, - это смена кадров, в которых новый кадр имеет другое происхождение, вращение и масштаб по сравнению с исходным.
Чтобы визуализировать проблему, я сделалмаленький GIF (у меня есть рабочая версия в 3D, без использования матрицы и без вращения): https://gyazo.com/8a7ab04dfef2c96f53015084eefbdb01
Значения для каждой сферы:
Origin1 (Red Sphere)
Before:
Position (-10, 0, 0)
Rotation (0,0,0)
Scale (4,4,4)
After:
Position (10, 0, 0)
Rotation (0,0,0)
Scale (8,8,8)
-
Origin2 (Blue Sphere)
Before:
Position (-20, 0, 0)
Rotation (0,0,0)
Scale (2,2,2)
After:
Position (-10, 0, 0)
Rotation (0,0,0)
Scale (4,4,4)
-
World-Object (White Sphere)
Before:
Position (0, 0, 10)
Rotation (0,0,0)
Scale (2,2,2)
After:
Position (30, 0, 20)
Rotation (0,0,0)
Scale (4,4,4)
В настоящее время яЯ просто беру Вектор между двумя источниками, масштабируя его до разницы между двумя источниками, а затем применяю его поверх новой позиции исходного (первого) источника.Это, конечно, не будет работать, когда вращение применяется к любому из 2 источников.
// Position in original axes
Vector3 positionBefore = testPosition.TestPosition - origin.TestPosition;
// Position in new axes
Vector3 positionAfter = (positionBefore * scaleFactor) + origin.transform.position;
Мне нужна матрица, которая может сделать это (и включает вращение, такое, что Origin2 поворачивается вВращение Origin1 было до преобразования, и все другие объекты перемещаются в правильные положения).
Есть ли способ сделать это, не выполняя полный расчет для каждого вектора (т.е. преобразование положения перед вектором)?Его необходимо применять к (очень) большому количеству объектов в каждом кадре, поэтому его необходимо (достаточно) оптимизировать.
Редактировать: масштабирование ВСЕГДА будет одинаковым.