中EN
概念页

直线与平面求交

Line & Plane Intersections

本页收录 RTR4 第 22.15~22.16 节的基础几何工具:二维直线/光线/线段求交(垂直点积法与无除法的早期拒绝法)、三维直线求交与异面直线最近点,以及三个平面的交点公式(可用于求 k-DOP 等平面围成凸体的角点)。这些在游戏中常用于射线检测、二维几何、碰撞与包围体构建。

二维:垂直点积法(22.15.1 节)

两直线 r1(s)=o1+sd1\mathbf{r}_1(s)=\mathbf{o}_1+s\mathbf{d}_1、r2(t)=o2+td2\mathbf{r}_2(t)=\mathbf{o}_2+t\mathbf{d}_2。利用垂直向量 a⋅a⊥=0\mathbf{a}\cdot\mathbf{a}^{\perp}=0,两边分别点乘 d2⊥\mathbf{d}_2^{\perp}、d1⊥\mathbf{d}_1^{\perp} 消去另一个参数:

s=(o2−o1)⋅d2⊥d1⋅d2⊥,t=(o1−o2)⋅d1⊥d2⋅d1⊥s=\frac{(\mathbf{o}_2-\mathbf{o}_1)\cdot\mathbf{d}_2^{\perp}}{\mathbf{d}_1\cdot\mathbf{d}_2^{\perp}},\qquad t=\frac{(\mathbf{o}_1-\mathbf{o}_2)\cdot\mathbf{d}_1^{\perp}}{\mathbf{d}_2\cdot\mathbf{d}_1^{\perp}}

d1⋅d2⊥=0\mathbf{d}_1\cdot\mathbf{d}_2^{\perp}=0 时平行。有效范围:直线任意;光线 s,t≥0s,t\ge0;方向归一化、长度 l1,l2l_1,l_2 的线段 0≤s≤l10\le s\le l_1、0≤t≤l20\le t\le l_2;若令 d1=p2−p1\mathbf{d}_1=\mathbf{p}_2-\mathbf{p}_1 等端点差,则 0≤s,t≤10\le s,t\le1。

二维:无除法线段测试(Antonio)

令 a=q2−q1\mathbf{a}=\mathbf{q}_2-\mathbf{q}_1,b=p2−p1\mathbf{b}=\mathbf{p}_2-\mathbf{p}_1,c=p1−q1\mathbf{c}=\mathbf{p}_1-\mathbf{q}_1,d=c⋅a⊥d=\mathbf{c}\cdot\mathbf{a}^{\perp},e=c⋅b⊥e=\mathbf{c}\cdot\mathbf{b}^{\perp},f=a⋅b⊥f=\mathbf{a}\cdot\mathbf{b}^{\perp},则 s=d/fs=d/f,t=e/ft=e/f;f=0f=0 时共线。由于分母相同且不需要显式的 s,ts,t,用比较代替除法:f>0f>0 时若 d<0d<0 或 d>fd>f 则不相交;f<0f<0 时若 d>0d>0 或 d<fd<f 则不相交;对 ee 同样测试,都通过则相交。比上一方法更快(更多比较和早期拒绝,避免除法),有整数版本源码。

三维直线(22.15.2 节)

三维中用叉积(a×a=0\mathbf{a}\times\mathbf{a}=\mathbf{0})代替垂直点积:两边减去原点后分别叉乘 d2\mathbf{d}_2、d1\mathbf{d}_1,再点乘 d1×d2\mathbf{d}_1\times\mathbf{d}_2,得

s=det⁡(o2−o1,  d2,  d1×d2)∥d1×d2∥2,t=det⁡(o2−o1,  d1,  d1×d2)∥d1×d2∥2s=\frac{\det(\mathbf{o}_2-\mathbf{o}_1,\;\mathbf{d}_2,\;\mathbf{d}_1\times\mathbf{d}_2)}{\lVert\mathbf{d}_1\times\mathbf{d}_2\rVert^2},\qquad t=\frac{\det(\mathbf{o}_2-\mathbf{o}_1,\;\mathbf{d}_1,\;\mathbf{d}_1\times\mathbf{d}_2)}{\lVert\mathbf{d}_1\times\mathbf{d}_2\rVert^2}

分母为 0 表示平行;两直线异面(不共面)时,ss、tt 给出两条直线上最近点的位置。当作线段使用时检查 0≤s≤l10\le s\le l_1、0≤t≤l20\le t\le l_2。健壮处理特殊情况的完整解法与源码见 Rhodes。

三平面交点(22.16 节)

三个平面以单位法线 ni\mathbf{n}_i 和平面上任一点 pi\mathbf{p}_i 给出,唯一交点

