3D относительно абсолютных преобразований

Я пытаюсь создать граф сцены для своей 3D-игры, в которой преобразования каждого объекта относятся к его родительскому объекту. Каждый узел графа имеет вектор вращения, масштабирования и смещения.

Как правильно комбинировать матрицы относительного преобразования, чтобы получить абсолютное преобразование объекта? Буду рад, если вы также объясните свое решение.


Вот пример того, как это сделать НЕПРАВИЛЬНО:
На самом деле это оказалось решением:

Matrix GetAbsoluteTransformation()
{
    if (!this.IsRoot())
    {
        return this.Transformation * this.Parent.GetAbsoluteTransformation();
    }
    else
    {
        return this.Transformation;
    }
}

В этом случае, когда родительский узел поворачивается, масштабируется или перемещается, дочерний узел трансформируется на ту же величину. , что является правильным поведением! Но дочерний элемент будет вращаться только вокруг своей исходной точки и не будет перемещаться вокруг исходной точки родителя.


Приложения:

Есть модель автомобиля с четырьмя колесами. Колеса расположены относительно начала координат автомобиля. Колеса могут вращаться, как настоящие колеса. Если я сейчас поверну машину, колеса все время должны оставаться прикрепленными к ней. В этом случае автомобиль является корневым узлом, а колеса - дочерними узлами.

Другой пример - модель солнечной системы. Планеты вращаются вокруг своей оси, вращаются вокруг Солнца, а луны вращаются вокруг планет.

5
задан tshepang 4 April 2014 в 08:55
поделиться