2017-04-16 151 views
1

我正在3D空間中工作。我有一條射線,或者更具體地說,是3D空間中光線的起始和透射向量。我也有一個三角形,我知道這個三角形是被射線擊中的。用三角形表示我有三個三維點。我也可以很容易地計算出這個三角形的法線向量。在3D空間中反射三角形上的光線

現在我需要得到一個新的射線,這將是特定命中後的反射。

我也不知道三角形的接觸點在哪裏,但顯然必須考慮到獲得反射光線。那一點將成爲新射線的開始。

這在2D中很容易做,但我無法弄清楚如何在3D中做到這一點。

我使用C++和OpenFrameworks與ofxRay附加組件。

+0

一對於矢量代數,你喜歡增加兩個矢量還是採用點積? – Beta

+0

一個有用的思考方式可能是這樣的:平面的法線(三角形)和光線一起形成一個平面。在這個平面上,您可以檢索您熟悉的2D問題。所以,你可以找到這個二維空間,解決那裏的問題,然後轉換回來。這將在數​​學上等同於矢量代數公式(如@Beta指出的),這可能是最有效的(或至少在計算上是直接的)解決方法。 – jwimberley

回答

2

這個問題乾淨地分解成兩個問題:找到射線遇到三角形的點 - 這是反射射線的原點 - 找到反射射線的方向(矢量)。

設三角形的法向量爲n。描述的三角形的平面的方程爲

NX = K

可以通過堵塞三角形頂點到該方程中的一個確定ķ。入射光線的方程是

X =噸v + p

其中p是光線的原點,和v是它的(歸一化)方向。爲了找到射線的交點,就解決了這個對方程組,其歸結爲解決

Ñ(噸v + p)= K

爲T,則封孔回到射線的等式中。

要查找的反射光線的方向,我們必須扭轉平行的入射光線的組分與三角形的法線:

v ř = v + 2(VNv

(當心我以爲sign--,正常指出,面對其射線命中。)