AEJoy —— 表达式之接触检测【JS】

395 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

效果图

当每一层与另一层接触时,它们就会从黄色变成红色 096.gif

设计

我们在这里需要做的是创建一个循环,它将检查每个其他当前有视频内容的活动层,看看它们是否足够接近触发接触条件。在这种情况下,当它接近另一个图层时,我们只需要改变图层的颜色。我们将通过为填充效果颜色参数创建表达式来实现这一点。

在这种情况下,如果我们使用圆形,我们的设置将近似碰撞检测器,因为我们将使用两层之间的距离作为接近条件。即两层宽度之和的一半。

image.png

请注意,为了提高效率,一旦我们找到一个满足接触条件的层,我们就会想要跳出这个循环。

表达式代码

out = [1, 1, 0, 1]; ///< 未接触的颜色为黄色
 
for (i = 1; i <= thisComp.numLayers; i++){ ///< 遍历合成中的所有层
  if (i == index) continue; ///< 排除自己
  L = thisComp.layer(i); ///< 当前测试的层
  if (! (L.active && L.hasVideo)) continue; ///< 跳过那些未激活或者没有视频内容的层
  delta = (width + L.width)/2; ///< 设置接触条件所满足的距离
  if (length(position, L.position) <= delta){ ///< 小于该距离则被判定为 “接触”
    out = [1, 0.25, 0, 1]; ///< 接触的颜色
    break;
  }
}
out