0

我正在尝试为游戏引擎构建和重建一种格式,当尝试将其放回 Maya 时,它会产生奇怪的结果。

这不是真正的错误或类似的错误,但动画的结果很奇怪。

出于引擎的目的,我确实需要将其以Quaternion格式保存,因为它比Euler axis.

这就是我所做的,因为我真的找不到直接的申请方式Quaternion

arot_count = struct.unpack( "<L", f.read( 4 ) )[ 0 ] # Reads the number of animation frames

for i in range( 0, arot_count ):
    keytime = ( struct.unpack( "<L", f.read( 4 ) )[ 0 ]/80 ) # Keyframe
    arot = om.MQuaternion( struct.unpack( "f", f.read( 4 ) )[ 0 ], struct.unpack( "f", f.read( 4 )[ 0 ], struct.unpack( "f", f.read( 4 ) )[ 0 ], struct.unpack( "f", f.read( 4 ) )[ 0 ])# Reads quat from file
    narot = arot.normal() # Normalizes the quaternion
    rot = narot.asEulerRotation() # Converts it to euler angles

    if isMesh == False:
        cmds.setAttr( ( obj.name + ".rotate" ), rot.x * 180 / math.pi, rot.y * 180 / math.pi, rot.z * 180 / math.pi )                    
        cmds.setKeyframe( obj.name, time = keytime )

结果如下:

行走的动画

您可以看到很容易分辨出动画在做什么,但是您可以看到手臂或腿之间的那些奇怪的帧飞了一会儿,并且总体上搞砸了整个动画。

我相信这是因为我对代码所做的转换的数据丢失。我基本上标准化了Quaternion(实际上什么也没做,因为它给出了相同的结果,但很多人建议这样做),然后我将它转换为EulerMaya API 中的角度,然后我只是用良好的旧数学将弧度传递到度数,但这确实似乎不是要走的路,可能是文件丢失了一些数据的结果。

我想知道是否有比这更好的方法在关键帧中应用旋转,我将不胜感激。

提前致谢。

4

1 回答 1

0

您可以尝试在动画角色上运行 Maya Euler 过滤器;由于四元数到欧拉的转换不是确定性的,因此您无法确定一帧的欧拉化与下一帧的欧拉化是否在同一象限中,并且插值很古怪。

https://www.youtube.com/watch?v=zo0xhw1B2dE

于 2015-09-01T00:07:05.017 回答