【发布时间】:2021-01-16 20:47:48
【问题描述】:
我在编写自己的光线追踪器时很开心。我在世界坐标上正确地做金属表面射线反射:
- 我在世界坐标中有一条入射光线,由
origin_point和direction_vector定义; -
inverse_transform_matrix * origin_point给出了对象空间中的光线原点,inverse_transform_matrix ^ direction_vector给出了对象空间中的光线方向(^是指没有平移的矩阵向量乘法)。 - 现在我在对象空间中进行计算以获取命中点并命中法线向量;
-
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 中,然后用我的眼睛看到一切都很好——矢量之间的角度正常,所有矢量都在同一平面上。我的眼睛不是数学证明,但经过这些计算渲染的图片很好。
但是:
由于我希望我的代码工作的方式,我想计算对象坐标中的反射光线方向,然后返回世界坐标。
我可以像以前一样计算对象空间中的反射矢量方向,但使用对象坐标:reflected_dir_vector = object_coords_direction_vector - 2*(object_coords_direction_vector • object_coords_normal_vector) * object_coords_normal_vector。现在我不知道应该使用什么矩阵来将此向量移动到世界坐标;我尝试了所有的直接、逆和转变换矩阵,但它们都给了我错误的反射方向。
我的错误在哪里?
我没有显示代码不要发布和过长的帖子。
谢谢。
【问题讨论】:
标签: math raytracing