我正在寫一個射線跟蹤器在Java中,我試圖實現折射,但我對我在這個問題上找到的信息感到困惑。如果我有一個用於入射光線的三維矢量,那麼表面法線作爲三維矢量給出,並且這兩種介質的折射率是指我需要應用哪些操作才能獲得透射光線的矢量?如何從傳入的向量和表面正常發現折射向量
0
A
回答
1
讓V_incedence是歸一化的輸入向量。令n1
和n2
爲兩個表面的折射率。你想計算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))));
}
}
相關問題
- 1. 未歸一化的折射向量
- 2. 如何訪問(int和字符串向量)映射的向量
- 3. 折射向量(光線追蹤)
- 4. 如何摺疊STL向量的子向量?
- 5. C++ - 返回常量對象的常量向量const的向量
- 6. 用列表(或常量向量)劃分列表(或向量)
- 7. 如何迭代常量向量?
- 8. 向量對映射
- 9. 如何從實現Trait的類型的向量創建Trait的新向量?
- 10. Matlab:如何從循環輸入向量?
- 11. 從SDL_Rect向量中傳輸SDL表面的問題
- 12. 連接正向和反向矢量
- 13. 如何從R中的現有向量(字符)創建兩個向量?
- 14. keras正向傳遞與張量變量作爲輸入
- 15. 指向常量常量的空指針
- 16. 實現結構向量和指針結構的向量
- 17. 如何將一個小常量載入一個向量?
- 18. 正常化具有負值的向量
- 19. 向量和字符串結構的向量不正確打印
- 20. TBB併發向量和STL向量之間的區別?
- 21. C++向量和列表插入
- 22. 如何遍歷向量向量
- 23. 從輸入文件填充向量的字符串向量
- 24. 如何從向量轉換爲常量數組
- 25. C++向量和插入
- 26. 插入向量
- 27. VHDL向量傳遞
- 28. 傳遞並推入MPI_Reduce中的向量
- 29. Flash和AGAL:如何正確插入法向量
- 30. 如何實現向量中的按鈕
http://en.wikipedia.org/wiki/Snell%27s_law#Vector_form –