ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

三维泰森多面体实操指南:从点云到Abaqus仿真与3D打印

三维泰森多面体实操指南:从点云到Abaqus仿真与3D打印 上个月接到一个泡沫铝合金的仿真任务需要把CT扫描得到的1700万点云切成一组带厚度的多面体单元丢进Abaqus算裂纹扩展。第一次尝试直接用点云重建网格结果曲面网格弯弯曲曲根本没法作为计算单元。后来换成泰森多面体Voronoi 3D-V5.0先在点云上做密度聚类把聚类中心作为种子点生成三维Voronoi多面体再裁出外轮廓一个下午就把模型备齐了。这篇不打算写成软件说明书我想结合这次实操聊聊三维泰森多面体从生成到落地的完整逻辑包括几何原理、V5.0这次真正变了什么以及我踩过的几个坑适合做3D打印点阵填充、泡沫/多晶材料仿真、建筑表皮设计和多孔结构可视化的朋友参考。1. 泰森多面体在3D空间里的真正价值它解决的远不止“好看”1.1 一个点拥有的“势力范围”泰森多面体的几何本质三维泰森多面体说白了就是给空间中每个离散点划分“势力范围”。空间中任意一个位置归属于离它最近的种子点归属同一个种子点的所有位置拼在一起就构成一个凸多面体。生活里可以这样理解每个种子点是一所学校每个学生去离自己最近的学校上学学校之间的服务边界就是泰森多面体的面。在二维平面上这个边界是一条条线段到了三维空间边界变成一整片中垂面多个中垂面彼此切割最终围成一个封闭的多面体。这个几何定义看起来简单但实际建模时牵扯的细节相当多。一个三维Voronoi的顶点通常由四个种子点共同决定因为只有同时到四个点等距才能在三维空间中确定一个顶点位置。二维Voronoi的顶点只需要三个种子点算法上容易处理得多三维版本需要维护所有多面体之间的点、边、面三级邻接关系任何一个顶点的坐标稍有偏差就会引发连锁的拓扑错误。很多初次接触的人以为Voronoi 3D就是把二维算法加一个维度实际根本不是这么回事这也是为什么专门做三维泰森多面体的工具一直有存在的必要。1.2 为什么三维化比二维复杂得多二维Voronoi用经典扫描线算法几十行代码就能写一个像样的实现而且数值稳定性很好。三维Voronoi的复杂度来自几何和拓扑两个方面。几何方面种子点之间的中垂面在空间中可能呈现各种姿态平面与平面的交线、交点的计算要处理大量浮点精度问题拓扑方面每新增一个种子点影响的不只是周围几个相邻单元而是一整圈邻域的顶点重排、边分裂和面重组。处理这种动态拓扑变化时程序必须能判断“哪些边该合并、哪些面该删除”一旦判断错误导出的网格就会出现裂缝、自相交或者非流形边。还有一个很多人忽略的问题边界。纯数学意义上的Voronoi图是无限空间种子点最外层没有边界约束单元会向外无限延伸。做工程和设计时必须给它套一个外部轮廓把无限变成有限这又牵扯到裁剪、封闭、布尔运算等一系列操作。V5.0这次更新很大一部分精力就花在这些地方而不是单纯加速了算法本身。1.3 V5.0面向的真实使用场景和同事交流时发现Voronoi 3D工具的使用者主要分布在几个差异很大的领域但需求高度相似。材料仿真是最典型的场景尤其是多晶体材料和泡沫材料。如果手头有一套CT扫描点云想模拟裂纹如何在晶界或孔壁之间扩展就可以用密度聚类把点云划分成若干团簇每个团簇中心作为种子点生成Voronoi多面体单元。再在相邻单元之间的公共界面上插入cohesive单元就能在Abaqus里模拟裂纹沿界面扩展。这个流程我这次完整跑了一遍比之前手动切割网格省了至少两天时间。3D打印点阵填充是另一个大方向。通过控制种子点密度可以得到孔径从中心到边缘渐变的Voronoi晶格既能保证结构强度又能大幅减重。建筑和艺术领域也会经常用Voronoi做自由曲面表皮、空间隔断或者景观雕塑追求的是那种既有随机感又有秩序感的视觉效果。此外微透镜阵列、光学器件排布、生物组织建模等方向也会用到三维Voronoi。这些场景看起来天差地别本质上都在做同一件事把离散点转换成可控的、封闭的三维多面体集合。2. 从“能出图”到“能用”V5.0更新的功能拆解2.1 不再只有随机点多源种子点输入的打开方式V5.0之前的版本也支持输入种子点但基本只能读固定格式的坐标列表想从点云、网格或者密度场生成种子点都得到外部工具里先处理好。V5.0把种子点生成模块直接做进了主流程支持四种常见方式。直接导入点云坐标是最基础的用法适合手头已经有种子点数据的场景。如果只有一片区域轮廓、没有种子点可以用内置泊松盘采样生成均匀分布的种子点泊松盘采样可以避免点与点之间过于靠近生成的Voronoi单元不会出现太多退化的小碎块。权重场驱动是V5.0新增的重点用户可以导入一张灰度图或者标量场让种子点密度按照场值自动调整这样生成的多面体就能呈现“某个区域密集、另一个区域稀疏”的渐变效果对3D打印填充和力学仿真非常有用。还有一种方式是先对点云做聚类再取聚类中心作为种子点适合从CT扫描、三维重建结果这类大规模点云出发的场景。实际使用时要注意一个原则种子点的生成方式决定了结构的宏观分布形态这一步花的时间应该占整个流程的三分之一以上。我见过很多人直接拿原始点云灌进去生成Voronoi结果点过多导致计算爆炸或者点分布不均匀导致单元大小失控后来都回头补种子点处理这一步。2.2 求解器升级加权Voronoi与松弛收敛V5.0在求解层面引入了加权Voronoi支持这是一个对结果影响很大的功能。普通的Voronoi只考虑空间距离默认每个种子点“权力”相同加权Voronoi则允许给每个种子点设置不同权重权重大的点多占体积权重小的点少占体积。算法实现上支持乘性权重和幂距离两种方式乘性权重适用于控制多面体体积占比的场合幂距离在过渡带处理上更平滑。配合加权机制V5.0还内置了劳埃德Lloyd松弛迭代。简单说松弛迭代就是反复计算每个多面体的重心然后把这个重心当成新的种子点再重新生成Voronoi。多迭代几次后多面体的尺寸会越来越均匀整体结构从杂乱趋向规整。对泡沫材料仿真这类场景松弛迭代能让孔洞分布更接近真实泡沫的均匀性对艺术设计松弛迭代则能消除那种“个别单元特别大、旁边单元特别小”的突兀感。V5.0允许用户直接设置迭代次数也可以设定收敛阈值让程序在重心位移足够小时自动停止。2.3 边界裁剪终于不再“炸”重新设计的封闭模块旧版Voronoi工具最让人头疼的问题是边界处理。如果不做裁剪直接输出最外层单元会延伸到无穷远导出的模型根本不能用于3D打印或网格剖分。V5.0提供了一个相对完整的边界裁剪模块可以导入STL、STEP格式的几何轮廓也可以用内置的基本体长方体、球体、圆柱体作为裁剪域。裁剪完成后程序会自动把外露的开口面封闭使每个多面体都成为闭合实体。这个模块的底层逻辑是把裁剪拆成两步先做几何布尔裁剪再做拓扑修补。裁剪之后每一个被边界切过的多面体会产生一个新的外表面这些外表面必须与相邻多面体的外表面共享节点否则后续做网格剖分时会出现重复节点、裂缝等问题。V5.0在拓扑修补上做了不少优化我在实测中把裁剪域从简单的长方体换成带曲面的STL模型结果基本能一次通过非流形检测这在旧版本里是不敢想象的。2.4 支柱化、薄壳化、圆角过渡从几何体到可制造结构生成一堆多面体只是第一步真正落地到制造和仿真还需要后处理。V5.0把三种最常用的后处理做成了参数化操作。支柱化是把多面体的棱边提取出来替换成圆柱形连杆相当于把实体多面体变成一个空间梁架结构。这种结构在力学上效率很高打印出来又轻又强非常适合做点阵填充。薄壳化则是把每个多面体的面向内或向外偏移一个厚度只保留外壳内部挖空适合需要兼顾轻量化和表面硬度的场景。圆角过渡是对多面体的棱边进行倒圆角处理消除尖锐棱角。不要小看这一步Voronoi多面体的棱角位置往往是应力集中区直接打印或者拿去仿真裂纹很容易从尖角处萌生加了圆角之后应力分布会平滑很多。这三个操作在V5.0里可以叠加使用而且都支持参数化实时预览。我在做泡沫铝模型时就是先薄壳化然后对棱边做了圆角得到的结果已经可以直接进入拓扑优化流程了。2.5 网格自检与导出STL、OBJ、STEP、INP、GLB一次说清V5.0的导出模块把常见的三维格式基本都覆盖了不同目标场景该选哪种格式很多新手容易混淆这里整理了一张表导出格式适合场景注意事项STL3D打印、通用网格交换只保存三角面片颜色和材质信息会丢失OBJ渲染、动画、轻量查看可带法线和UV适合导入3ds Max、BlenderSTEPCAD建模、工程装配保留实体几何适合导入SolidWorks等INPAbaqus仿真需要先划分好有限元网格一般不直接导原始面片GLB/glTF在线查看、网页可视化模型轻量化后适合丢进浏览器和3D大屏除了格式V5.0还内置了网格质量检查可以检测非流形边、零体积单元、退化面片等问题并把问题位置高亮显示。这个功能建议每次导出前都跑一遍尤其是做仿真用的模型网格质量不过关会直接影响求解器收敛。3. 实操演示从点云到可仿真的Voronoi多孔结构3.1 第一步点云清洗与外轮廓提取这次泡沫铝合金的CT点云大概1700万个点里面混了不少噪声点。直接在原始点云上做任何操作都是浪费计算资源所以第一步永远是清洗。我习惯先把点云降采样到500万以内再用统计滤波去掉离群点最后用Alpha Shape算法提取外轮廓生成一个封闭的STL边界文件。这一步里降采样参数需要根据点云密度灵活调整如果点间距本身很小降采样比例可以大一些如果点本来就稀疏就不宜降太多否则轮廓细节会丢失。外轮廓提取是后续裁剪的前提。你也可以不自己提取轮廓直接导入已有的CAD外边界STL但注意边界文件必须是封闭流形不然裁剪时会出现漏面。V5.0允许用点云自带的边界估计功能生成包络面这对没有现成CAD模型的场景非常友好。3.2 第二步生成种子点不要直接拿原始点云当种子点很多人会问能不能直接把1700万个点全部当成种子点技术上是能的但完全没有必要。种子点数量直接决定多面体数量和网格密度几百万个单元在普通台式机上光内存就够呛后续Abaqus计算更是灾难。我的做法是先在点云上做基于密度的聚类把点云分成若干团簇然后取每一个团簇的重心作为种子点。这样既保留了泡沫结构的孔隙分布特征又把计算量降到了可控范围。这一步有两点经验。一是聚类半径要参考目标孔径大小来定我这次的目标孔径大概是1.2毫米聚类半径设成0.6毫米得到的种子点间距恰好合适。二是生成种子点之后可以先快速生成一次小范围Voronoi预览肉眼看下单元尺寸是否均匀、有没有特别大的空洞再决定要不要微调聚类参数。3.3 第三步生成多面体并做边界裁剪种子点准备好之后我在V5.0里设置生成参数时选了乘性加权Voronoi权重设为每个团簇的点数占比这样点多的区域多面体数量也多孔隙更密更接近真实CT扫描得到的泡沫铝结构。边界域导入第一步提取的STL外轮廓同时开启自动外扩。自动外扩会在轮廓外部额外生成一圈虚拟种子点保证最外侧多面体也被完整裁剪不会出现“半边悬空”的单元。生成时我用了20次Lloyd松弛迭代。对于泡沫铝这种偏随机分布的结构松弛次数不用太多5到20次足够如果是做规则点阵可以考虑30次以上但要注意松弛太多会牺牲随机性结构会变得过于规整失去泡沫材料的特征。3.4 第四步后处理与质量检查边界裁剪完成后我做了薄壳化和圆角处理。壁厚设成0.4毫米圆角半径0.15毫米这两个参数是根据后续3D打印的工艺能力定的。壁厚太薄打印时容易断太厚又失去减重意义圆角半径太小起不到消除应力集中的作用太大会把细小孔洞直接抹平。质量检查在这一步尤其重要。V5.0自带的检查工具跑下来识别出十来个非流形边主要发生在轮廓表面与多面体面贴合的狭长区域。我手动修复之后又跑了一遍检查确认零体积单元和退化面片都清零才进入导出环节。这个检查步骤别省仿真模型一旦带着非流形边进入Abaqus收敛失败的概率非常高排查起来会怀疑人生。3.5 第五步按目标选择导出格式同一个Voronoi模型在不同阶段可能需要不同的导出格式。如果直接给3D打印我导出为STL格式注意勾选二进制选项文件体积比ASCII小很多。如果后续要做有限元仿真我会在V5.0里先把多面体划分成四面体网格再导出Abaqus INP格式这样省去了在Abaqus里重新网格化的麻烦。如果只是为了快速查看效果、跟同事远程确认结构形态我会导出GLB格式丢到在线3D viewer里浏览器直接打开就能旋转查看不需要装任何专业软件。4. 边界、退化面与布尔我实际踩过的几个坑4.1 无界Voronoi的外框漂移第一次接触这个工具时我没有设置好虚拟种子点只给了一个外部裁剪域就开始生成。结果最外层多面体虽然被裁剪到边界内但形状非常奇怪——边界附近的单元会被拉得很长某些多面体顶角直接延伸到轮廓表面形成一大片极薄的“飞边”。这是因为最外层种子点没有外部竞争对手Voronoi自然会把势力范围扩展到边界附近导致边界单元变形。解决方法是做边界外扩。也就是在裁剪域外部额外放置一圈虚拟种子点让真实种子点只负责内部区域虚拟种子点负责吸收边界外部区域。V5.0现在把这个功能做成了默认选项自动在包围盒外排布虚拟点我建议不要关闭这个选项。如果你用的是旧版本需要在处理流程里手动加这一步。4.2 种子点接近共面时出现的退化几何这个坑比较隐蔽。当种子点恰好落在同一个平面附近时比如点云本身来自一个规则的扫描网格三个或四个种子点可能几乎共面这时候生成的Voronoi单元会出现极小的夹角、极薄的狭长面表面上看每个面都封闭但网格质量极差导到Abaqus里会出现负体积单元计算直接中断。遇到这种情况我的处理方式是给种子点坐标加一个微小的随机扰动幅度通常在点云平均间距的1%到2%。别小看这零点几毫米的抖动对Voronoi几何稳定性有很大提升。也可以用加权Voronoi给种子点设置不同权重打破几何对称性避免多胞共面。4.3 输入STL有孔洞或反向法向布尔运算必然失败边界裁剪模块再稳定也扛不住输入模型本身有问题。我踩过一次客户发来的外壳STL模型表面有几百个小孔估计是扫描建模时丢失的面片。V5.0裁剪时直接报错卡在布尔运算阶段。检查之后发现三角面片组成的封闭曲面里存在孔洞并且有部分面片法向朝内法向不一致会导致程序不知道哪一侧是实体内部布尔运算自然失败。建议在导入之前先跑一个网格修复流程把孔洞补上、法向统一、去除重叠面。很多主流建模软件都有自动修复功能花五分钟修复能省下来几小时的布尔排错时间。4.4 大样本计算内存和时间的平衡做200万到500万种子点时我一度以为V5.0卡死了后来才搞清楚是内存不足导致频繁交换页面。三维Voronoi的内存占用比想象中大得多每个多面体要保存顶点坐标、边连接关系、面邻接关系200万个单元动辄需要几十GB内存普通16GB内存的机器根本扛不住。我的建议是做大规模生成时分块处理。把整个空间切成若干小块每个小块单独生成再把分块结果拼接起来。V5.0支持这种分块并行的生成模式拼接处会自动处理共用边界。如果不需要那么精细的结构更简单的办法是降低种子点数量先看整体效果等确定宏观结构没问题之后再进行局部精细加密。4.5 松弛迭代不是越多越好看到松弛迭代能改善均匀性有人会把次数设成几百次结果生成出的Voronoi结构变成了类似泡沫或纤维组织的均匀网格反而失去了原本想模拟的那种随机分布特征。松弛迭代收敛很快通常二三十次之后重心位移就很小了再迭代下去只是浪费时间。做晶格设计时松弛太多会让每个单元都趋近于正六面体堆砌的形态失去Voronoi本身的有机感。我的经验是先跑一次5次迭代的小样看一眼效果再决定要不要加。5. 和Abaqus、3D打印、可视化工作流怎么配合5.1 为Abaqus cohesive仿真准备Voronoi多面体做多晶材料或者泡沫材料的断裂仿真时需要在相邻Voronoi单元之间插入cohesive界面层。V5.0在导出INP时可以同时生成邻接信息表记录哪些多面体共用同一面这个信息特别关键。具体操作流程是先在V5.0中把每个Voronoi单元划分网格并导出INP然后根据邻接表把两个相邻单元的共用面提取出来在这些面上插入零厚度cohesive单元。cohesive单元的法向必须垂直于界面且两侧节点的编号要保持一致这两个细节直接决定仿真能否收敛。手动处理时很容易在共用面编号上出错建议写个小脚本自动根据邻接表生成cohesive节点对。V5.0生成的邻接表可以直接导入Python处理我用不到一百行脚本就把几百个界面都生成了。5.2 3D打印渐变点阵的切片与工艺参数把Voronoi结构用于3D打印时壁厚、悬垂角度、孔洞直径这三个参数直接影响成败。壁厚小于0.4毫米时很多打印机打印起来容易断丝建议至少留0.6到0.8毫米孔洞直径小于0.5毫米时残留粉末清理会很困难尤其是SLS工艺激光很难把那么细的粉末烧结到实体上。悬垂角度也要注意Voronoi晶格里很多棱边是斜向的超过45度悬垂就需要添加支撑否则打印时会出现拉丝和坍塌。V5.0里可以开启悬垂检测把超出打印机能力阈值的面高亮出来提前调整角度或增加支撑结构。5.3 导出GLB做在线可视化与汇报工程汇报和跨团队协作时不一定每个人都装了专业三维软件。V5.0支持直接导出GLB格式这是glTF的二进制版本文件体积小浏览器原生支持。我通常会在V5.0里把面数简化到10万以下然后导出GLB上传到在线3D viewer或者自己的网页里客户用手机就能打开查看、旋转、测量。如果需要配合三维大屏展示也可以把GLB直接接入Cesium这类三维地球引擎把Voronoi结构放到场景里做空间可视化。导出前记得把单位统一成米否则在Web渲染引擎里会出现模型尺寸差1000倍之类的问题这个错误我犯过一次后来养成了导出前检查单位的习惯。6. 版本迭代带来的变化一点真实使用心得6.1 从批量生成到“可复现”的脚本工作流V5.0相比旧版最大变化不是某个单一功能而是把整个流程从“一次性手工操作”变成了“可复现的工作流”。我可以在V5.0里把种子点生成、边界裁剪、后处理、导出这一整套流程保存成脚本换一批点云数据之后只修改参数就能重新跑一遍。这个改动意义很大因为做工程项目时经常要反复调整参数对比方案手工重做一遍至少半小时脚本化之后几秒钟就出结果。6.2 我的调试节奏小样本试错全量计算我现在的习惯是先用500到1000个种子点快速跑一遍确认边界裁剪没有破洞、壁厚合适、整体结构满足要求再切换到全量计算。这样既能快速试错又不会浪费计算资源。V5.0支持把小样本参数直接放大到全量计算两种规模下生成的单元比例基本一致不会出现小样正常、放大后崩溃的情况。这一点对大规模计算特别重要可以省去很多次无意义的全量尝试。6.3 进一步扩展的方向目前V5.0生成的Voronoi还是静态结构下一步我希望它支持周期Voronoi单元也就是在三维空间无限重复排布的周期性结构这对材料等效性能计算、周期点阵设计都有用。另外一个方向是多尺度耦合——同一个模型里同时存在宏观网格和微观Voronoi结构两套尺度之间的界面过渡处理如果能自动化会对多尺度仿真带来很大帮助。当前版本还没完全解决这两个问题但工具迭代的方向已经很清楚了。就我自己的使用体验来说Voronoi 3D-V5.0已经把三维泰森多面体从“只能看”推到了“能用”的阶段剩下很多细节需要在真实项目的反馈里继续打磨。
返回列表