【问题标题】:Raytracing: mirror reflection in object coordinates光线追踪:物体坐标中的镜面反射
【发布时间】:2021-01-16 20:47:48
【问题描述】:

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

  • 我在世界坐标中有一条入射光线,由origin_pointdirection_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


    【解决方案1】:

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

    转换归一化向量不会产生归一化结果。

    【讨论】:

      猜你喜欢
      • 2017-03-26
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      相关资源
      最近更新 更多