cura-engine学习(3)

  目前,我们还在函数prepareModel中徘徊,因为这函数实在是太长了,近乎包含了整个数据处理过程。通过前面两篇,几何图形已经被导入到内存中,并且由一个simplemodel变成了一个optimizedmodel。现在程序拿起了屠刀,开始了切片过程。

  通常来讲,在3D打印中所说的slicer过程包含了切割几何体,连接多边形,生成Gcode的所有过程,但在此程序中,slicer步仅为生成切片的切割操作。每一个切包含若干个闭合平面多边形。这些多边形的产生分两步。第一,所有的三角形面片被切割成为一条线段;第二,将每层的线段连接起来形成闭合多边形。前篇所述的点-面对应关系可以帮助这一过程快速进行,因为两个相邻的面上的切割线段很有可能就是相邻线段。这段程序还可以帮助修补几何图形中的空洞,因此STL模型不需要那么完美。它也可以处理错误的法向量,所以它可以翻转线段来满足端点到端点的连接。slicer步骤之后我们得到了一系列闭合多边形,然后会用到clipper来处理这些多边形(clipper只可以处理2D闭合多边形)。这一段来自cura-engine github主页的介绍。

  切割过程代码在slicer.h和slicer.cpp这两个文件中。首先我们看其中的class slicer

1  SlicerSegment project2D(Point3& p0, Point3& p1, Point3& p2, int32_t z) const
2     {
3         SlicerSegment seg;
4         seg.start.X = p0.x + int64_t(p1.x - p0.x) * int64_t(z - p0.z) / int64_t(p1.z - p0.z);
5         seg.start.Y = p0.y + int64_t(p1.y - p0.y) * int64_t(z - p0.z) / int64_t(p1.z - p0.z);
6         seg.end.X = p0.x + int64_t(p2.x - p0.x) * int64_t(z - p0.z) / int64_t(p2.z - p0.z);
7         seg.end.Y = p0.y + int64_t(p2.y - p0.y) * int64_t(z - p0.z) / int64_t(p2.z - p0.z);
8         return seg;
9     }

  class slicer中的这段代码是计算一个三角形p0,p1,p2和平面z的相交线的过程。就算公式也比较简单粗暴,如下

  画得虽丑,但科学是美丽的,咳咳.。。。函数project2D所表达的就是上面的公式了,至于六种情况的分类,我们可以在构造函数slicer()里面找到。没错,就是那六排if-else

Slicer(OptimizedVolume* ov, int32_t initial, int32_t thickness, bool keepNoneClosed, bool extensiveStitching)   把优化过的几何体ov按照厚度(thickness)切割成片片即layer。函数的前大半部分计算了三角面上被切割得到的线段,这些线段只有起点和终点,之间没有什么联系。后小部分使用makepolygon函数将线段们连接成多边形。

1  for(unsigned int layerNr=0; layerNr<layers.size(); layerNr++)
2     {
3         layers[layerNr].makePolygons(ov, keepNoneClosed, extensiveStitching);
4     }

  那么makepolygon函数又如何呢,这是一个200多行的大函数。本篇只能学习一小部分,欲窥其全貌,要等到之后我们学习了class Polygons和class Polygon这些类之后才能领悟。本篇先看这一段:

 1  Polygons openPolygonList;
 2
 3     for(unsigned int startSegment=0; startSegment < segmentList.size(); startSegment++)
 4     {
 5         if (segmentList[startSegment].addedToPolygon)
 6             continue;
 7
 8         Polygon poly;
 9         poly.add(segmentList[startSegment].start);
10
11         unsigned int segmentIndex = startSegment;
12         bool canClose;
13         while(true)
14         {
15             canClose = false;
16             segmentList[segmentIndex].addedToPolygon = true;
17             Point p0 = segmentList[segmentIndex].end;
18             poly.add(p0);
19             int nextIndex = -1;
20             OptimizedFace* face = &ov->faces[segmentList[segmentIndex].faceIndex];
21             for(unsigned int i=0;i<3;i++)
22             {
23                 if (face->touching[i] > -1 && faceToSegmentIndex.find(face->touching[i]) != faceToSegmentIndex.end())
24                 {
25                     Point p1 = segmentList[faceToSegmentIndex[face->touching[i]]].start;
26                     Point diff = p0 - p1;
27                     if (shorterThen(diff, MM2INT(0.01)))
28                     {
29                         if (faceToSegmentIndex[face->touching[i]] == static_cast<int>(startSegment))
30                             canClose = true;
31                         if (segmentList[faceToSegmentIndex[face->touching[i]]].addedToPolygon)
32                             continue;
33                         nextIndex = faceToSegmentIndex[face->touching[i]];
34                     }
35                 }
36             }
37             if (nextIndex == -1)
38                 break;
39             segmentIndex = nextIndex;
40         }
41         if (canClose)
42             polygonList.add(poly);
43         else
44             openPolygonList.add(poly);
45     }

  这一段讲述了把刚才求得的线段们连接成多边形的故事。可以看到,首先选取一个线段,然后通过它所在的三角面,找到和其相邻的三角面,在找到相邻三角面上的线段,查看其是否匹配,依次进行下去,最后会回到最初的那个三角面上,连接结束。

  然而这种方法并不能完成所有的情况,比如几何体有一些缺陷什么的,后面的代码是针对各种情况所作的处理,这些目前还很难懂,因为在这之前要搞懂Polygon这个基础类到底是如何构建的。咱们下回分解。

