关于利用表达式做出汽车发动机的活塞运动,步骤解析

1. 让曲轴一秒转一圈

给其Rotation添加表达式:-time*360

2. 让连杆的位置跟随曲轴运动

先把连杆的中心点移至底端,然后给其Position添加表达式

x = Math.sin(time*20)*60;
y = Math.cos(time*20)*60;
[transform.position[0]+x,transform.position[1]+y]

考虑到余弦函数、正弦函数的周期特性:一个周期为2π,所以要使其一秒转一圈,则

161020-sin

x = Math.sin(time*Math.PI*2)*60;
y = Math.cos(time*Math.PI*2)*60;
[transform.position[0]+x,transform.position[1]+y]

3.让连杆始终指向活塞

给连杆的Rotation添加表达式

a = transform.position;
b = thisComp.layer("活塞").transform.position; 
c = sub(b,a);
θ = Math.atan2(c[1],c[0]);
α = ( θ*180/Math.PI+90)

其中,c = sub(b,a)是向量b与向量a的差,如下图所示。

161021-c

θ = Math.atan2(c[1],c[0]) 是从x轴正向逆时针旋转到点c的度数,θ是弧度,不是角度,且小于0,如下图

161021-d

然后转换成连杆的Rotation,即α = (θ*180/Math.PI+90)

161021-e

4. 让活塞随连杆运动

先求Y方向,连杆与活塞的差值

x = thisComp.layer("连杆").transform.position[0];
a = x-640;
b2 = 200*200-a*a;
b = Math.sqrt(b2)

161021-g

最后给活塞的Position添加表达式

x = transform.position[0];
y = thisComp.layer("连杆").transform.position[1]-effect("Slider Control")("Slider");
[x,y]

最终如下图