1. 射线与平面求交
射线可以描述为:
p ( t ) = p 0 + t ∗ u → p(t) = p_0 + t*\overrightarrow{u} p(t)=p0+t∗u
其中,p0是射线的起始点,u是射线的方向向量(需要单位化),t是参数,表示射线上任意一点到起点的距离。
计算射线与三角形平面的交点的数学公式可以分为两部分:首先找到射线与三角形所在平面的交点,然后判断该交点是否在三角形内部。以下是详细的步骤和公式:
平面可以描述为:
n → ⋅ ( p − p 0 ’ ) = 0 \overrightarrow{n}\cdot(p-p_{0}^{’}) = 0 n⋅(p−p0’)=0
其中,p 是平面上的任意一点,n 是平面的单位法向量,p0' 是平面上任意一点(可以是三角形的任意一个顶点)。
为了找到射线与平面的交点,我们需要将射线的方程代入平面的方程中,并解出参数 t:
n → ⋅ ( p 0 + t ∗ u → − p 0 ’ ) = 0 n → ⋅ p 0 + t ( n → ⋅ u → ) − n → ⋅ p 0 ’ = 0 t ( n → ⋅ u → ) = n → ⋅ p 0 − n → ⋅ p 0 ’ t = ( n → ⋅ p 0 − n → ⋅ p 0 ’ ) / ( n → ⋅ u → ) \overrightarrow{n}\cdot(p_0 + t*\overrightarrow{u}-p_{0}^{’})=0 \\ \overrightarrow{n}\cdot p_0+t(\overrightarrow{n} \cdot \overrightarrow{u}) - \overrightarrow{n}\cdot p_{0}^{’} = 0 \\ t(\overrightarrow{n} \cdot \overrightarrow{u}) = \overrightarrow{n}\cdot p_0 - \overrightarrow{n}\cdot p_{0}^{’} \\ t = (\overrightarrow{n}\cdot p_0 - \overrightarrow{n}\cdot p_{0}^{’}) / (\overrightarrow{n} \cdot \overrightarrow{u}) n⋅(p0+t∗u−p0’)=0n⋅p0+t(n⋅u)−n⋅p0’=0t(n⋅u)=n⋅p0−n⋅p0’t=(n⋅p0−n⋅p0’)/(n⋅u)
如果 n · u ≠ 0(即射线的方向向量与平面的法向量不垂直),则可以求出 t 的值,进而求出交点 p(t)。
2. 判断交点是否在三角形内部
求出交点后,我们需要判断该交点是否在三角形内部。这可以通过重心坐标法来实现
啥是重心坐标:
如图,对于空间三角形P1、P2、P3内任一点P,必定唯一存在三个数w1、w2、w3,满足:
w 1 + w 2 + w 3 = 1 P = w 1 ∗ P 1 + w 2 ∗ P 2 + w 3 + P 3 w_1+w_2+w_3 = 1 \\ P = w_1 * P_1 + w_2 * P_2 + w_3 + P_3 w1+w2+w3=1P=w1∗P1+w2∗P2+w3+P3
则(w1,w2,w3)就称为此三角形上P点的(归一化)重心坐标。
重心坐标求解
构建方程组,求解P点坐标
{ w 1 + w 2 + w 3 = 1 P x = w 1 ∗ P 1 x + w 2 ∗ P 2 x + w 3 ∗ P 3 x P y = w 1 ∗ P 1 y + w 2 ∗ P 2 y + w 3 ∗ P 3 y = { P x − P 3 x = w 1 ∗ ( P 1 x − P 3 x ) + w 2 ∗ ( P 2 x − P 3 x ) P y − P 3 y = w 1 ∗ ( P 1 y − P 3 y ) + w 2 ∗ ( P 2 y − P 3 y ) w 3 = 1 − w 1 − w 2 \begin{cases} w_1 + w_2 + w_3 = 1 \\ P_x = w_1 * P_{1x} + w_2 * P_{2x} + w_3 * P_{3x} \\ P_y = w_1 * P_{1y} + w_2 * P_{2y} + w_3 * P_{3y} \end{cases} =\\ \begin{cases} P_x - P_{3x} = w_1 * (P_{1x} - P_{3x}) + w_2 * (P_{2x} - P_{3x}) \\ P_y - P_{3y} = w_1 * (P_{1y} - P_{3y}) + w_2 * (P_{2y} - P_{3y}) \\ w_3 = 1 - w_1 - w_2\\ \end{cases} ⎩
⎨
⎧w1+w2+w3=1Px=w1∗P1x+w2∗P2x+w3∗P3xPy=w1∗P1y+w2∗P2y+w3∗P3y=⎩
⎨
⎧Px−P