时间: 2024-10-29 19:08:05

cura-engine学习(3)的相关文章

Google App Engine 学习和实践

这个周末玩了玩Google App Engine,随手写点东西,算是学习笔记吧.不当之处,请多多指正. 作者:liigo,2009/04/26夜,大连 原创链接:http://blog.csdn.net/liigo/archive/2009/04/26/4127055.aspx 转载请注明出处:http://blog.csdn.net/liigo 一,怎么想起来玩Google App Engine了呢? 近期想写一个小程序,以便在公司的电脑和家里的电脑之间随时共享数据.但是没有现成的server

游戏引擎Egret Engine学习笔记(一)

Egret是基于TypeScrpt语言的开发引擎,可以说是目前最易上手,而且执行效率也很高的游戏开发引擎了.最初接触Egret是在腾讯课堂里,当时老师使用命令行进行讲解,我也跟着在自己的电脑上试了试,安装了Egret Engine——就和安装其他应用程序一样选择好路径点击开始安装就行了,而且Egret很小,很快就装好了.安装好之后便验证是否安装成功,打开cmd,输入Egret然后按回车键,看是否出现command列表,出现就说明安装好了.如下图: 安装好之后当然要拿来使用了,我们立刻就拿这个工具

QLoo graphql engine 学习一 基本试用(docker&amp;&amp;docker-compose)

说明:使用docker-compose 进行安装 代码框架 使用命令行工具创建 qlooctl install docker qloo-docker 运行qloo&&gloo 启动 cd ./qloo-docker docker-compose up 效果 配置glooctl &&qlooctl工具 下载 https://github.com/solo-io/qloo/releases https://github.com/solo-io/gloo/releases 配置环

QLoo graphql engine 学习三 架构

一张官方的参考图 说明 Storage Layer API 参考了kubernetes 的设计 qloo 组成 qloo 有qloo 服务以及envoy proxy 组合而成,envoy proxy 作为sidecar qloo 操作envoy 作为control plane ,方便qloo 使用gloo 丰富的http 路由请求,从上图也可以看出来 与gloo的通信 qloo 可以生成gloo 的配置对象,允许gloo处理服务发现,envoy filter && gloo 插件配置,从上

CE学习记录1

主题 春节放假终于有空学习下怎么制作外挂啦......学习写外挂大概是我一开始学习计算机的动力吧....只是一直似懂非懂..看教学视频各种不明白为什么....也没有专门的时间学习下怎么写....春节有空研究了下cheat engine学习了下怎么修改内存里的值达到作弊的效果....希望后期能和E语言结合在一起写成真正的外挂....(笑) 这篇文章主要记录下今天的研究成果.. 效果 主机999元...装不了啥其他游戏....装了个红警3做测试... 最终效果如下: 学习过程 要修改某个值,比如金钱

Gcode命令【转】

https://www.jianshu.com/p/f8a328457a45 简述 研究过3D打印机的朋友,都会用到G-code文件.要使用3D打印机打印东西要经过几个步骤:        1.创建3D模型    2.切片软件处理,生成3D打印机能识别的命令(保存在G-code文件中)   3.发送打印命令给3D打印机 Gcode文件中的每一行都是3D打印机固件所能理解的命令.而这些命令,也被称为G-code命令,是3D打印机和电脑之间最重要的命令交互界面. 既然所有3D打印机都使用G-code

MongoDB学习笔记(一:安装时出现The default storage engine &#39;wiredTiger&#39; is not available问题解决)

今晚在自己老式笔记本来试了一下MongoDB的安装,由于配置比较低,只能选择32位版本的MongoDB进行安装,在安装过程中碰到了上述标题所示错误,自己也捣鼓了一个小时左右,终于在一篇博客中找到答案,具体原文链接如下:http://blog.csdn.net/u013457382/article/details/50775268 MongoDB学习笔记(一:安装时出现The default storage engine 'wiredTiger' is not available问题解决)

【UNREAL ENGINE 游戏开发】开篇之为什么现在就要抱紧UE的大腿!(另附学习资料/交流群)

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/unreal-engine-game/2129.html 自从开始自学Unreal Engine后,身边的朋友.群里的童鞋们都在问:Himi,为什么要转UE了?UE到底好在哪里?与U3D比优势到底在哪里?等各种问题.而且解释过的问题,等会还要再解释给没看到的童鞋们 - 所以Himi特意来写篇博文,统一解释UE对于我为什么会有这么大的诱惑力! 这

Irrlicht_0.1源码学习(1)——Welcome to the Irrlicht Engine

关于Irrlicht这一引擎,想必不用过多介绍什么了,下面是我从其首页上搬来的一段介绍文字,以供参考 The Irrlicht Engine is an open source high performance realtime 3D engine written in C++. It is completely cross-platform, using D3D, OpenGL and its own software renderers, and has all of the state-o

使用Google App Engine开始新的网站开发学习

继长时间的迷茫后,我发现还是回归php网站开发更适合我,或者没有那么深刻,但至少要做点事情.不知道以后将从事什么样的工作,但现在找点事情做还是很好的.所以,为了激发我学习的热情,我在网上搜了一下免费云空间,发现还是很多可以用的.最好的还是google的google app engine了. 今天在上面成功部署网站.简单步骤如下(引自:http://www.360doc.com/content/13/0310/10/11729272_270525195.shtml): (不能复制,直接点击链接吧!