You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

射线追踪:圆柱相交公式推导(求a、b、c)技术咨询

圆柱射线相交公式推导详解

基础定义

先明确所有变量含义(和你的定义对齐):

  • 射线:起点为 O,方向向量为 D(通常取单位向量),射线上任意点可表示为 P(t) = O + t*D,t > 0 为射线参数
  • 圆柱:起始端面点 C,轴向单位向量 V,半径 r;圆柱的核心约束是:空间点到圆柱轴线(过C且沿V方向的直线)的距离等于r

核心推导步骤

1. 建立距离约束方程

对于射线上的点 P(t),先计算向量 PC = P(t) - C = (O - C) + t*D,记 E = O - C(射线起点到圆柱起始点的向量),则 PC = E + t*D。

点到直线的垂直距离可通过叉积计算:因为V是单位向量,PC与V叉积的长度就是P(t)到圆柱轴线的距离。根据圆柱定义,这个距离等于r,平方后得到:

dot(PC × V) = r²

(注:dot(X)表示向量X的自身点积,即X·X,等于向量长度的平方)

2. 利用向量恒等式展开

使用向量叉积的平方恒等式:dot(A × B) = dot(A)*dot(B) - (A·B)²,代入A=PC、B=V,结合V是单位向量(dot(V)=1),可得:

dot(PC) - (PC·V)² = r²

将PC = E + t*D代入上式,得到:

dot(E + t*D) - ( (E + t*D)·V )² = r²

3. 展开整理为二次方程

将上式中的每一项展开,最终整理成标准二次方程 a*t² + b*t + c = 0 的形式:

系数a的推导

展开dot(E + t*D)得到 dot(E) + 2t*(E·D) + t²*dot(D);
展开( (E + t*D)·V )²得到 (E·V)² + 2t*(E·V)(D·V) + t²*(D·V)²;

将两项代入原等式,提取t²的系数:

a = dot(D) - (D·V)²

若D是单位向量(dot(D)=1),则简化为 a = 1 - (D·V)²,本质是射线方向向量D在垂直于圆柱轴向方向上的分量的平方长度。

系数b的推导

提取t的系数:

b = 2*[ (E·D) - (E·V)(D·V) ]

可进一步改写为 2*( E · (D - (D·V)V) ),即E与D垂直于V分量的点积的2倍。

系数c的推导

提取常数项(不含t的项),并移项整理:

c = dot(E) - (E·V)² - r²

其中dot(E) - (E·V)²是射线起点O到圆柱轴线的距离平方,因此c就是这个距离平方与半径平方的差值。

4. 与你提供的公式对应

对比你给出的公式:

  • 你的dot(V)是向量自身点积,因V是单位向量,故dot(V)=1,与推导一致
  • 你的|表示点积,所以D|V对应D·V,E|D对应E·D,完全匹配推导得出的a、b、c系数

补充说明

得到二次方程后,求解t并取正实根(仅t>0对应射线上的有效交点);若为有限高度圆柱,还需额外验证交点在圆柱轴向上的投影是否位于圆柱的高度范围内(即投影点在C到C + h*V之间,h为圆柱高度)。

内容的提问来源于stack exchange,提问作者xperaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:55:18