1

问题:

我的目标是编写一个代码,它围绕全局 y 轴3旋转 bvh 的根关节 θ 度,并将值保持在-180to的范围内180(就像 MotionBuilder 所做的那样)。我尝试使用欧拉、四元数、矩阵(考虑 bvh 的旋转顺序)旋转关节,但我还没有弄清楚如何获得正确的值。MotionBuilder 计算这些值x,y,z,使其对 bvh 文件有效。我想编写一个代码来计算x,y,z关节的旋转,就像在 MotionBuilder 中一样。

例子:

初始:根旋转:[x= -169.56, y=15.97, z=39.57]

根关节的初始旋转(在motionbuilder中)

手动旋转约 45 度后: 根旋转:[x=-117.81, y=49.37, z=70.15]

绕 y 全局轴旋转后根关节的旋转

全局 y 轴:

全局轴

4

1 回答 1

1

要围绕世界 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)
于 2019-10-15T00:08:03.910 回答