我正在出于教育目的构建一个简单的raytracer,并希望向对象添加折射。使用Snells定律,我能够在交点处递归地创建新射线。 raytracer当前仅支持球体,并且我使用一个场景,在该场景中,彼此嵌套的多个球体具有不同的折射率。
如果我从球体外部发出光线,一切似乎都很简单。首先从场景的折射率开始,然后在碰到第一个球体时,使用之前的折射率和球体 Material 的折射率来折射光线,直到到达下一个球体,依此类推。使用相交的法线,我可以确定是进入还是离开球体。
但是,我不明白应该如何处理球面叶子,以及如果射线不在场景的外部开始,该怎么办。
示例
您有三个球,从外到内的折射率分别为0.9、1.1和0.8。空气指数为1.0
最佳答案
从物理学的角度而不是从光线追踪的实现角度发布此内容:P。
斯涅尔定律指出,入射角与折射角的正弦之比等于边界两侧的两种介质的折射率之比的倒数。
因此,当射线接近新 Material 并且想要知道新 Material 中的角度时,您需要知道射线撞击新 Material 的角度,新 Material 的折射率以及折射率射线当前所在的 Material 的折射系数。
正如您说的那样,折射进入球体的效果很好,您必须已经知道每个球体和场景的折射指数。
我想说,创建折射率堆栈是处理一堆嵌套 Material 的好方法,因为当您移出堆栈时,您将不得不再次触摸插入堆栈的所有折射率套嵌套的球体。
关于确定离开球体时必须以什么折射率开始,您总是说sin(theta1)/sin(theta2)= [2的折射率]/[1的折射率]。因此,您需要当前所用 Material 的折射率和将要移动的 Material 的折射率。
如果我误解了您的问题,我们深表歉意,但希望对您有所帮助!
关于graphics - 当光线从嵌套对象开始时如何处理折射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3858662/