用OpenSCAD构建校园建筑模型
2016-09-10陈俊廷
陈俊廷
引言
在温州中学学习生活了三年,毕业了免不了怀念。图1是母校的标志性建筑——行政楼,别有一番气势。在温州中学学习期间,我经常泡在创客空间,也接触到很多3D打印的相关知识。毕业之际萌发了做一个学校标志性建筑模型的想法,以纪念自己难忘的高中时光,同时感谢母校为我提供了广阔的舞台。
建模准备阶段
我最早接触使用的3D建模软件是Google SketchUp,类似SketchUp这类建模软件的建模主要基于画线成面,而后挤压成型建立三维模型。因此它的操作就像我们使用铅笔在图纸上作图一般,SketchUp软件本身能自动识别这些线条并加以自动捕捉。这类3D建模软件的优点就是交互式操作,效果直观简单。后来,我还在选修课上学习了OpenSCAD立体建模软件,这门课是一位数学老师教的。
OpenSCAD是一款用于创建立体三维CAD对象的免费开源软件。OpenSCAD软件的建模是在脚本文件中描述对象,用脚本语言进行3D编译并呈现3D模型,用户可以在建模的过程中轻松地更改任何步骤,甚至设计所定义的配置参数。软件的建模操作包括两方面:一方面是利用OpenSCAD中模型的基础组件语句,如方形、圆柱等,配置指定参数软件转换成对应的3D视觉模型,而不是数据模型;另一方面是利用OpenSCAD的功能语句,进行模型移动、组合、联合、区分、交集、镜像等操作。
但由于OpenSCAD偏于程式、参数化方面,而我又对自己的编程语言没有足够的信心,所以3D建模往往会选择交互式建模软件SketchUp。但是,在这栋楼的建模过程中,我发现大楼的建筑结构有许多重复之处,在SketchUp中操作显得太过繁琐,重复性的操作太多。想到OpenSCAD建模软件的代码建模能够彻底解决我的困扰,不仅修改方便,并且能够通过计算构建精确的大楼模型,于是决定选择OpenSCAD这位久违的“老朋友”。
使用OpenSCAD建模需要提前进行计算,构思好每一个点的位置,规划好每一个部分的大小。于是,我画了一个行政楼的三视图草图,这个草图对之后的计算很有帮助,让建模过程也变得十分流畅。我画的正视图(如图2)中包括三维空间的X轴和Z轴。在正视图中,每一个点都标了相对应的坐标,这使得原本抽象的计算显得比较直观。在这个过程中,我主要选择了原图中比较容易实现的部分,对一些建模难以实现的部分做了相应简化。而且鉴于学校的3D打印机只有单色打印的功能,所以忽略了颜色参数的相关设置。俗话说,磨刀不误砍柴工。建模前期的画图工作不仅没有浪费时间,反而加快了我后续的建模进程,使得建模能够事半功倍。
建模过程
根据前期的构思,我选择从行政楼最主体的部分开始建模。行政楼主体首先是采用一个长方体去除中部的大门部分。在OpenSCAD的建模语言中,这部分首先需要用到的是长方体语句——cube([width,height,depth]),即设置相应的长宽高作长方体。大门部分采用差集语句——difference(),即由第一个多面体去除第一个以外的多面体。相关坐标点定位和移动用的是translate([x,y,z]),即设置相应的向量参数进行模型的移动。使用OpenSCAD时特别需要注意的是cube语句的后面是带有分号的,而translate则不需要。这也是我刚开始没注意而常犯的错误。
行政楼主体部分的建模语言如下:
difference() //由第一个多面体,减去除第一个以外的多面体
{
translate([-15,-15,-2]) //依照[-15,-15,-2]向量进行平移
cube([30,45,2]); //以30,45,2作为长宽高作长方体
translate([-0.5,2,-0.8]) //依照[-0.5,2,-0.8]向量进行平移
cube([1,30,0.9]); //以1,30,0.9作为长宽高作长方体
}
行政楼主体部分建模结束之后,接下来的工作就是在原有的基础上一点一点增加细节。在这一过程中,还需要用到OpenSCAD中的并集语句——union(),即多个多面体的总和是或运算;交集语句——intersection(),即得出多个多面体相交的部分,是与运算。模型部分还用到了柱体语句——cylinder(h,r1,r2,center),多面体语句——polyhedron(points,triangles,convexity),球体语句——sphere(radius)等。从上述部分我们也可以发现OpenSCAD的建模语言其实还是比较简单的,大部分和英语单词的意思相对应,理解起来十分容易。
行政楼主体部分完成之后的工作就是添加许多细节,包括窗户、水池、树等。当然树的模型进行了一定的简化,用的是两个柱体的组合。程序语言如下:
union() //多个多面体的总和(或运算)
{
translate([2.5,2,0]) //依照[2.5,2,0]向量进行平移
cylinder(h=1.5,r1=0.15,r2=0.05,$fs=10); //以1.5作高,0.15,0.05分别为上下圆半径作圆锥体,$fs是毫米表示角,表示周长除以数值,单位是毫米
translate([2.5,2,1]) //依照[2.5,2,1]向量进行平移
cylinder(h=1,r1=0.4,r2=0,$fs=10); //以1作高,0.4,0分别为上下圆半径作圆锥体
}
树的效果如图3所示。
遇到的问题
1.行政楼顶的曲线
行政楼房顶有较大弧度的曲线(如图4)。曲线在3D建模中一直是一个比较难处理的部分。我在SketchUp中采用的方案是利用一个圆斜截一个圆锥从而得到抛物线,再通过相应操作进行调整找到需要的弧度。但在利用OpenSCAD脚本语言建模的过程中,虽然也可以用CSG模型解决曲线的问题,但涉及的运算却是我没有学过的,因此,行政楼房顶的曲线弧度只能用长方体替代。
2.效果图显示部分
从下页图5的代码输入界面中可以看出,行政楼中间的大门和楼顶两个长方形凹槽部分应该是被打通的。然而在效果图显示时,从不同的角度查看,却有一层绿色的图层若隐若现,时有时无,让我比较困扰。参考OpenSCAD中自带范例的效果图显示,以及咨询老师,发现他们都没有遇到过这种情况,效果图显示打通了就是显示空白了。老师建议尝试修改相关参数,发现只要将对应的参数稍微加大,让其处于完全贯穿状态,而不是恰好打通,效果图中就不会出现这一绿色图层。所以建议在设置OpenSCAD代码参数时需要根据具体情况做相应计算,参数设置要合理,否则可能会影响之后的建模及效果图呈现。图6是修改后的代码参数及效果图。
3.行政楼房间
行政楼中的房间这些大量重复性的建模我采用最基础的方法,就是在OpenSCAD中复制相应代码,改变部分参数,操作非常便捷。其实OpenSCAD中循环语句可以更好地解决这个重复性操作的问题,在软件的很多example中也采用了循环的方法。但是由于我对循环语句并不能娴熟应用,只好采用复制粘贴再修改的笨办法。但即便没有采用循环语句,我觉得这也远比在互动式建模软件中大量的重复操作要快捷许多。
结束语
在OpenSCAD建模软件的学习中,我的收获还是很大的,不仅学会了这款免费开源的建模软件,而且自己面对陌生事物的心态有了改变,很多事情只有着手之后才会发现远没有你想象的困难。
3D建模能给我带来快乐,看着自己的想法一点点变成现实,二维的行政楼平面照片变成三维的立体模型,一种成就感油然而生,这应该也是创客动手制作的最大动力来源吧!虽然对于OpenSCAD的建模操作我只能算入门,但相信会慢慢熟练。同时,我也会去接触和学习其他的建模软件,因为我觉得3D打印的学习是一件充满乐趣的事情。希望自己能从中收获更多,也希望和大家一起交流有关OpenSCAD这款软件的建模心得以及有关3D打印的学习体会。最后附上温州中学行政楼模型效果图(如图7~图9)。
如果对相关内容感兴趣,请关注主持人博客。