3D打印切片软件支撑算法研究

一、为何需要自动支撑?

3D打印与传统模具制造方式不同,3D打印是增材制造,将模型整体分割成n层,逐层打印的过程,每一层是基于上一层的基础之上的累加。目前根据设备机构主要分为以下几个大类:FDM,LCD,SLM,SLA,DLP。
其中:
FDM也称耗材3d打印,主要材料为pla,abs等,如创想三维、anycubic,目前消费级机型售价大概1500–3000之间,各种变种,如最新比较潜力的“发光字打印机”、以水泥为打印材料,多彩色打印(以磨合为辅助,切片时记录纹理信息)
LCD为两年前开始出现的机型,属于光固化系列,材料为光敏树脂,精度比FDM高很多,可以打印的很精细,市面低端1500–3000如anycubic,浙江锐辰等,高端的上万元或以上,如Preform,诺瓦智能,金达雷等,目前局限是打印尺寸小,以及分辨率大多数为2k,少部分企业正在尝试4k屏,如能顺利即可解决水波纹、大尺寸等问题,将是一个新的提升
SLM为金属粉末烧结技术,材料为金属,精度非常高,可打印航空材料,都是有钱的大公司才会研发这样的设备,如先临
SLA激光束在液态树脂表面勾画出物体形状,层层打印出模型,速度比较慢,但精度较高,成本也较大,大公司sla设备以极光尔沃、大族激光等为主
DLP和LCD类似,但比LCD精度更高,利用数字光投影技术,目前成本较大,感兴趣的可具体去了解
为何要支撑?
3d打印,逐层累加,就无法避免层突变,即悬空打印,上一层无材料的情况下,突变当前层,无支撑时必然会“掉”到工作平台之上,导致打印失败。

  • 1、解决悬空的情况。
  • 2、防止特有的几何面被破坏,故意抬升添加支撑
  • 3、保持横截面变化均匀,受力均匀,以免模型内应力导致模型变形

二、扫描待支撑的区域

目前待打印模型多数为stl、obj、3mf等数字化模型文件,都是以三角面片为载体记录模型信息,模型文件的可视化效果如下:

很多切片软件中对三角面片的边不显示,看起来就为一体,对于用户来讲是透明的,而对于研发人员,三角面片才是数据的重点。 既然待打印模型都是三角面片的集合,应该如何寻找自动支撑的区域呢? 根据模型每个面片、每条边、给个顶点而言,具备局部的集合信息,需要对这些信息进行分析,分类,处理以达到支撑的效果。如典型的FDM,大多数都是基于curaengin为基础,很多人基于后面拓展。cura的支撑算法为,先分层切片,然后在当前层对比前面n层然后求差,得到当前层“超出”下方的部分,即为带支撑的部分,然后直接把支撑结构也进行切片,在打印过程中,一并打印。然而这种算法不适用于LCD类型设备,为何?因为LCD类型设备不可能打印这么多支撑,否则模型表面会全部磨坏,本身高精度的模型表面会稀巴烂。所以目前很多光固化设备的切片软件的自动支撑算法是:检测带支撑区域、然后对支撑区域进行采样支撑。

自动支撑常规步骤:

  • 1、检测模型的最低点
  • 2、检测模型的最低边
  • 3、检测法向量朝下的悬空面片
  • 4、对悬空面进行分区域处理
  • 5、对每个区域进行xy平面投影
  • 6、用栅格划分投影平面,然后得到栅格交点
  • 7、将交点利用重心坐标映射回模型的面片中
  • 8、将最低点+最低边+采样点组合为最终的支撑点
  • 9、生成支撑结构(如垂直结构、树状结构等)

检测模型的最低点:

如上图所示,模型非常复杂,怎么利用模型数据把最低点都检测出来呢?

如上图所示,Vi 点比邻域内vj点低,那么Vi就是局部最低点

int vn=mesh.vertexs.size();
for(int i=0;i<vn;i++)
{vector<int>neibors=mesh.neibors[i];vec vi=mesh.vertexs[i];int n=neibors.size();bool is_min_p=true;for(int j=0;j<n;j++){int id=neibors[j];vec vj=mesh.vertexs[id];if(vi[2]>=vj[2]){is_min_p=false;break;}}if(is_min_p){vertex_list.push_back(vi);}
}

检测最低边:

如上图所示,两个面片的公共边,en为边的法向量,由两个面片法向量fn加权平均求得,同时边与水平面的夹角alpha小于给定的阈值如45°,则认为是最低边

