Maya - запрос данных кривой анимации - PullRequest
0 голосов
/ 11 июля 2020

У меня проблема с запросом данных кривой анимации Maya на более глубоком уровне. Итак, в качестве входных данных я хочу иметь кривую анимации, которая не связана ни с какими атрибутами, а только с одним узлом. Имея это, я хочу создать функцию, которая либо возвращает:
  1. Значение с заданным временем (я знаю, что это можно легко сделать, подключив эту кривую анимации к любому атрибуту, а затем получая значение с помощью команды типа: cmds.getAttr([objName]+'.'[attrName], t=[timeValue] ... но как это сделать, не подключая ни к чему кривую анимации?)
  2. Время с заданным значением - я не мог получить его с помощью каких-либо команд Maya, и это то, что мне нужно больше всего ..: (

Это в основном играет с уравнением кривой Безье, но я почти уверен, что здесь нужен Maya API, но поскольку я очень c с API, нужна ваша помощь :), любые подсказки, как это сделать решить это? Спасибо !!

1 Ответ

0 голосов
/ 13 июля 2020

Вы можете использовать keyframe для запроса значений кривой анимации, которая не связана ни с каким атрибутом. Вот пример, который создаст анимированную кривую с 2 ключами, распечатает значения ключей, а затем распечатает их значение в каждом кадре:

import maya.cmds as cmds

# Create an animation curve with 2 keys.
anim_curve = cmds.createNode("animCurveTL")
cmds.setKeyframe(anim_curve, t=0, v=0)
cmds.setKeyframe(anim_curve, t=10, v=10)

# Get its key count.
key_count = cmds.keyframe(anim_curve, q=True, keyframeCount=True)

# Iterate through key count and print all key values.
for i in range(key_count):
    print cmds.keyframe(anim_curve, q=True, index=(i, i))[0]

# Get the scene's frame ranges.
start = int(cmds.playbackOptions(q=True, min=True))
end = int(cmds.playbackOptions(q=True, max=True))

# Iterate through each frame and print the anim curve's value.
for f in range(start, end):
    print f, cmds.keyframe(anim_curve, q=True, eval=True, time=(f, f))[0]

Получение значения в заданный момент времени достаточно просто, вот что последний часть делает.

Получение времени с заданным значением - нет, и вам, возможно, придется пересмотреть свой подход. Во-первых, можно иметь значение во время подкадров, но я предполагаю, что вы захотите проигнорировать это. Также вы пытаетесь сопоставить значение с плавающей запятой, что сложно в программировании. Поскольку значение 3,5 не будет соответствовать значению 3,5000001, что, вероятно, является типом значений, которые будет иметь кривая, поскольку она интерполирует между ключевыми значениями.

Но если вы настаиваете на этом, вам, вероятно, нужно сравнивайте значение в каждом кадре между первым / последним ключевым временем кривой. Когда вы сравниваете значение, вам может потребоваться некоторый порог, который считается приемлемым или достаточно близким, чтобы решить проблемы с точностью. Если он пройдет, вы можете добавить время к list и return позже.

Надеюсь, это укажет вам правильное направление.

...