光线追踪:物体坐标中的镜面反射
Raytracing: mirror reflection in object coordinates
我在编写自己的光线追踪器时很开心。我在世界坐标上正确地进行了金属表面光线反射:
- 我在世界坐标中有一条入射光线,由
origin_point
和 direction_vector
定义;
inverse_transform_matrix * origin_point
给出对象 space 中的光线原点,inverse_transform_matrix ^ direction_vector
给出对象 space 中的光线方向(我的意思是 ^
无平移的矩阵向量乘法)。
- 现在我在对象 space;
中进行计算以获得命中点和命中法向量
transform_matrix * hit_point
给我世界坐标中的生命值,(inverse_transform_matrix_transposed ^ hit_normal).normalized()
给我世界坐标中长度为 1 的 world_normal_vector
。
现在我可以在世界坐标中得到像镜子一样的反射光线方向: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
。还要确保您的矢量已标准化。
转换规范化向量不会产生规范化结果。
我在编写自己的光线追踪器时很开心。我在世界坐标上正确地进行了金属表面光线反射:
- 我在世界坐标中有一条入射光线,由
origin_point
和direction_vector
定义; inverse_transform_matrix * origin_point
给出对象 space 中的光线原点,inverse_transform_matrix ^ direction_vector
给出对象 space 中的光线方向(我的意思是^
无平移的矩阵向量乘法)。- 现在我在对象 space; 中进行计算以获得命中点和命中法向量
transform_matrix * hit_point
给我世界坐标中的生命值,(inverse_transform_matrix_transposed ^ hit_normal).normalized()
给我世界坐标中长度为 1 的world_normal_vector
。
现在我可以在世界坐标中得到像镜子一样的反射光线方向: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
。还要确保您的矢量已标准化。
转换规范化向量不会产生规范化结果。