小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
效果图
一个带单点光的合成且没有衰减的模拟
同样的合成且光衰减表达式应用到高光和漫反射属性
注意,当图层远离光线时,它们会变得更暗
想法
在 After Effects 中使用 3D 照明的一个挑战是 —— 光的强度不会随着距离的增加而减少。在现实世界中,光的强度随到光的距离的平方而衰减。我们想要做的是为这个自然现象想出一个令人信服的模拟。应该有变量,一来能允许我们指定光随距离衰减的快慢,二来层必须离光有多近,才没有衰减。
设计
当你将一个图层转换为 3D 时,它会拾取一些新的属性(这些属性与该图层对场景中的灯光的响应有关)。我们将使用其中的两个属性,“Diffuse”(漫反射) 和 “Specular”(高光),来创建我们的模拟。我们将把表达式应用到这两个性质上。为了简单起见,我们假设场景中只有一个光。我们将首先计算我们的图层离光线有多远。如果在 “无衰减” 阈值范围内,我们就什么都不做。如果超出了阈值,我们将随着距离的增加以指数形式减少参数值,使用 Math.exp() 进行计算。
表达式代码
decay = .005; ///< 光照随着距离增加的衰减率
noFalloff = 200; ///< 离光源在这个距离(像素)以内将没有衰减效果
L = thisComp.layer("Light 1");
/// @note 光源到本层的距离
d = length(L.transform.position, transform.position);
if (d < noFalloff) { ///< 无衰减
value;
} else { ///< 有衰减
value / Math.exp((d - noFalloff) * decay);
}