像在MotionBuilder中一样如何计算旋转

时间:2019-04-11 15:43:57

标签: algorithm animation 3d rotation motionbuilder

问题:

我的目标是编写代码,使bvh的根关节绕整体y轴旋转θ度 3,并将值保持在{{1} }到-180(就像MotionBuilder一样)。我尝试使用欧拉,四元数和矩阵旋转关节(考虑bvh的旋转顺序),但我还没有弄清楚如何获得正确的值。 MotionBuilder会计算值180,因此它们对于bvh文件有效。我想编写一个代码来计算关节的旋转x,y,z,就像在MotionBuilder中一样。

示例:

初始:根旋转:x,y,z

Initial rotations of root joint (in motionbuilder)

手动旋转约45度后:根旋转:[x= -169.56, y=15.97, z=39.57]

rotations of root joint after rotating around y global axis

全局y轴:

global axes

1 个答案:

答案 0 :(得分: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)

如果根节点上有任何“预旋转”,则过程会更加复杂,您可以尝试使用带有LRMToDof方法的SetVector来设置“旋转”。

result_vector = FBVector3d()
root.LRMToDof(result_vector, result_matrix)
root.SetVector(result_vector, FBModelTransformationType.kModelRotation, True)