p=(p1⋅n1)(n2×n3)+(p2⋅n2)(n3×n1)+(p3⋅n3)(n1×n2)∣n1  n2  n3∣\mathbf{p}=\frac{(\mathbf{p}_1\cdot\mathbf{n}_1)(\mathbf{n}_2\times\mathbf{n}_3)+(\mathbf{p}_2\cdot\mathbf{n}_2)(\mathbf{n}_3\times\mathbf{n}_1)+(\mathbf{p}_3\cdot\mathbf{n}_3)(\mathbf{n}_1\times\mathbf{n}_2)}{|\mathbf{n}_1\;\mathbf{n}_2\;\mathbf{n}_3|}

分母是三法线的行列式,有两个及以上平面平行时为零。平面以隐式形式 ni⋅x+di=0\mathbf{n}_i\cdot\mathbf{x}+d_i=0 给出时,取离原点最近的点最便宜:沿法线从原点发射光线 tnit\mathbf{n}_i 与平面相交得 t=−dit=-d_i,即 pi=−dini\mathbf{p}_i=-d_i\mathbf{n}_i(法线须为单位长度,did_i 是原点到平面的负垂直距离)。用合适的平面组合代入,可求出由 k 个平面组成的 k-DOP 等凸多面体的角点。

  1. realtime_rendering_4ed.pdf 第 22 章 Intersection Test Methods

相关页面

游戏数学相交测试基础与分离轴Intersection Test Fundamentals & Separating Axis相交测试判断两个对象是否相交(包含、边界相交或分离),有时还需要最近交点或穿透深度与方向,是碰撞检测、视锥剔除、拾取和光线追踪的基础。本页汇总 RTR4 第 22 章的通用工具:光线与曲面的表示、常见包围体定义(AABB、OBB、k-DOP、凸多面体、胶囊与菱形体)、分离轴测试 (SAT)、几何概率与表面积启发式 (SAH)、设计相交例程的经验法则,以及基于 GPU 的拾取。游戏数学光线求交测试Ray Intersection Tests光线求交用于拾取、光线追踪、地面高度查询等。本页给出四类经典测试:光线-球(代数解与带早期拒绝的几何优化解)、光线-盒(平板法与光线斜率法)、光线-三角形(Möller-Trumbore,直接从顶点求重心坐标与距离)、光线-多边形(先求平面交点,再投影到二维做交叉数测试)。共同思路是先做便宜的拒绝测试、推迟除法与开方、必要时降维。游戏数学包围体构建Bounding Volume Construction紧凑的包围体能降低相交测试成本:光线击中凸体的概率与其表面积成正比,拒绝永远不比相交慢,所以求交加速应最小化 BV 表面积;碰撞检测则常最小化体积。本页讲 AABB/k-DOP、包围球(AABB 法、Ritter 近似法、Welzl 最优法)、凸包(Quickhull)以及 OBB(PCA 法、数值最小化、Larsson 与 Källberg 的近优线性算法)的构建方法与取舍。游戏数学齐次坐标与矩阵约定Homogeneous Coordinates & Matrix Conventions实时渲染用 4×4 矩阵和四元素齐次坐标统一表示点和方向:方向向量 w=0,点 w=1。这样线性变换与平移可以合成为仿射变换并连乘。RTR4 采用列向量记法、右手观察坐标系;DirectX 采用行向量记法,书中强调这只是记法差异。游戏数学点与向量运算Points & Vector Operations游戏程序员最常用的数学是三维向量与矩阵(三维线性代数)。本页按 GEA 第 5 章整理点与向量的基础:坐标系与手性、点与方向的区别、标量乘与 Hadamard 积、加减、模长与归一化、点积与投影、叉积、伪向量与外代数,以及线性插值 (lerp)。贯穿全章的两条经验是:能在二维里想清楚的问题先在二维里想,以及能不开方就不开方。游戏数学几何图元的表示Geometric Primitive Representations除点、向量、矩阵、四元数外,游戏引擎还天天用到直线/射线/线段、球、平面、AABB、OBB、视锥和凸多面体区域。本页按 GEA 整理它们在内存中如何表示以及最基本的「点在内部吗」测试;各种求交与重叠算法见 RTR4 来源的相交测试系列页面。游戏数学光线微分与纹理足迹Ray Differentials & Texture Footprint光线微分 (ray differentials) 给每条相机光线附带两条在图像上偏移一个像素样本的辅助光线,借此估计交点处 \partial p/\partial x、\partial p/\partial y 和纹理坐标对屏幕坐标的导数,也就是纹理采样率(纹理足迹)。这是离线光线追踪器做纹理抗锯齿的基础;本页对应 PBRT 4e 10.1.1–10.1.3 及其延伸阅读,并对照实时光线追踪中的光线锥。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原