我正在研究球体的光线追踪器,并且我试图实现照明功能来计算每条光线的光强度。我目前只是在计算漫反射:
给定射线R,球体S,R与S相交的点P和光源L
我理解使用Lambert定律计算漫反射,我需要光方向向量和法向量。
我知道我可以通过计算L - P得到光方向向量。我现在正在计算法线。
我知道我需要使用S变换矩阵的逆,但我不能从概念上理解反转S变换矩阵是什么,所以我希望得到一些如何做到这一点的指导。
答案 0 :(得分:1)
正如您对其他问题的回答所述,使用球体矩阵的逆矩阵会将由其变换的事物移动到球体空间中(球体位于原点[0,0,0])。
要计算法线,你可以使用S - 1将光线位置转换为球体空间,如果你没有使用anisotropic scalings,你可以将变换后的光线位置标准化以获得正常值:
我注意到有些人从P中心计算了正常值
这取决于数据存储的数据和空间。这种方式假设基元数据在世界空间中可用,因此球体由其中心和半径定义。从您之前的问题我假设您只有一个描述您的球体的变换矩阵。
并将其乘以球体的比例矩阵的平方,如下所示:normalize(inv(S.scale)* inv(S.scale)*(P - S的中心))。
平方反转使得缩放与其符号无关,例如当球体按-1
均匀缩放时,计算的法线将与未应用缩放的情况相同。当不平方缩放矩阵时,负缩放会导致法线指向相反的方向,并且(在适当的光照条件下)类似于球体的内表面(-shell)。