【发布时间】:2020-12-05 11:23:14
【问题描述】:
我想知道是否有人知道如何找到从 3D 线段或射线到 3D 三次贝塞尔曲线的最小距离,或者 Unity 游戏引擎中是否内置了任何东西。
【问题讨论】:
-
您能否详细说明您的问题。您能否为您的问题添加更多信息。
我想知道是否有人知道如何找到从 3D 线段或射线到 3D 三次贝塞尔曲线的最小距离,或者 Unity 游戏引擎中是否内置了任何东西。
【问题讨论】:
计算仿射变换,将射线基点变换为(0,0,0),方向变为OX
如果光线由基点(rx0, ry0, rz0) 和方向向量(dx, dy, dz) 定义,长度为len(1 表示归一化),那么这个变换的矩阵是:
(-rx0, -ry0, -rz0) -OZ 轴旋转atan2(ry, rx)
OY 轴旋转acos(dz / len)
将此变换应用于贝塞尔曲线控制点
使用 zer0derivative 方法计算曲线到OX 轴的最小距离(对于函数的最大值和最小值,导数为零):
写出取决于t的平方距离表达式:
SquaredDist(t) = by'(t)^2 + bz'(t)^2
用dt计算SquaredDist的导数,做方程
SquaredDist' = 0
并针对t解决它。
方程是五阶多项式方程,所以没有解析,只有数值解(或细分方法)。
检查0..1区间内的根,同时分别检查贝塞尔曲线终点和射线起点距离。
【讨论】: