小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
效果图
想法
有时,让一个 3D 层只在面对相机时可见是很方便的。其中一个应用可能是当物体背对相机时,你想要显示一张不同的图像。
设计
有不同的方法来实现这一点,但在这里我们将重点创建一个不透明度 表达式,可以检测相机何时可以看到图层的正面。在这种情况下,我们希望不透明度为 100% 。当相机可以看到图层的背面时,我们希望不透明度为 0% 。一旦我们有了这样的表达式,我们就可以将它应用到代表对象前后的图层上,将后层在其 y 轴上旋转180度,然后将后层添加(parent)到前层(作为它的子级)。然后当我们旋转前层或环绕相机时,我们总是会看到正确的图像。我们还希望即使没有摄像机,这个表达式仍然能奏效。
为了实现这一功能,我们将利用表达式语言中一种非常方便(但不幸的是,有点难以理解)的特性 —— 层空间转换。
在本例中,我们将使用 toCompVec() 变换将指向层外( z 轴方向)的矢量转换为摄像机视图的坐标系统。然后我们需要检查这个变换的 z 分量。如果它是正的,则图层是面向相机的。如果是负的,图层就背对着相机。
注意,如果没有摄像机,toCompVec() 将矢量转换为合成的默认视图,所以它仍然可以工作。
这一切听起来非常复杂,但代码本身却看似简单。
表达式代码
以下表达式应用在图层的不透明度属性上
/// @note 将坐标从层空间转换到相机空间
/// [0, 0, 1] 表示指向层的 Z 轴方向的单位向量
/// [2] 表示取的是变换后的向量的 Z 分量
toCompVec([0, 0, 1])[2] > 0 ? value : 0 ///< 如果大于 0 则表示面向相机