当前位置: 首页 > news >正文

【C++游戏引擎开发】《几何算法》(2):OBB射线检测

一、基础坐标系定义

1.1 OBB参数表示

设OBB满足:

  • 中心坐标: C ∈ R 3 \mathbf{C} \in \mathbb{R}^3 CR3
  • 局部坐标轴:正交单位向量 { u , v , w } \{\mathbf{u}, \mathbf{v}, \mathbf{w}\} { u,v,w}
  • 半边长向量: e = ( e u , e v , e w ) \mathbf{e} = (e_u, e_v, e_w) e=(eu,ev,ew)

1.2 射线参数方程

全局坐标系下的射线表示为:
R ( t ) = O + t D , t ∈ [ 0 , + ∞ ) \mathbf{R}(t) = \mathbf{O} + t\mathbf{D},\quad t \in [0, +\infty) R(t)=O+tD,t[0,+)
其中 O \mathbf{O} O为射线起点, D \mathbf{D} D为单位方向向量


二、 坐标系变换理论

2.1 变换矩阵构造

定义旋转矩阵:
M = [ u   v   w ] = [ u x v x w x u y v y w y u z v z w z ] \mathbf{M} = [\mathbf{u}\ \mathbf{v}\ \mathbf{w}] = \begin{bmatrix} u_x & v_x & w_x \\ u_y & v_y & w_y \\ u_z & v_z & w_z \end{bmatrix} M=[u v w]= uxuyuzvxvyvzwxwywz
M \mathbf{M} M是正交矩阵,其逆矩阵为:
M − 1 = M T \mathbf{M}^{-1} = \mathbf{M}^T M1=MT

2.2 坐标变换公式

将射线转换到OBB局部坐标系:
O ′ = M T ( O − C ) \mathbf{O}' = \mathbf{M}^T(\mathbf{O} - \mathbf{C}) O=MT(OC)
D ′ = M T D \mathbf{D}' = \mathbf{M}^T\mathbf{D} D=MTD
此时OBB在局部坐标系中表现为AABB:
B = [ − e u , e u ] × [ − e v , e v ] × [ − e w , e w ] \mathcal{B} = [-e_u, e_u] \times [-e_v, e_v] \times [-e_w, e_w] B=[eu,eu]×[ev,ev]×[ew,ew]


三、 分离轴定理(SAT)的数学应用

3.1 候选分离轴集合

需要验证的分离轴包括:
A = { u , v , w } ∪ { D ′ × u ,   D ′ × v ,   D ′ × w } \mathcal{A} = \{\mathbf{u}, \mathbf{v}, \mathbf{w}\} \cup \{\mathbf{D}' \times \mathbf{u},\ \mathbf{D}' \times \mathbf{v},\ \mathbf{D}' \times \mathbf{w}\} A={ u,v,w}{ D×u, D×v, D×w}
共9个轴(其中3个叉积轴可能线性相关,但SAT仍要求全部验证)

3.2 投影计算模型

对任意分离轴 a \mathbf{a} a(需单位化):

3.2.1 OBB投影半径

r O B B = ∑ i ∈ { u , v , w } e i ∣ a ⋅ i ∣ r_{OBB} = \sum_{i\in\{u,v,w\}} e_i|\mathbf{a} \cdot \mathbf{i}| rOBB=i{ u,v,w}eiai

3.2.2 射线投影参数

{ o p = O ′ ⋅ a d p = D ′ ⋅ a \begin{cases} o_p = \mathbf{O}' \cdot \mathbf{a} \\ d_p = \mathbf{D}' \cdot \mathbf{a} \end{cases} { op=Oadp

http://www.dtcms.com/a/109518.html

相关文章:

  • 【总结】SQL注入防护手段
  • 【11408学习记录】[特殊字符] 三步攻克英语长难句:嵌套结构×平行结构全解析
  • Linux中系统安全及应用
  • axios取消重复请求
  • Java基础:面向对象入门(一)
  • 【AI News | 20250403】每日AI进展
  • Java 实现 字母异位词分组
  • 5. 数据交互基础:从文本加载到向量存储的完整流程
  • Nyquist插件基础:LISP语法-运算符
  • c++基础-----c++ 成员变量初始化顺序
  • Cline – OpenRouter 排名第一的CLI 和 编辑器 的 AI 助手
  • NVR设备ONVIF接入平台搭建城乡安防网:雪亮工程智慧监管体系建设方案
  • K8s面试第一篇:初识Kubernetes——核心概念与组件详解
  • win10彻底让图标不显示在工具栏
  • 【万字总结】前端全方位性能优化指南(完结篇)——自适应优化系统、遗传算法调参、Service Worker智能降级方案
  • dd爱框框
  • Fiddler抓取app的包
  • Design Compiler:库特征分析(ALIB)
  • Multisim14.3的安装步骤
  • 图解AUTOSAR_SWS_LINDriver
  • MySql表达式中字符串类型与整型的隐式转换
  • 3dgs通俗讲解
  • JavaScript逆向魔法:Chrome开发者工具探秘之旅
  • C语言--寻找子串的下标
  • 优雅的理解神经网络中的“分段线性单元”,解剖前向和反向传播
  • 量子计算与经典计算的拉锯战:一场关于计算未来的辩论
  • 3.2/Q2,GBD数据库最新文章解读
  • 开源可视化大屏go-view前后端安装
  • 文献分享: DESSERT基于LSH的多向量检索(Part2——理论保证的证明)
  • 《K230 从熟悉到...》识别机器码(AprilTag)