【UE5】判断点在向量左侧、右侧、线上

原理:
向量的叉乘,即求同时垂直两个向量的向量,即c垂直于a,同时c垂直于b(a与c的夹角为90°,b与c的夹角为90°)

c = a×b = (a.yb.z-b.ya.z , b.xa.z-a.xb.z , a.xb.y-b.xa.y)

在这里插入图片描述
一个点位(x,y)、一个向量(a,b)
通过将点位和向量叉乘,可以得到一条向上或者向下的向量或者为0的向量
在这里插入图片描述

根据UE4坐标得知,假设图中Point为点,X、Y轴为向量。
利用右手定则
如果点位和向量叉乘结果为向上,则点是在向量的右侧
如果点位和向量叉乘结果为向下,则点是在向量的左侧
如果如果点位和向量叉乘结果为0,则点在向量这条线上

只要做一个简单宏即可、
转成函数也行。
Point为点的坐标
Line为线的向量[向量是有方向的]
在这里插入图片描述

### 判断是否位于三角形内部的算法 在 Unreal Engine 中,判断一个 \(P\) 是否位于由三个顶 \(A\)、\(B\) 和 \(C\) 构成的三角形内部,通常可以采用 **重心坐标法** 或者 **向量叉积法** 来实现。 #### 方法一:重心坐标法 通过计算 \(P\) 的重心坐标来判断它是否处于三角形内部。如果重心坐标的分量均满足条件,则说明该在三角形内。 设三角形的三个顶为 \((Ax, Ay)\),\((Bx, By)\),\((Cx, Cy)\),待检测为 \((Px, Py)\)。可以通过以下公式计算重心坐标: \[ u = ((By - Cy)(Px - Cx) + (Cx - Bx)(Py - Cy)) / ((By - Cy)(Ax - Cx) + (Cx - Bx)(Ay - Cy)) \] \[ v = ((Cy - Ay)(Px - Cx) + (Ax - Cx)(Py - Cy)) / ((By - Cy)(Ax - Cx) + (Cx - Bx)(Ay - Cy)) \] \[ w = 1 - u - v \] 当且仅当 \(u \geq 0\),\(v \geq 0\),并且 \(w \geq 0\) 时, \(P\) 才位于三角形内部[^1]。 以下是基于此方法的一个 Unreal Engine 蓝图函数或 C++ 实现示例: ```cpp bool IsPointInTriangle(const FVector& A, const FVector& B, const FVector& C, const FVector& P) { float denominator = (B.Y - C.Y) * (A.X - C.X) + (C.X - B.X) * (A.Y - C.Y); float u = ((B.Y - C.Y) * (P.X - C.X) + (C.X - B.X) * (P.Y - C.Y)) / denominator; float v = ((C.Y - A.Y) * (P.X - C.X) + (A.X - C.X) * (P.Y - C.Y)) / denominator; float w = 1.0f - u - v; return (u >= 0.0f && v >= 0.0f && w >= 0.0f); } ``` #### 方法二:向量叉积法 另一种常用的方法是利用向量叉积的方向性来判断的位置关系。对于给定的三角形边 \(AB\)、\(BC\) 和 \(CA\),分别计算它们与目标构成的矢量之间的方向一致性。 具体来说,定义如下三个叉积表达式: \[ V_{AB} = (B - A) \times (P - A) \] \[ V_{BC} = (C - B) \times (P - B) \] \[ V_{CA} = (A - C) \times (P - C) \] 如果这三个叉积的结果同号(即均为正数或者负数),则表明 \(P\) 处于三角形内部;否则不在其中[^2]。 对应的 Unreal Engine C++ 实现可能如下所示: ```cpp float CrossProduct2D(FVector Vec1, FVector Vec2) { return Vec1.X * Vec2.Y - Vec1.Y * Vec2.X; } bool IsPointInsideUsingCrossProducts(const FVector& A, const FVector& B, const FVector& C, const FVector& P) { FVector AB = B - A; FVector AP = P - A; float crossAB_AP = CrossProduct2D(AB, AP); FVector BC = C - B; FVector BP = P - B; float crossBC_BP = CrossProduct2D(BC, BP); FVector CA = A - C; FVector CP = P - C; float crossCA_CP = CrossProduct2D(CA, CP); bool isSameSign_AB_BC = FMath::Sign(crossAB_AP) == FMath::Sign(crossBC_BP); bool isSameSign_BC_CA = FMath::Sign(crossBC_BP) == FMath::Sign(crossCA_CP); bool isSameSign_CA_AB = FMath::Sign(crossCA_CP) == FMath::Sign(crossAB_AP); return isSameSign_AB_BC && isSameSign_BC_CA && isSameSign_CA_AB; } ``` 以上两种方式均可用于解决 UE 中关于是否落在指定平面三角形内的判定问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值