Получение начальных и конечных ключевых кадров анимации в Maya Standalone (без пользовательского интерфейса)

Я пытаюсь получить первый и последний ключевые кадры анимации с помощью Maya Standalone. Если вы не уверены, Maya Standalone означает отсутствие пользовательского интерфейса. Это все чисто командная строка, и Maya не запущена; это означает, что некоторые вещи, которые вы обычно можете делать в Maya, требуют специальных обходных путей. Что я делал, так это использовал maya.mel.eval('setPlaybackRangeToMinMax'), но, к удивлению, к удивлению, это не работает в автономном Maya. Итак, я ищу способ установить минимальный и максимальный диапазон воспроизведения на основе существующей анимации с использованием pymel.core. Пока я не нахожу никакого успеха, и мне интересно, есть ли у кого-нибудь примеры этого. Большое спасибо заранее.


person Adam Benson    schedule 21.08.2020    source источник


Ответы (2)


Вы можете получить текущие диапазоны сцен с помощью следующего для pymel или cmds:

import pymel.core as pymel

pymel.playbackOptions(q=True, min=True)
pymel.playbackOptions(q=True, max=True)

import maya.cmds as cmds

cmds.playbackOptions(q=True, min=True)
cmds.playbackOptions(q=True, max=True)

Запуск его в пакетном режиме или интерфейсе не должен иметь значения. дополнительную информацию см. в документации. Информация.

Редактировать:

Вы пытаетесь получить диапазон первого и последнего ключевого кадра данного объекта? Если это так, вам нужно использовать cmds.keyframe. Вы можете передать объект, и он вернет список кадров со всех ключей. Оттуда вы можете отсортировать его, а затем получить первый и последний ключи, которые будут диапазоном, который вы ищете:

import maya.cmds

obj = "pSphere1"  # Object to check animation range with.
all_keys = sorted(cmds.keyframe(obj, q=True) or [])  # Get all the keys and sort them by order. We use `or []` in-case it has no keys, which will use an empty list instead so it doesn't crash `sort`.
if all_keys:  # Check to see if it at least has one key.
    print all_keys[0], all_keys[-1]  # Print the start and end frames

Если вы не хотите проверять все атрибуты, вы можете включить атрибут для проверки ключей. Так, например, предположим, что вы анимировали перевод сферы, вы можете получить все ее ключи от translateX следующим образом: cmds.keyframe("pSphere1.tx", q=True).

person Green Cell    schedule 21.08.2020
comment
Я пробовал это, но это возвращало только минимальный и максимальный диапазон воспроизведения, а не первый и последний ключевой кадр анимации на объекте. Допустим, например, что мой диапазон воспроизведения был от 1 до 120, но моя анимация началась с 58 и дошла до 1000. Когда я тестировал с параметрами воспроизведения (q = True, min/max = True), он возвращал диапазон 1-120, но не диапазон 58-1000. - person Adam Benson; 21.08.2020
comment
Хорошо, я думаю, я понял, вам просто нужен первый и последний ключ объекта. Я обновил свой ответ. - person Green Cell; 21.08.2020
comment
Ах! Похоже, мы пришли к похожим выводам! Большое спасибо за Вашу помощь! - person Adam Benson; 21.08.2020
comment
Здесь вы также можете выразить признательность за свое время, проголосовав за него :) - person Green Cell; 22.08.2020

Хорошо, после небольшого дальнейшего тестирования я смог заставить работать следующее.

# Assuming that I've already imported or opened an animation file and selected the object
import pymel.core as pmc

keyframes = pmc.keyframe(q=True, time=(-9999999, 9999999))
min_max = sorted(keyframes)
min = min_max[0]
max = min_max[-1]

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

person Adam Benson    schedule 21.08.2020