2017-04-16 101 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--,正常指出,面对其射线命中。)