我正在出于教育目的构建一个简单的raytracer,并希望向对象添加折射。使用Snells定律,我能够在交点处递归地创建新射线。 raytracer当前仅支持球体,并且我使用一个场景,在该场景中,彼此嵌套的多个球体具有不同的折射率。

如果我从球体外部发出光线,一切似乎都很简单。首先从场景的折射率开始,然后在碰到第一个球体时,使用之前的折射率和球体 Material 的折射率来折射光线,直到到达下一个球体,依此类推。使用相交的法线,我可以确定是进入还是离开球体。

但是,我不明白应该如何处理球面叶子,以及如果射线不在场景的外部开始,该怎么办。

  • 我可以只拿一堆折射率并在离开球体后立即向上移动一层吗?
  • 如果我从球体内部开始,如何确定必须从哪个折射率开始?

  • 示例

    您有三个球,从外到内的折射率分别为0.9、1.1和0.8。空气指数为1.0
  • 您的相机在球体外部,并指向球体的中心:
  • 的起始索引为1.0,首先用索引0.9击中外球,然后从1.0折射到0.9,并保存光线现在位于0.9 Material 中
  • ,您击中了中间球并注意到 Material 常数1.1,因为保存了0.9,所以您知道除了0.9
  • 外,您还必须从0.9折射到1.1并保存1.1。
  • 您击中了内球并从1.1折射到0.8,并且您已经保存了0.9、1.1和0.8
  • 您再次击中了内球(这次您退出内球,因此您检查了保存的值并知道必须切换回1.1)。
  • ...直到您不在

  • 当相机在球体内时,现在出现问题。您将不知道必须切换到什么折射率。
  • 最佳答案

    从物理学的角度而不是从光线追踪的实现角度发布此内容:P。

    斯涅尔定律指出,入射角与折射角的正弦之比等于边界两侧的两种介质的折射率之比的倒数。

    因此,当射线接近新 Material 并且想要知道新 Material 中的角度时,您需要知道射线撞击新 Material 的角度,新 Material 的折射率以及折射率射线当前所在的 Material 的折射系数。

    正如您说的那样,折射进入球体的效果很好,您必须已经知道每个球体和场景的折射指数。

    我想说,创建折射率堆栈是处理一堆嵌套 Material 的好方法,因为当您移出堆栈时,您将不得不再次触摸插入堆栈的所有折射率套嵌套的球体。

    关于确定离开球体时必须以什么折射率开始,您总是说sin(theta1)/sin(theta2)= [2的折射率]/[1的折射率]。因此,您需要当前所用 Material 的折射率和将要移动的 Material 的折射率。

    如果我误解了您的问题,我们深表歉意,但希望对您有所帮助!

    关于graphics - 当光线从嵌套对象开始时如何处理折射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3858662/

    10-11 01:04