Импорт анимации в Maya через Python дает странные результаты

Я пытаюсь создать и перестроить формат для игровых движков, и когда я пытаюсь вернуть его в 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, а затем я просто передаю радианы в градусы с помощью старой доброй математики, но это не кажется правильным и может быть результатом некоторой потери данных файла.

Что мне интересно, есть ли лучший способ применить вращение в ключевом кадре, чем этот, я был бы очень признателен.

Заранее спасибо.


person Seyren Windsor    schedule 24.08.2015    source источник


Ответы (1)


Вы можете попробовать запустить Maya Euler Filter на своем анимированном персонаже; поскольку преобразование кватерниона в эйлер не является детерминированным, вы не можете быть уверены, что эйлеризация для одного кадра находится в том же квадранте, что и для следующего, и интерполяция дурацкая.

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

person theodox    schedule 01.09.2015
comment
Хотя это полностью выглядит так, видимо, это не по какой-то причине, и дело не в том, что ключ установлен в странной рамке. Мне придется искать другие решения, но это на самом деле очень полезно для создания моих анимаций, большое спасибо :). - person Seyren Windsor; 02.09.2015