在光线跟踪中生成折射光线

时间:2015-12-04 06:19:40

标签: raytracing

给定入射光线,法线向量和两个折射率。如何计算折射光线。我知道折射的理论方面。我只是不知道如何实现它。

该功能应该看起来像

vec refract(vec incident, vec normal, double index1, double index2);

注意:这不适用于家庭作业,所以随意发布任何代码,最好是在Java中

1 个答案:

答案 0 :(得分:0)

这是我用于爱好光线跟踪器的东西: // refraction for incident ray (i) into surface with normal (n), if total internal reflection occurs, then function // return false and output vector (r) is not changed // for example if we entering water from air then ior_ratio = IOR(air)/IOR(water) = 1.0003/1.3333 ... bool refract (const V3& i, const V3& n, R ior_ratio, T& r) { auto cos_i = dot(-i, n); auto cos_t2 = ((R) 1) - ior_ratio * ior_ratio * (((R) 1)- cos_i * cos_i); if (cos_t2 <= 0) return false; r = ior_ratio * i + ((ior_ratio * cos_i - sqrt(abs(cos_t2))) * n); return true; } 注意,让我感到困惑的是事件的方向,所以检查这是否是你所期望的,否则改变-i到i。此外,您可能需要考虑菲涅耳效应http://graphics.stanford.edu/courses/cs148-10-summer/docs/2006--degreve--reflection_refraction.pdf