Ae表达式:反三角函数使物体指向另一物体;Math.atan2(y,x)表达式
舟午古法手K一遍过
2025年09月29日 17:11
收录于文集
共2篇
影视后期有多重要

注意,本期需要与上一期内容一起食用

欢迎回来,上期我们做了这个,三角形的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

即可达成效果

完结撒花

cut-off