问题描述
我想知道是否有人知道如何找到从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曲线的终点和射线起点的距离。