float angle=45*PI/180;
vec fn0=mesh.facenormal[i];
vec fn1=mesh.facenormal[j];
vec en=fn0+fn1;
normalize(en);
if(en DOT vec(0,0,1)<0)
{vec v0=mesh.vertexs[id0];vec v1=mesh.vertexs[id1];vec vp=v0-v1;float l0=len(vp);vp[2]=0;float l1=len(vp);float theta=acos(l1/l0);if(theta<angle){edges_lists.push_back(eid);}
}

检测悬空面片

int fn=mesh.faces.size();
for(int i=0;i<fn;i++)
{
vec fn=mesh.facenormal[i];
if(fn DOT vec(0,0,1)<0)
{
face_lists.push_back(i);
}
}

分区域:

set<int>flist;
set<int>check_flags;
vector<vector<int>>regionset;
for(auto item:face_lists)flist.insert(item);
while(!flist.empty())
{vector<int>region;queue<int> Q;auto it=flist.begin();Q.push(*it);check_flags.inset(*it);flist.erase(it);while(!Q.empty()){int id=Q.front();Q.pop();region.push_back(id);Face f=mesh.faces[id];for(int i=0;i<3;i++){int vid=f[i];vector<int>adsf=mesh.adjfaces[vid];for(auto fid:adsf){auto itf=check_flags.find(fid);if(itf!=check_flags.end())continue;auto itlst=flist.find(fid);if(itlst!=flist.end()){flist.erase(itlsl);Q.push(fid);}}}}if(region.empty())continue;regionset.push_back(region);
}

采样点重映射回网格

float step=2;
int fn=region.size();
for(int i=0;i<fn;i++)
{auto f=mesh.faces[i];auto&v0=mesh.vertexs[f[0]];auto&v1=mesh.vertexs[f[1]];auto&v2=mesh.vertexs[f[2]];int minx=min(min(v0[0],v1[0]),v2[0]);int miny=min(min(v0[1],v1[1]),v2[1]);int maxx=max(max(v0[0],v1[0]),v2[0]);int maxy=max(max(v0[1],v1[1]),v2[1]);int xsid=floor((minx-mesh.min[0])/step);int ysid=floor((miny-mesh.min[1])/step);int xeid=floor((maxx-mesh.min[0])/step)+1;int yeid=floor((maxy-mesh.min[1])/step)+1;for(auto n=xsid;n<=xeid;n++)for(auto m=ysid;m<=yeid;m++){vec v(mesh.min[0]+xsid*step,mesh.min[1]+ysid*step,0);flaot a,b,c;if(Point2DTo3D(v0,v1,v2,v,a,b,c)){vec p=a*v0+b*v1+c*v2;sample_lists.push_back(p);}}
}

三、生成支撑结构

支撑结构分多种,最常用的就是垂直方式,也有树状结构。垂直结构,比较牢固,但比较耗材,支撑也是成本。树状支撑比较省成本,但算法计算复杂,越往下根越少,趋于稀疏。

上面两幅图为一样的支撑点数量,生成的垂直支撑和树状支撑。 技巧:悬空区域大时建议用垂直支撑,更加牢固,稳定,若选用树状支撑,适当加粗枝干参数

四、自动支撑的局限与难点

  • 1、无法根据人为经验判断该处是否添加支撑
  • 2、复杂拓补结构的网格支撑非常困难
  • 3、建立网格拓补关系需要大量的内存消耗,大模型加支撑非常吃力,并导致渲染系统卡顿
  • 4、复杂模型的支撑碰撞检测相当繁琐
  • 5、支撑密度根据不同类型模型控制较为繁琐,需要不断测试,并无最合适的密度参数
  • 6、栅格采样法,会错过很多细小的特征,step跨度越大,错过概率越大,导致有些模型恰好都错过面片,支撑失败。后续升级为更好的支撑算法,支撑效果更理想。

