在光线追踪程序中寻找球体法线
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 ).
我正在研究球体的光线追踪器,我正在尝试实现一个照明函数来计算每条光线的光强度。我目前正在计算漫反射:
给定一条射线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 ).