目录
q'是距离q的最近点,也就是q在直线上的投影。
其中p是直线上的点(向量表示),n是直线的法向量(单位向量),d是直线到原点的距离。
其中p_org是起始点,d是单位向量,t是自变量,可以无限大。
(1)先求自变量t, 点乘v·d结果就是t,因为v在d方向的投影就是点乘;
(2)带入公式p(t) = p_org + td即可求得q'=p_org + (d·(q-p_org))d。
其中q是平面外的点,平面公式是q·n=d. p是平面上的点,n是法向量。
注意:和直线上的最近点公式是一样的。
已知球心c和半径r,求q在球面的投影点q' 。d是c-q,其中加粗都是向量表示的点坐标。b是q到q'.
AABB(Axis-Aligned Bounding Box,轴对齐的包围盒)是一个在三维空间中常用于表示物体边界的几何形状,通常由两个对角点(最小点和最大点)定义。要找到空间中的点到AABB上的最近点,可以使用以下方法:
检查点是否在AABB内部:
检查点是否在AABB的某个坐标轴上的区间内:
否则,找到点到AABB上的最近点:
- import numpy as np
-
- def closest_point_to_aabb(point, aabb_min, aabb_max):
- closest_point = np.copy(point)
-
- for i in range(len(point)):
- # Check if point coordinate is outside AABB
- if point[i] < aabb_min[i]:
- closest_point[i] = aabb_min[i]
- elif point[i] > aabb_max[i]:
- closest_point[i] = aabb_max[i]
-
- return closest_point
-
- # 示例用法
- point = np.array([2, 3, 4]) #
- # AABB
- aabb_min = np.array([0, 0, 0])
- aabb_max = np.array([5, 5, 5])
-
- closest = closest_point_to_aabb(point, aabb_min, aabb_max)
- print("最近点:", closest)
待续。。。