小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
效果图
想法
自动定向(朝向)相机是一个在 After Effects 中有很多用途的 3D 技术。有时候,如果自动定向只影响层的 y 轴效果会更好。在这些情况下,你可能希望物体转向并面对相机,但也要保持它与地平面的垂直关系(如果你想让图层保持垂直方向的话)。
如果你看一下上方的三幅动图,你就会发现问题所在。顶部的动图显示了一个相机移动,垂直层没有自动定向应用。很明显,场景中的物体都是纸一样薄的 “剪纸” 。
在中间的动图中,自动定向相机已经被应用到熊和树上。这当然有助于维持 3D 错觉,但你可以看到,随着摄像机向上移动,角色的脚失去了与地面的连接点。
在底部的动图中,每一层都被限制只在 y 轴上朝向相机,保持与地平面的接触。
所以我们在这里想做的是这么一个表达式,它将导致一个层在它的 y 轴上旋转,面向摄像机,但不影响层的 x 或 z 方向。
设计
事实证明,用一点三角学知识,你可以构造一个相当简单的表达式来完成这项工作。
技巧是投影连接图层锚点和摄像机中心的线,然后计算投影和世界 x 轴之间的角度。很简单, 对吧?
首先,我们需要从 图层在世界空间中的位置 中减去 摄像机在世界空间中的位置 。这给了我们一个连接图层中心和摄像机中心的 3D 矢量。如果该层或摄像机是另一层的子层,我们将使用我们的老朋友 toWorld() 层空间变换将 层的锚点 和 摄像机的中心([0,0,0]) 转换为世界坐标,然后再做减法。在我们计算出矢量后,结果是它的 x 和 z 分量是我们计算 y 旋转角度(使层面向相机)所需要的。
下面是表达式(将它应用到图层的 y 旋转属性):
表达式
delta = toWorld(anchorPoint) - thisComp.activeCamera.toWorld([0,0,0]);
radiansToDegrees(Math.atan2(delta[0], delta[2]))