• 《3D 数学基础》几何检测-最近点


    目录

    1. 直线上的最近点

    2. 射线上的最近点

    3. 点到平面的距离

    4. 圆或球上的最近点

    5. AABB上的最近点


    1. 直线上的最近点

    q'是距离q的最近点,也就是q在直线上的投影。

    其中p是直线上的点(向量表示),n是直线的法向量(单位向量),d是直线到原点的距离。

    2. 射线上的最近点

    其中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。

    3. 点到平面的距离

     其中q是平面外的点,平面公式是q·n=d. p是平面上的点,n是法向量。

    注意:和直线上的最近点公式是一样的。

    4. 圆或球上的最近点

    已知球心c和半径r,求q在球面的投影点q' 。d是c-q,其中加粗都是向量表示的点坐标。b是q到q'.

    5. AABB上的最近点

    AABB(Axis-Aligned Bounding Box,轴对齐的包围盒)是一个在三维空间中常用于表示物体边界的几何形状,通常由两个对角点(最小点和最大点)定义。要找到空间中的点到AABB上的最近点,可以使用以下方法:

    1. 检查点是否在AABB内部:

      • 如果点在AABB内部,那么点本身就是AABB上的最近点。
    2. 检查点是否在AABB的某个坐标轴上的区间内:

      • 对于每个坐标轴(x、y、z),检查点的坐标是否在AABB的最小坐标和最大坐标之间。如果是,那么点在该坐标轴上的投影就是AABB上的最近点。
    3. 否则,找到点到AABB上的最近点:

      • 对于每个坐标轴,如果点的坐标小于AABB的最小坐标,则将点的坐标设置为AABB的最小坐标;如果点的坐标大于AABB的最大坐标,则将点的坐标设置为AABB的最大坐标。
      • 现在,点的坐标就分别被截断到了AABB的各个坐标轴上的区间内,这就是AABB上的最近点。
    1. import numpy as np
    2. def closest_point_to_aabb(point, aabb_min, aabb_max):
    3. closest_point = np.copy(point)
    4. for i in range(len(point)):
    5. # Check if point coordinate is outside AABB
    6. if point[i] < aabb_min[i]:
    7. closest_point[i] = aabb_min[i]
    8. elif point[i] > aabb_max[i]:
    9. closest_point[i] = aabb_max[i]
    10. return closest_point
    11. # 示例用法
    12. point = np.array([2, 3, 4]) #
    13. # AABB
    14. aabb_min = np.array([0, 0, 0])
    15. aabb_max = np.array([5, 5, 5])
    16. closest = closest_point_to_aabb(point, aabb_min, aabb_max)
    17. print("最近点:", closest)

    待续。。。

    参考:35.几何检测_哔哩哔哩_bilibili

  • 相关阅读:
    导出Excel的技术分享-综合篇
    GAMES104 作业2-ColorGrading
    Markdown格式表情包大全最新整理分享
    Redis 常见问题
    杭电多校 7170 Package Delivery
    熟悉开机后登陆进入Linux系统和退出系统的过程。
    winapi获取鼠标指向当前元素
    概率论与数理统计(1)——基本概念
    HTML 学习笔记(五)超链接
    HDFS分布式文件系统
  • 原文地址:https://blog.csdn.net/jizhidexiaoming/article/details/133713981