光线追踪:物体坐标中的镜面反射

Raytracing: mirror reflection in object coordinates

我在编写自己的光线追踪器时很开心。我在世界坐标上正确地进行了金属表面光线反射:

现在我可以在世界坐标中得到像镜子一样的反射光线方向:reflected_dir_vector = direction_vector - 2*(direction_vector • world_normal_vector) * world_normal_vector 是点积)。世界坐标中的命中点是我的新射线的原点。

现在我可以使用叉积检查入射光线和反射光线相对于法线(仍在世界坐标中)的角度,它们是相等的;我还可以将我的矢量导出到波前文件中,将其加载到 Blender 中,然后用我的眼睛看到一切都很好——矢量之间的角度没问题,所有矢量都在同一平面上。我的眼睛不是数学证明,但经过这些计算得到的渲染图很好。

但是:

我想计算目标坐标中的反射光线方向,然后返回到世界坐标,因为我希望我的代码以这种方式工作。

我可以像以前一样计算对象 space 中的反射矢量方向,但使用对象坐标:reflected_dir_vector = object_coords_direction_vector - 2*(object_coords_direction_vector • object_coords_normal_vector) * object_coords_normal_vector。现在我不知道应该使用什么矩阵将这个向量移动到世界坐标;我尝试了所有直接、逆向和转置变换矩阵,但它们都给了我一个错误的反射方向。

我的错误在哪里?

我不是在展示代码,因为代码太长了 post。

谢谢。

如果您的乘法实现正确,您应该使用局部到全局矩阵将反射从局部转换到世界 space。你应该这样做:transformation_matrix ^ reflection_vector。还要确保您的矢量已标准化。

转换规范化向量不会产生规范化结果。