思路很简单,就是对星星底下的颜色进行取样,然后将取样点颜色赋予给星星,这里需要用到表达式sampleImage()
sampleImage(point, radius = [.5, .5], postEffect=true, t=time)
返回类型:数组 [4]。
参数类型:point 是数组 [2],radius 是数组 [2],postEffect 是布尔值,t 是数值。
对图层的颜色和 alpha 通道值进行采样,并返回指定点距离内像素的平均 alpha 加权值:[red, green, blue, alpha]。如果 postEffect 为 true,则采样值是渲染图层上的蒙版和效果后的图层的值;如果 postEffect 为 false,则采样值是渲染蒙版和效果前的图层的值。输入值 point 位于图层空间中;点 [0,0] 是图层中左上角像素的中心。输入值 radius 指定样本中心到采样矩形的边缘的水平和垂直距离。默认值会对一个像素采样。
注意:postEffect 参数指的是直接应用于图层的效果,而非间接应用的效果,例如调整图层。
注意:在表达式中使用 sampleImage 不再禁用多重处理。
通过案例来理解。新建3个颜色的solid,制造一个“多彩”的背景。新建形状层,选择矩形工具,双击矩形工具,可以得到一个填满整个图层的长方形,将该图层命名为color source,本身的颜色无所谓,因为我们要打开这个形状层的调整图层开关:
新建四芒星,k上动画。给其fill下的color添加表达式:
array = transform.position.value; thisComp.layer("color source").sampleImage(array, [100,100])
这里是将其自身的位置作为采样位置,100的采样半径可以让颜色变化比较平滑。然后我们就得到了文章开头图中的效果。
这里再扩展一下,如果这个四芒星是3D图层会怎样?
我们知道sampleImage(point,radius)中的采样位置point是数组[2],是一个二维数组,而如果是三维对象直接引用transform.position.value得到的是三维数组,表达式就会报错。
这里可以用一个新的办法就是splice() 。
splice() 方法用于插入、删除或替换数组的元素。
arrayObject.splice(index,howmany,element1,.....,elementX)
index 必需。规定从何处添加/删除元素。该参数是开始插入和(或)删除的数组元素的下标,必须是数字。
howmany 必需。规定应该删除多少元素。必须是数字,但可以是 "0"。如果未规定此参数,则删除从 index 开始到原数组结尾的所有元素。
element1 可选。规定要添加到数组的新元素。从 index 所指的下标处开始插入。
elementX 可选。可向数组添加若干元素。
我们将color下的表达式修改为:
array = transform.position.value.splice(toComp([0,0,0]),2); thisComp.layer("color source").sampleImage(array, [100,100])
splice()后的toComp([0,0,0])是最常用的默认值,从其中调取元素,因为只要x,y轴上的两个参数,所以howmany值给2,将z轴参数删掉不用,这样得到一个二维数组。然后以这个二维数组作为采样位置。
太棒啦,终于有地方解释清楚了