Я пытаюсь создать и перестроить формат для игровых движков, и когда я пытаюсь вернуть его в Maya, это дает странные результаты.
На самом деле это не ошибка или что-то в этом роде, но результаты анимации странные.
Мне действительно нужно иметь его в формате Quaternion
для целей движка, поскольку он обрабатывает его лучше, чем Euler axis
, но при попытке применить его к Maya я не могу найти правильный способ.
Это то, что я делаю, так как я не могу найти прямой способ применить только 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, а затем я просто передаю радианы в градусы с помощью старой доброй математики, но это не кажется правильным и может быть результатом некоторой потери данных файла.
Что мне интересно, есть ли лучший способ применить вращение в ключевом кадре, чем этот, я был бы очень признателен.
Заранее спасибо.