我正在尝试为游戏引擎构建和重建一种格式,当尝试将其放回 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
(实际上什么也没做,因为它给出了相同的结果,但很多人建议这样做),然后我将它转换为Euler
Maya API 中的角度,然后我只是用良好的旧数学将弧度传递到度数,但这确实似乎不是要走的路,可能是文件丢失了一些数据的结果。
我想知道是否有比这更好的方法在关键帧中应用旋转,我将不胜感激。
提前致谢。