查找从射线到3D贝塞尔曲线的距离

问题描述

我想知道是否有人知道如何找到从3D线段或射线到3D立方贝塞尔曲线的最小距离,或者Unity游戏引擎中是否内置了任何东西。

解决方法

计算将射线基点转换为(0,0)且方向变为OX的仿射变换

如果射线是由基点(rx0,ry0,rz0)和方向矢量(dx,dy,dz)定义的,且长度为len(归一化为1),则此变换的矩阵为:

  • (-rx0,-ry0,-rz0)移动-
  • 然后绕OZ轴旋转atan2(ry,rx)
  • 然后绕OY轴旋转acos(dz / len)

将此变换应用于贝塞尔曲线控制点

使用zer0导数方法(函数的最大值和最小值导数为零)计算曲线到OX轴的最小距离:

根据t编写平方距离的表达式:

SquaredDist(t) = by'(t)^2  + bz'(t)^2

通过SquaredDist计算dt的导数,建立方程式

SquaredDist' = 0

并针对t进行解决。

方程是5阶多项式方程,因此没有解析性,只有数值解(或细分方法)。

0..1间隔检查根,还分别检查Bezier曲线的终点和射线起点的距离。