Я пытаюсь создать граф сцены для своей 3D-игры, в которой преобразования каждого объекта относятся к его родительскому объекту. Каждый узел графа имеет вектор вращения, масштабирования и смещения.
Как правильно комбинировать матрицы относительного преобразования, чтобы получить абсолютное преобразование объекта? Буду рад, если вы также объясните свое решение.
Вот пример того, как это сделать НЕПРАВИЛЬНО:
На самом деле это оказалось решением:
Matrix GetAbsoluteTransformation()
{
if (!this.IsRoot())
{
return this.Transformation * this.Parent.GetAbsoluteTransformation();
}
else
{
return this.Transformation;
}
}
В этом случае, когда родительский узел поворачивается, масштабируется или перемещается, дочерний узел трансформируется на ту же величину. , что является правильным поведением!
Но дочерний элемент будет вращаться только вокруг своей исходной точки и не будет перемещаться вокруг исходной точки родителя.
Приложения:
Есть модель автомобиля с четырьмя колесами. Колеса расположены относительно начала координат автомобиля. Колеса могут вращаться, как настоящие колеса. Если я сейчас поверну машину, колеса все время должны оставаться прикрепленными к ней. В этом случае автомобиль является корневым узлом, а колеса - дочерними узлами.
Другой пример - модель солнечной системы. Планеты вращаются вокруг своей оси, вращаются вокруг Солнца, а луны вращаются вокруг планет.