3D打印切片软件支撑算法研究相关推荐

  1. 3D 打印切片软件 CuraEngine 介绍

    Scientists study the world as it is, engineers create the world that never has been. 跳至正文 首页 ← Mac下各 ...

  2. 3D打印切片软件补洞修复算法研究

    基于变分法的网格补洞算法 三维网格模型修复一直是计算机辅助几何设计领域中的一个重要领域,关于网格网格补洞算法也看过一些文章,也有很不错的修复效果.最近安排到一个任务关于3D打印模型修复功能,查阅了不少 ...

  3. CURA软件 3D打印切片软件 初次设置界面取消(忘记设置)后怎么再次进行设置

    CURA软件用来对3D模型进行切片,默认的ultimaker机型支持的平台和尺寸不适合所有机型,好多机型需要重新设置一下. CURA软件是ultimaker公司的产品. Ultimaker是一家总部位 ...

  4. 3D打印切片软件CuraEngine介绍 windows版本

    不再更新CuraEngine博文,ustc博客也已经注销.博客中图片无法显示的话,请转 http://www.wrighteaglehardware.tk/ . 最新进展可加群 187233472 讨 ...

  5. 3D打印切片软件Cura入门

    安装好之后,添加一台打印机,参数可以随便设置. Cura安装包: 链接:https://pan.baidu.com/s/1T1MBcZYBCVfhtFKDBjypmQ?pwd=2022  提取码:20 ...

  6. 3D打印切片软件cura的使用方法

    由于ANY CUBIC 无法在脱机的情况下打印stl文件,必须使用cura软件将STL文件转成gcode格式的文件. 使用的方法还是蛮简单的,具体如下: 1.下载cura 15.0.46并安装.密码: ...

  7. 3D打印切片软件--cura的二次开发(2)(界面分析与汉化)(修改版增加图片)

    转载:https://blog.csdn.net/qq_29701359/article/details/75070507 在上次把CUR软件从github网站clone下来并在windows8系统, ...

  8. 3D打印切片软件--cura的二次开发

    本来前段时间就要写的,只因为那会的收效比较小,有些东西还一窍不通,当然现在也还是有些不大明白,但是最起码刚刚跳出了cura主界面还是不枉这几天工作: 废话不多说了,就把最近我做过的东西,学到的东西以及 ...

  9. 20个最流行的3D打印机切片软件

    3D 打印切片机(Slicer)通过生成 G 代码为你的 3D 打印机准备 3D 模型,G 代码是一种广泛使用的数控 (NC) 编程语言. 3D打印切片软件的选择范围很广. 因此,为了帮助你找到最合适 ...

  10. RAMPS1.4 3D打印控制板:软件下载\连接\安装\测试

    RAMPS1.4 3D打印控制板:软件下载\连接\安装\测试 特别说明: 电源接反,电机驱动板接反将有可能烧毁芯片和电路,请再三确认后再进行通电. 如何使用: 1.需要用到的模块或器件: Arduin ...

最新文章

  1. java用户输入解析_Java中的3种输入方式实现解析
  2. 分布式锁实现:Redis
  3. ffmpeg多线程转码
  4. 【Android 逆向】加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 )
  5. 当人工智能掌管城市,会带来怎样的巨变?
  6. POJ3450 Corporate Identity —— 后缀数组 最长公共子序列
  7. redis连接池操作
  8. 安全终止MFC线程全
  9. 哪个更好的选择:克隆或复制构造函数?
  10. display:inline-block带来的问题及解决办法
  11. 如何获取屏幕分辨率呢
  12. System.Web.Helpers.Json 与 Newtonsoft.Json 的性能对比
  13. ubuntu18.10 编译安装caffe gpu版本
  14. PyQt5教程(七)——实现QQ登录界面(一、Qt Designer创建界面,Eric6创建项目)
  15. java题电影院售票设计报告_基于Java的电影订票网站的设计实现 任务书.doc
  16. 制作一个简单HTML西安旅游网页(HTML+CSS)
  17. OpenGL(十二)——Qt OpenGL绕着坐标轴旋转多边形
  18. 飞塔防火墙MIB-OID列表
  19. 【Response】全面总结并理解response
  20. 如何在网页中加入一条竖线

热门文章

  1. IT十八掌徐培成第一天笔记
  2. java ppt模板_java循环ppt模板
  3. php代码的网页框架,easyweb: easyweb是一个简单易用的php框架,实现了路由、容错等处理,集成composer代码生态,可快速创建中小型网站应用...
  4. STM32 RTC闹钟中断和唤醒待机模式
  5. 局域网SDN技术硬核内幕 二 从局域网到互联网
  6. 西门子S7-1200系列PLC Modbus通信的踩坑记录
  7. 如何解决MySQL闪退
  8. IBatis开发指南-夏昕
  9. 力扣(leetcode) 69. x 的平方根 (四种方法解决,总有一种是你会的~)
  10. 计算机病毒影响打印机,病毒捣乱影响网络打印机共享打印