在Ray Tracer Porgram中找到球体的法线

时间:2016-03-15 06:30:33

标签: normalization linear-algebra raytracing

我正在研究球体的光线追踪器,并且我试图实现照明功能来计算每条光线的光强度。我目前只是在计算漫反射:

给定射线R,球体S,R与S相交的点P和光源L

我理解使用Lambert定律计算漫反射,我需要光方向向量和法向量。

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

我知道我需要使用S变换矩阵的逆,但我不能从概念上理解反转S变换矩阵是什么,所以我希望得到一些如何做到这一点的指导。

1 个答案:

答案 0 :(得分:1)

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

要计算法线,你可以使用S - 1将光线位置转换为球体空间,如果你没有使用anisotropic scalings,你可以将变换后的光线位置标准化以获得正常值:

transform light position by inverted scaling matrix

normalize transformed light position

否则你需要使用反转缩放矩阵变换transformed light position

  

我注意到有些人从P中心计算了正常值

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

  

并将其乘以球体的比例矩阵的平方,如下所示:normalize(inv(S.scale)* inv(S.scale)*(P - S的中心))。

平方反转使得缩放与其符号无关,例如当球体按-1均匀缩放时,计算的法线将与未应用缩放的情况相同。当平方缩放矩阵时,负缩放会导致法线指向相反的方向,并且(在适当的光照条件下)类似于球体的内表面(-shell)。