在光线追踪程序中寻找球体法线

Finding Normal of Sphere in Ray Tracer Porgram

我正在研究球体的光线追踪器,我正在尝试实现一个照明函数来计算每条光线的光强度。我目前正在计算漫反射:

给定一条射线R,一个球体S,一个R与S相交的点P,以及一个光源L

我了解到,要使用朗伯定律计算漫反射,我需要光线方向矢量和法线矢量。

我知道我可以通过计算 L - P 得到光线方向矢量。我现在卡在计算法线上了。

我知道我需要使用 S 变换矩阵的逆,但我不明白 S 变换矩阵求逆的概念,所以我希望得到一些关于如何执行此操作的指导。

如您对其他问题的回答所述,使用球体矩阵的逆矩阵会将由它变换的事物移动到球体中 space(球体位于原点 [0,0,0]) .

要计算法线,您可以使用 S⁻¹ 将光线位置转换为球体 space,如果您不使用 anisotropic scalings,则只需将转换后的光线位置归一化即可获得法线:

否则,您需要使用反向缩放矩阵进行变换

I noticed that some people took the normal calculated from P - center of S

这取决于什么数据以及数据存储在什么地方 space。这种方式假设基元数据在世界 space 中可用,因此球体由其中心和半径定义。根据您之前的问题,我假设您只有一个描述球体的变换矩阵。

and multiplied it by the inverse of the sphere's scale matrix squared like so: normalize(inv(S.scale) * inv(S.scale) * (P - center of S)).

对倒数求平方使得缩放与其符号无关,例如当球体按 -1 统一缩放时,计算出的法线将与未应用缩放相同。当 不是 对缩放矩阵进行平方时,负缩放将导致法线指向相反的方向并且(在适当的光照条件下)类似于球体的内表面(-shell ).