关于利用表达式做出汽车发动机的活塞运动,步骤解析
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π,所以要使其一秒转一圈,则
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的差,如下图所示。
θ = Math.atan2(c[1],c[0]) 是从x轴正向逆时针旋转到点c的度数,θ是弧度,不是角度,且小于0,如下图
然后转换成连杆的Rotation,即α = (θ*180/Math.PI+90)
4. 让活塞随连杆运动
先求Y方向,连杆与活塞的差值
x = thisComp.layer("连杆").transform.position[0]; a = x-640; b2 = 200*200-a*a; b = Math.sqrt(b2)
最后给活塞的Position添加表达式
x = transform.position[0]; y = thisComp.layer("连杆").transform.position[1]-effect("Slider Control")("Slider"); [x,y] 最终如下图