

欢迎回来,上期我们做了这个,三角形的Copies数量会随圆形和正方形之间的距离而增加,但这个效果只能让圆形在X轴上移动,一旦圆形在X轴上偏离,三角形就无法继续跟随圆形,三角形图层的长度也会产生错误:

本期我们要达到的效果是让三角永远从圆形指向正方形:

基本思路:和上期一样,依然用向量运算得出圆形Position和方形Position的差向量,计算得出差向量与坐标轴的夹角(命名为α),输出给三角形图层的Rotation(旋转属性)。
那么如何算出向量与坐标轴的夹角呢?
高中的时候我们学过三角函数,通过一个角度的sin(正弦)、cos(余弦)、tan(正切)等三角函数可以得出直角三角形内的边长。
而反三角函数就是通过边长来计算夹角的函数,以这个星星为例,我们要用α角的对边(物体的Y轴坐标)和邻边(物体的X轴坐标)来求出α角的角度。

通过Math.atan2(y,x)函数可以达到我们想要的效果,(atan就是数学中的arctan,也就是反正切函数。)
Math.atan2(thisComp.layer("A").transform.position[1],thisComp.layer("A").transform.position[0])
和往常一样,我们用一个文字层来显示该函数的输出值:



可以看出,当星星在Y轴上的时候输出正好是π/2,在X轴上的时候正好是π
下图为Math.atan2(y,x)函数输出值范围与向量落点的关系,(只做延伸理解,看不懂也没关系)

完整代码如下:
//命名两个位置属性,方便查看:
aPos = thisComp.layer("A").transform.position;
bPos = thisComp.layer("B").transform.position;
//定义vec为两向量的差向量
vec = sub(aPos,bPos);
//定义radians为差向量的弧度制:
radians = Math.atan2(vec[1], vec[0]);
//将弧度制转为角度制:
degrees = radiansToDegrees(radians);
if (degrees < 0) degrees += 360;
degrees+90;
//这里的+90可能与你的设定不符,可以自己尝试+90、-90、+180、-180
此时三角将与AB物体的连线平行

再把三角的Position指给正方形的Position

即可达成效果

