给定入射光线,法线向量和两个折射率。如何计算折射光线。我知道折射的理论方面。我只是不知道如何实现它。
该功能应该看起来像
vec refract(vec incident, vec normal, double index1, double index2);
注意:这不适用于家庭作业,所以随意发布任何代码,最好是在Java中
答案 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