AEJoy —— 表达式之模拟光照衰减【JS】

439 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

效果图

一个带单点光的合成且没有衰减的模拟

099.gif

同样的合成且光衰减表达式应用到高光和漫反射属性

199.gif

注意,当图层远离光线时,它们会变得更暗

想法

在 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);
}