2015-04-20 18 views
0

我正在寫一個射線跟蹤器在Java中,我試圖實現折射,但我對我在這個問題上找到的信息感到困惑。如果我有一個用於入射光線的三維矢量,那麼表面法線作爲三維矢量給出,並且這兩種介質的折射率是指我需要應用哪些操作才能獲得透射光線的矢量?如何從傳入的向量和表面正常發現折射向量

+0

http://en.wikipedia.org/wiki/Snell%27s_law#Vector_form –

回答

1

V_incedence是歸一化的輸入向量。令n1n2爲兩個表面的折射率。你想計算V_refraction。假設n是標準化的法向量。

V_refraction = r*V_incedence + (rc - sqrt(1-r^2(1-c^2)))n 
where r = n1/n2 and c = -n dot V_incedence. 
+0

感謝您的答覆。在第一行中,這意味着將V_incedence.multiply(r)的向量與n.multiply(rc-sqrt(1-r^2(1-c^2)))的向量相加。 – user2320239

+0

是的,確切地說。 –

0

我實現了這個在我的java光線追蹤看看https://github.com/bradforj287/brads-java-raytracer

private static double clamp(final double val, final double min, final double max) { 
    return Math.max(min, Math.min(max, val)); 
} 

private Vector3d getRefractionVector(final Vector3d I, final Vector3d N, final double ior) { 
    double cosi = clamp(-1, 1, I.dot(N)); 
    double etai = 1, etat = ior; 
    Vector3d n = N; 
    if (cosi < 0) { 
     cosi = -cosi; 
    } else { 
     double temp = etai; 
     etai = etat; 
     etat = temp; 
     n = N.multiply(-1); 
    } 
    double eta = etai/etat; 
    double k = 1 - (eta * eta) * (1 - (cosi * cosi)); 
    if (k <= 0) { 
     return Vector3d.ZERO; 
    } else { 
     return I.multiply(eta).add(n.multiply(((eta * cosi) - Math.sqrt(k)))); 
    } 
}