Недавно к своему фреймворку (или как принято называть, движку) прикрутил самопальную физику, всё как положено - матрицы, кватернионы... Вследствие чего, углы Эйлера, которые раньше задавали ориентацию объектов, стали бесполезны ввиду своей несовершенности (Gimbal Lock). Теперь же за это отвечает дуэт из вектора направления Axis и угла вращения Angle. В теории вроде бы всё понятно, но на практике возникают трудности.
К примеру, если предположить что Axis = (0, 1, 0), т.е. вектор направления совпадает с вертикальной осью координат, то Angle представляет собой Yaw Rotating - объект вращается, грубо говоря, влево-вправо. Если же Axis совпадает с одной из горизонтальных осей, то вращение будет происходить вокруг них.
А теперь к самой проблеме, если выбрать произвольный вектор направления, то управление вращением становится затруднительным, т.к. по сути своей Axis - это как вес в вершине меша для анимации персонажа, т.е. чем выше значение в X, Y или Z, тем больше Angle влияет на вращение вокруг этих осей. Как вот с таким поведением ориентировать объекты в сцене?
Для бóльшего понимания представляю вам псевдокод:
Public Sub SetOrientation(ByVal Axis As Vector3, ByVal Angle As Single)
Dim quat As Quaternion = Quaternion.RotationAxis(Axis, Angle)
Weapon.matWorld = Matrix.RotationQuaternion(quat)
End Sub