从 Maya 中用户可编辑的开始和结束关键帧驱动约束权重

Driving constraint weights from user-editable start and end keyframes in Maya

我正在尝试通过在另一个对象上设置的特定开始和结束关键帧来驱动约束的 0-1。这些开始和结束关键帧位置可以由动画师更改。

例如,如果对象的第一个关键点是第 10 帧,最后一个关键点是第 100 帧,则约束在第 10 帧的强度为 0,然后在第 100 帧的强度为 1。

同样,如果对象上的第一个关键点为 0,最后一个关键点为 20,则约束在第 0 帧的强度为 0,然后在第 20 帧的强度为 1。

理想情况下,约束也可以读入动画曲线,因此它可以是线性过渡、缓入等。

我遇到的主要问题是如何动态读取开始和结束关键帧,以便在用户更改时间时更新约束权重。看起来表达式可能是要走的路,但我觉得它们播放起来会更慢。我不喜欢脚本工作,但这也可能是一种方式。我想我在一天结束时寻找的是 animCurve 的开始和结束关键帧的输出值。

这个有点棘手,因为通常的方法 - 表达式或驱动键 - 无法正常工作:动画曲线的 'start' 和 'end' 不是可以以通常的方式访问。

你可以试试用getAttr抓取关键时间的表达式。这是一个基本示例:

float $start = `getAttr pCube1_translateX.keyTimeValue[0].keyTime`;
float $end =  `getAttr pCube1_translateX.keyTimeValue[1].keyTime`;
float $pct = (frame - $start) / ($end - $start);
$pct = clamp(0, 1, $pct);
float $lerp =  linstep(0, 1, $pct);
pCube2.translateZ = $lerp;

这将在 pCube1 的 translateX 通道上的第一个和第二个键之间的间隔期间沿 Z 在 0 和 1 之间移动 pCube2

这可行——但它非常脆弱,除非您想扩展它以获取键的数量并在每帧 $end 中更新索引值。

我建议将问题抛在脑后,将这两项从某处的第三个人工参数中移除。那你可以使用更常规的表达方式或者SDK。