求射线与三角形的交点,并附代码

1. 射线与平面求交

射线可以描述为:
p ( t ) = p 0 + t ∗ u → p(t) = p_0 + t*\overrightarrow{u} p(t)=p0+tu
其中,p0是射线的起始点,u是射线的方向向量(需要单位化),t是参数,表示射线上任意一点到起点的距离。

计算射线与三角形平面的交点的数学公式可以分为两部分:首先找到射线与三角形所在平面的交点,然后判断该交点是否在三角形内部。以下是详细的步骤和公式:

平面可以描述为:
n → ⋅ ( p − p 0 ’ ) = 0 \overrightarrow{n}\cdot(p-p_{0}^{’}) = 0 n (pp0)=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+tu p0)=0n p0+t(n u )n p0=0t(n u )=n p0n p0t=(n p0n 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=w1P1+w2P2+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=w1P1x+w2P2x+w3P3xPy=w1P1y+w2P2y+w3P3y= PxP

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值