【问题标题】:Get Animation start and end keyframes in Maya Standalone (No User Interface)在 Maya Standalone(无用户界面)中获取动画开始和结束关键帧
【发布时间】:2020-08-21 06:41:26
【问题描述】:

我正在尝试使用 Maya Standalone 获取动画的第一个和最后一个关键帧。如果您不确定,Maya Standalone 意味着没有用户界面。这都是纯命令行,Maya 没有运行;这意味着您通常可以在 Maya 中执行的某些操作需要特殊的工作循环。 我正在做的是使用 maya.mel.eval('setPlaybackRangeToMinMax'),但令人惊讶的是,这在独立的 Maya 中不起作用。 因此,我正在寻找一种解决方法来设置最小和最大播放范围,基于现有动画,使用 pymel.core。到目前为止,我没有找到任何成功,我想知道是否有人有这方面的例子。非常感谢。

【问题讨论】:

    标签: python animation maya pymel


    【解决方案1】:

    您可以通过pymelcmds 获取当前场景范围:

    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)
    

    批量或界面运行它应该无关紧要。 Check out the docs 了解更多信息。

    编辑:

    您是否尝试获取给定对象的第一个和最后一个关键帧的范围?如果是这种情况,那么您需要使用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)

    【讨论】:

    • 我在尝试这个,但这只返回了播放范围的最小值和最大值,而不是对象上动画的第一个和最后一个关键帧。例如,假设我的播放范围是 1 到 120,但我的动画从 58 开始到 1000。当我使用 PlaybackOptions(q=True, min/max=True) 进行测试时,它会返回 1-120 范围,但是不是 58-1000 范围。
    • 好吧,我想我明白了,你只想要对象的第一个和最后一个键。我更新了我的答案。
    • 啊!看来我们得出了类似的结论!非常感谢您的帮助!
    • 在这里,您还可以通过投票来表达对自己时间的赞赏:)
    【解决方案2】:

    好的,经过进一步的测试,我能够得到以下工作。

    # 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 数据,因此我必须测试极端时间范围才能找到任何和所有关键帧,但它确实有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多