首页/文章/ 详情

有限元基础知识:接触计算中的包围盒子

12小时前浏览1

上次说到了采用bucket sorting的方式进行空间的分割,然后在所在的局部区域中进行搜索。其中无论是全局的整体范围确定,还是局部的接触快速检测,都离不开包围盒子,也就是bounding box的概念,我们一般会用bounding box进行接触的初筛,然后再用精确的接触检测算法确定接触对,与接触发生的单元。一般来说在有限元接触分析中有3种包围盒子比较常见,分别是:

  1. AABB(轴对齐包围盒):Axial Aligned Bounding Box
  2. OBB (有向包围盒): Oriented Bounding box
  3. k-DOPs(离散方向多面体包围盒): k-Discrete Oriented Polytopes

那么下面我就来分别介绍一下他们:

AABB(Axis-Aligned Bounding Box,轴对齐包围盒)

定义与特点

AABB是最简单的包围盒类型,其边与坐标轴平行,由物体在三维空间中的最小和最大坐标值(如 (x_min, y_min, z_min) 和 x_max, y_max, z_max)定义。它通过投影到坐标轴快速判断物体间的空间关系。

生成方法

遍历模型所有顶点,记录各轴方向的最大和最小值,构成包围盒的顶点。

接触检测

通过判断两个AABB在各坐标轴上的投影是否重叠:若所有轴均重叠则碰撞,否则无碰撞。二维场景中只需检查X、Y轴投影,三维则增加Z轴。

此方法的优点就是他计算非常简单且高效,但是对于物体在空间中胡乱分布,方向各异的情况,会导致包围盒子过大,检测出很多其实并没有接触的地方,在一定程度上会降低在包围盒接触检测后续精确检测的效率(因为需要的精确检测相对会对一些)。这种由于其简单好用,我用的最多。


OBB(Oriented Bounding Box,有向包围盒)**

定义与特点

OBB是带有旋转的包围盒,参数包括中心点、长宽高和旋转角度。相比AABB,它能更紧密地贴合旋转后的物体形状。也就是他基本上是“跟着物体的方向”,更紧凑。


生成方法

需计算物体的主方向(如通过协方差矩阵确定最优旋转角度),再沿主方向生成最小体积的包围盒。

接触检测

采用分离轴定理(SAT),通过检查两OBB在所有可能分离轴上的投影是否重叠。需遍历15条潜在分离轴(三维场景)。

与上边的AABB对应其优点就是精度高,可以尽可能的在包围盒子检测这一个层级解决问题,但是他本身的计算量也不小,且更新起来计算也比较复杂,一般来说我不用这种,我宁愿用AABB然后把更细节的检测直接留给精确的接触检测算法,但是在CAD中用的还挺多。


k-DOPs(k-Discrete Oriented Polytopes,离散方向多面体包围盒)**


定义与特点

k-DOPs通过k个固定方向的平面包围物体,形成凸多面体。例如6-DOPs即AABB,14-DOPs在AABB基础上增加对角线方向平面。

生成方法

沿k个固定方向计算物体的极值点,生成紧凑的凸包。例如14-DOPs需计算14个方向的极值。

接触检测

检查所有方向平面是否重叠。若所有方向均重叠则碰撞,否则无碰撞。可通过并行计算优化效率。

相对来说它等于是AABB和OBB中间的中庸者,在精度和效率上进行取舍,当想更精确检测的时候k就取大一点,当然这个时候计算复杂度也就高一些,但用户可以根据自己的需求自己调整。这种我用的也挺多


三者的对比与结合应用

类型      
计算复杂度      
精度      
适用场景      
典型应用      
AABB      
低      
低      
快速初步检测      
快速筛选      
OBB      
高      
高      
旋转物体、高精度检测      
CAD系统、物理引擎      
k-DOPs      
中      
中-高      
平衡精度与效率的复杂模型检测      
自动驾驶、碰撞检测、点云等      

个人来说比较倾向于用AABB与k-Dops,不过具体问题具体分析,朋友们可以根据自己的喜好自行选取,后续可以来一期直接上这三种代码的。


来源:大狗子说数值模拟
碰撞自动驾驶
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-05-09
最近编辑:12小时前
大狗子说数值模拟
博士 传播国际一流的数值模拟算法
获赞 7粉丝 13文章 56课程 0
点赞
收藏
作者推荐

使用cmake构建C++和Fortran

cmake是一个先进的现代化构建工具,其可以通过编写CMakeLists.txt文件,产生不同平台,支持不同编译器的构建文件,简化了不同平台的项目的编译和构建过程。实际上,不少开源软件均采用Cmake进行构建。本文首先介绍在用命令行的方式编译和运行C++和Fortran程序,然后用最基本的例子表明如何采用Cmake进行构建。在Windows系统下,在安装编译器时,通常会把编译器的安装路径写到系统环境变量里,这样我们可以直接在命令行里用编译器的exe名称启动程序。例如,在本机上安装了Vs和oneAPI2025,其中vs包含了对于C和C++的编译器cl.exe,打开oneApi安装目录下的命令提示符窗口,输入”cl”即可运行cl.exe,oneAPI包含了C++编译器icl.exe和Fortran编译器ifort.exe,因此输入相应的目录即可运行相应的编译器。这样,只要我们有了源代码,就可以直接在命令行里运行,不需要打开vs创建项目:编译器自带就把代码编译成了exe,接下来直接输入text1.exe即可运行。上面这种命令行的方式很简单,对于单个程序时也很方便,如果有多个程序,将多个程序直接写在后面即可,如“cltest1.cppa1.cppa2.cpp”当程序中调用了外部库时,我们当然依然可以采用命令行的方式来编译。但是,配置include路径,设置库文件的目录例如.lib等就很麻烦,而通过Cmake,编写一次CmakeLists文件,我们后续就可以不用重复设置,避免重复工作。在Windows下,安装好cmake后,我们可以通过打开cmake-gui用界面来进行cmake构建操作,也可以用命令行的方式进行构建。以下是一个例子:编写好源程序文件和CMakeLists.txt://cmake-test1.cpp#include<iostream>intmain(intargc,charconst*argv[]){std::cout<<"thisiscmake-test1\n";return0;}CMakeLists.txt中的内容:cmake_minimum_required(VERSION3.31.5)project(cpp1)add_executable(test1cmake-test1.cpp)在cmakeLists.txt共有3行内容,第一行是表明编译时cmake的最小版本,第二行创建了一个叫cpp1的项目,第3行是把cmake-test1.cpp文件加入到项目里,生成一个test1.exe的可执行文件。运行cmake-gui.exe,设置下cpp文件所在路径和希望生成的文件的路径,在先后点击Configure和Generate,就会在build目录下生成相应的解决方案文件。用vs打开cpp1.sln,把test1项目设为启动项目,即可运行。以上,即是对于C++采用cmake进行构建的过程。看起来似乎流程并不简要,但是实际上对于大型工程,能够简化不少。对于Fortran构建,一般还需要在CMakeLists中添加对Fortran的支持:cmake_minimum_required(VERSION3.31.5)project(fortran1)enable_language(Fortran)add_executable(cmake1fortran-cmake1.f90)上面是用Cmake构建C++和Fortran项目中的最基础例子,当然实际中CMAKE还有更多的知识需要学习,例如如何添加头文件路径,添加依赖库,指定各种编译选项,指定编译器等。在下一篇推文中,我们将介绍如何用Cmake工具完成大型稀疏矩阵特征值求解开源库Arpack的编译安装。以上,即是本文的全部内容,感谢您的阅读来源:大狗子说数值模拟

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