【C++游戏引擎开发】《几何算法》(1):数学基础与射线相交检测

引言:为什么需要射线相交检测?

在计算机图形学、游戏开发和三维建模领域,​射线相交检测​(Ray Intersection Testing)是实现诸多核心功能的基础。无论是玩家的子弹命中判定、3D建模软件的物体选取,还是光线追踪中的光线路径计算,都需要快速判断射线与几何体是否相交。本文将深入浅出地解析其数学基础,并探讨常见几何体的相交检测方法。


一、数学基础概念

1.1 射线的数学表示

射线由起点​(Origin)和方向​(Direction)定义,参数化方程为:
R ( t ) = O + t D ( t ≥ 0 ) \mathbf{R}(t) = \mathbf{O} + t\mathbf{D} \quad (t \geq 0) R(t)=O+tD(t0)
其中 O \mathbf{O} O 是起点坐标, D \mathbf{D} D 是单位方向向量, t t t 表示沿射线方向的延伸距离。

1.2 关键向量运算

  • 点积(Dot Product)​ A ⋅ B = ∣ A ∣ ∣ B ∣ cos ⁡ θ \mathbf{A} \cdot \mathbf{B} = |\mathbf{A}||\mathbf{B}|\cos\theta AB=A∣∣Bcosθ,用于投影计算和角度判断。
  • 叉积(Cross Product)​ A × B \mathbf{A} \times \mathbf{B} A×B 生成垂直于两向量的法向量,在平面相交判定中起关键作用。

二、常见几何体的相交检测

2.1 射线与球体相交

球体方程 ( x − c x ) 2 + ( y − c y ) 2 + ( z − c z ) 2 = r 2 (x - c_x)^2 + (y - c_y)^2 + (z - c_z)^2 = r^2 (xcx)2+(ycy)2+(zcz)2=r2
将射线方程代入后展开,得到关于 t t t 的二次方程:
t 2 ( D ⋅ D ) + 2 t D ⋅ ( O − C ) + ( O − C ) ⋅ ( O − C ) − r 2 = 0 t^2(\mathbf{D} \cdot \mathbf{D}) + 2t\mathbf{D} \cdot (\mathbf{O} - \mathbf{C}) + (\mathbf{O} - \mathbf{C}) \cdot (\mathbf{O} - \mathbf{C}) - r^2 = 0 t2(DD)+2tD(OC)+(OC)(OC)r2=0
通过判别式 Δ = b 2 − 4 a c \Delta = b^2 - 4ac Δ=b24ac 判断相交情况:

  • Δ > 0 \Delta > 0 Δ>0:两个交点&#x

你可能感兴趣的:(C++游戏引擎开发知识点,c++,游戏引擎,算法)