Как рассчитать вращение, как в MotionBuilder

Проблема:

Моя цель состоит в том, чтобы написать код, который вращает корневое соединение bvh, θ градусов вокруг глобальной оси y 3 и сохраняет значения в диапазоне -180 в 180 (так же, как MotionBuilder). Я пытался вращать соединение, используя эйлер, кватернионы, матрицы (учитывая порядок вращения bvh), но я еще не понял, как получить правильные значения. MotionBuilder вычисляет значения x,y,z поэтому они действительны для файла bvh. Я хотел бы написать код, который рассчитывает вращение x,y,z для совместной работы, как в MotionBuilder.

Пример:

Начальный: Root Rotation: [x= -169.56, y=15.97, z=39.57]

После ручного вращения на 45 градусов: вращение корня: [x=-117.81, y=49.37, z=70.15]

глобальная ось Y:

0 ответов

Чтобы повернуть узел вокруг мировой оси Y на любое количество градусов, работает следующее ( https://en.wikipedia.org/wiki/Rotation_matrix):

import math
from pyfbsdk import *

angle = 45.0
radians = math.radians(angle)
root_matrix = FBMatrix()
root.GetMatrix(root_matrix, FBModelTransformationType.kModelRotation, True)

transformation_matrix = FBMatrix([
    math.cos(radians), 0.0, math.sin(radians), 0.0,
    0.0, 1.0, 0.0, 0.0,
    -math.sin(radians), 0.0, math.cos(radians), 0.0,
    0.0, 0.0, 0.0, 1.0
])

result_matrix = root_matrix * transformation_matrix
root.SetMatrix(result_matrix , FBModelTransformationType.kModelRotation, True)

Если есть какие-либо предварительные вращения на корневом узле, процесс будет более сложным, и вы можете попробовать установить вращения, используя SetVector с методом LRMToDof.

result_vector = FBVector3d()
root.LRMToDof(result_vector, result_matrix)
root.SetVector(result_vector, FBModelTransformationType.kModelRotation, True)
Другие вопросы по тегам