openscad吧 关注:197贴子:328
  • 2回复贴,共1

OpenSCAD入门操作介绍(中文)

只看楼主收藏回复

网上看到的好多中文手册,总觉得语言习惯很别扭,阅读理解起来比较困难,所以我就用我小学生的文笔,整理了一篇通俗(但不保证易懂哈)的入门操作介绍,希望能对和我一样初学openSCAD的菜鸟爱好者有所帮助。
OpenSCAD 入门操作介绍
(软件下载地址:http://openscad.org/downloads.html
目 录
一、基本操作及语法格式
1、软件的基本操作
2、基本图形语法
3、函数语法
二、2D图形命令
1、圆:circle
2、正方形(或长方形):square
3、多边形:polygon
4、绘制文本:text
5、平面投影(仅对3D图形有效):projection
三、3D图形命令
1、球体:sphere
2、正方体(或长方体):cube
3、圆柱体(或圆锥体):cylinder
4、多面体:polyhedron
5、线性拉伸(仅对2D图形有效):linear_extrude
6、旋转拉伸(仅对2D图形有效):rotate_extrude
四、图形变换命令
1、平移:translate
2、旋转:rotate
3、缩放(按比例):scale
4、缩放(按数值):resize
5、镜像:mirror
6、线性转换矩阵:multmatrix
7、颜色:color
8、偏移(仅对2D图形有效):offset
9、蒙皮(实心):hull
10、闵可夫斯基运算(常用来作圆角):minkowski
五、布尔运算
1、相加(多个多面体的总和):union
2、相减(第一个多面体减去后面的多面体):difference
3、相交(得出多个多面体相交的部分):intersection
六、特殊变量
1、弧形分辨率:$fa(最小角度)和$fs(最小尺寸)
2、弧形分辨率:$fn(分段数量)
七、其他
1、模块:module
2、循环:for
一、基本操作及语法格式
1、软件的基本操作
1.1运行软件后,可以选择新建或打开已有文件(最好在英文名的文件夹下),软件的菜单栏如下:
1.2输入图形命令后,按“F5”可预览图像(可显示颜色),按“F6”可进行3D编译和显示图像(不能显示颜色,但要保存成STL文件,必须先按“F6”进行编译,再导出为STL文件,此格式的文件就可以进行3D打印了)。
1.3按住鼠标左键可以旋转图像(同时再按住“Shift”键可以调整图像往左右倒的角度),滑动鼠标滚轮可以缩放图像,按住鼠标右键可以拖动图像(同时再按住“Shift”键就又变成缩放图像了)。
2、基本图形语法
图形名([x,y,z]); 例如cube([2,3,4]); 表示绘制一个x轴长2,y轴宽3,z轴高4的长方体。
注意:括号、逗号及分号都必须是英文模式的,否则程序会报错,不能正确运行,每个图形命令都须以分号结束。
3、函数语法
函数名([x,y,z]){参数(n1,n2,n3)图形名([x,y,z]);图形名([x,y,z]);} ,其中大括号是该函数语法的边界,这个函数会处理它大括号内所有的图形及其变量运算,图形命令前各参数的小括号后面不能跟分号“;”。
在函数前加“!”可以仅显示其后面紧随的一个实体, 若有多个“!”则只有第一个有效。
在函数前加“#”可以红色高亮显示(略透明)函数生成的实体, 便于观察调试。
在函数前加“%”可以半透明显示函数生成的实体, 便于观察内部的其他实体。
在函数前加“*”可以隐藏函数生成的实体, 便于观察调试其他部分实体。
编写的程式,为了方便阅读理解,可以在编写的语句中加注释,用双斜杠(“//”)表示,双斜杠后的内容为注释部分,OpenSCAD会忽略处理双斜杠后面的所有内容,直到下一行的开头,所以注释可以用中文写。
二、2D图形命令
1、圆:circle(r);
circle(radius,$fn=n); 以radius值为半径,作分辨率为n的圆形。
或circle(d=diameter,$fn=n); 以diameter值为直径,作分辨率为n的圆。
例如:circle(10,$fn=60); 表示作半径为10,分辨率为60的圆。
circle(d=10,$fn=60); 表示作直径为10,分辨率为60的圆。
注:如果不加分辨率条件,在绘制较小的圆时,显示出来的是多边形图像。$fn是个全局参数,在一个文件中,如果有多个曲面或弧度时,可以把$fn=n;放在文件的最前头,就能设定所有图形的弧度分辨率了。
2、正方形(或长方形):square([x,y]);
square(size); 以size值为边长,作正方形。
square([x,y]); 以x值为x轴的长,以y值为y轴的宽,作长方形。
例如: square(5); 表示作边长为5的正方形。
square([5,10]); 表示作长为5,宽为10的长方形。
square([5,10],center=true); 表示作长为5,宽为10的正方形,且中心在坐标原点。
3、多边形:polygon([points],[paths]);
polygon([[x,y],[x,y],[x,y],[x,y],......[x,y]]); 以x和y点坐标连线作多边形。
或polygon(points=[[x,y],[x,y],[x,y],[x,y],......[x,y]],paths=[[0,1,2,3,......n]]); 点坐标加路径绘制多边形(paths等号后面的数值是各点的序列号,表示绘制路径,第一个点是从0开始算),作图效果与前一种格式完全相同,个人感觉2D多边形这个路径语句没有必要写,纯粹就只是个标准格式而已,直接用点坐标就行了,这样更简洁。
例如:polygon([[0,0],[100,0],[130,50],[30,50]] ); 和
polygon(points=[[0,0],[100,0],[130,50],[30,50]] ,paths=[[0,1,2,3]]); 就是同一个平行四边形。
4、绘制文本:text(t, size, font,halign, valign, spacing, direction, language, script);
text("text",size,font=" ",halign="center",valign="center"); 表示从起始点向x/y轴正方向生成平面的“text”文字图像(只能显示英文和数字,内容需要用双引号括住),size为字体大小(直接输数值就可以了),font为字体样式(=后面的内容也需要用双引号括住),halign="center"时文字x轴向的中心点位于x轴的零点(不做此设定时,以x轴零点为起始点,center也需要用双引号括住),valign="center"时文字y轴向的中心点位于y轴的零点(不做此设定时,以y轴零点为起始点,center也需要用双引号括住)。
例如:text("ABC123",18,font="Times New Roman",halign="center",valign="center"); 表示绘制内容为ABC123,字体大小18,字体样式为Times New Roman,图形中点在x/y轴的零点。
注:若需要绘制中文字体,则需要另外安装相关的插件。
5、平面投影(仅对3D图形有效):projection(cut){}
projection(){3D图形命令} 表示生成3D图形在x/y轴平面的正投影平面图形。
例如:projection(){sphere(r=6,$fn=60);},就是生成这个半径为6的球在x/y轴平面的正投影,即一个2D的平面圆形。(降维打击☺)
三、3D图形命令
1、球体:sphere(r);
sphere(radius,$fn=n); 以radius值为半径,作分辨率为n的球体。
或sphere(d=diameter,$fn=n); 以diameter值为直径,作分辨率为n的球体。
例如:sphere(10,$fn=60); 表示作半径为10,分辨率为60的球体。
sphere(d=10,$fn=60); 表示作直径为10,分辨率为60的球体。
2、正方体(或长方体):cube([x,y,z]);
cube(size); 以size值为边长,作正方体。
cube([x,y,z]); 以x值为x轴的长,以y值为y轴的宽,以z值为z轴的高,作长方体。
例如:cube(5); 表示作边长为5的正方体。
cube([5,8,10]); 表示作长为5,宽为8,高为10的长方体。
cube([5,8,10],center=true); 表示作长为5,宽为8,高为10的正方形,且该正方体的中心在坐标原点。
3、圆柱体(或圆锥体):cylinder(h,r1,r2);
cylinder(h=n1,r=n2); 以n1值为高,n2值为半径,作圆柱体。
cylinder(h,r1,r2); 以h值为高,r1值为底面半径,r2值为顶面半径,作圆锥体。
例如:cylinder(h=5,r=2); 表示作高5,半径2的圆柱体。
cylinder(5,4,2); 表示作高5,底面半径4,顶面半径2的圆锥体。
cylinder(h=5,d1=4,d2=2,center=true); 表示作高5,底面直径4,顶面直径2,中心点在坐标原点的圆锥体。
注:参数中标明h=、r1=和r2=后,顺序可以随便排列,不注明的话,程式就按默认的参数顺序及设置进行绘图,参数不需要用方括号“[ ]”括住,用了“[ ]”后将不能正确绘制。
4、多面体:polyhedron(points, faces, convexity);
polyhedron(points=[[x1,y1,z1],[x2,y2,z2],...[xn,yn,zn]],triangles=[[0,1,n],[1,2,n],...[2,1,3]], convexity=10); 以[x,y,z]确定各顶点坐标,再以同一平面的三个点来确定各个三角形的面(各点以序列号确定),最后所有三角形的面拼接成一个多面体。
例如:polyhedron(points=[[10,10,0],[10,-10,0],[-10,-10,0],[-10,10,0],[0,0,10]], faces=[[0,1,4],[1,2,4],[2,3,4],[3,0,4],[1,0,3],[2,1,3]] ,convexity=10); 绘制出一个金字塔体。(这个3D图形共5个顶点,序号分别为:0、1、2、3、4,各点共构造了6个三角形的面)
注:各点的序列号是从0开始的,每个三角形的连接点须按顺时针排列,points和faces的所有参数最外层还有一层方括号“[ ]”括住。另外,convexity=10参数可以不写,这里只是标准完整的格式需要,convexity的作用是:有些凸面在预览时,不能正确显示,设置较大的convexity值后就可以了,一般建议由10开始设置,太大的值会造成预览计算负担。
5、线性拉伸(仅对2D图形有效):linear_extrude(height,center,convexity,twist,slices){}
linear_extrude(height,center,convexity,twist,slices){2D图形命令} 把一个平面图形,以height值为高,在z轴上拉伸为旋转twist值,层数分辨率为slices值的立体图形。
例如:linear_extrude(height=20,center=true,twist=60,slices=50){square([8,5],center=true);}表示将一个长8宽5的平面矩形,拉伸为z轴高20,中心点在原点,沿z轴扭曲60°,层数分辨率为50的立体图形。
注:例案中也没写convexity参数,原因同前面所述。本例中第一个center=true是把z轴方向的中点设在原点,第二个center=true是把x/y轴平面的中点设在原点(后面这个中心点对齐命令,对于指定坐标点绘制的多边形是无效的)。层数分辨率参数slices的值越大,图像在z轴上的层数越多越平滑(这个不是弧度分辨率),但相应的计算量也越大。
6、旋转拉伸(仅对2D图形有效):rotate_extrude(angle,convexity){}
rotate_extrude(angle,convexity){2D图形命令} 先沿x轴把平面图形所在的面翻立90°,再沿z轴旋转angle值的角度,形成一个立体图形。
例如:
rotate_extrude(angle=360,convexity=10){translate([10,20,0]){polygon([[0,0],[0,20],[40,30],[60,10],[50,0]]);}} 表示把这个平面5边形,在x轴方向平移10,在y轴方向平移20,然后沿x轴翻立90°,再沿z轴旋转360°,形成一个飞碟状的立体图形。
注:angle值不设定时,默认为360°;convexity同前面叙述,一般可忽略。平面图形在x轴向的平移,最终变成立体图形中间空心环的半径;在y轴向的平移,最终变成立体图形在z轴上的位移;平面图形在z轴向的平移,无效。
四、 图形变换命令
1、平移:translate([x,y,z]){}
translate([x,y,z]){图形命令} 沿x、y、z轴平移图形。
例如:translate([2,3,6]){cube(5);} 表示把这个边长为5的正方体,向x轴平移2,向y轴平移3,向z轴平移6。
2、旋转:rotate([x,y,z]){}
rotate([x,y,z]){图形命令} 沿x、y、z轴旋转图形。
例如:rotate([10,20,30]){cube(5);} 表示把这个边长为5的正方体,沿x轴旋转10°,沿y轴旋转20°,沿z轴旋转30°。
3、缩放(按比例):scale([x,y,z]){}
scale([x,y,z]){图形命令} 按比例缩放图形。
例如:scale([1,2,3]){cube(5);} 表示把这个边长为5的立方体,在x轴上缩放1倍(即不变),在y轴上缩放2倍(即到10的位置),在z轴上缩放3倍(即到15的位置)。
scale(3){cube(5);} 表示把这个边长为5的立方体,整体放大3倍(即x、y、z值都到15)。
linear_extrude(height=20,twist=60,slices=50,scale=0.6){square([8,5],center=true);} 表示把这个拉伸出来的立体图形,从底部到顶部时缩放了0.6倍。
4、缩放(按数值):resize([x,y,z],auto,convexity){}
resize([x,y,z],auto,convexity){图形命令} 把图形缩放到x、y、z的值处。
例如:resize([1,2,3]){cube(5);} 表示把这个边长为5的立方体,在x轴上缩放到1的位置,在y轴上缩放到2的位置,在z轴上缩放到3的位置,结果相当于重新给这个立方体定义了各个边长,然后得到一个长1宽2高3的实体。
注:auto参数不知道有啥用,convexity参数同前面所述。
5、镜像:mirror([x,y,z]){}
mirror([x,y,z]){图形命令} 沿x、y、z轴,作图形的镜像图形。
例如:mirror([1,0,0]){cube(5);} 表示把这个边长为5的立方体,镜像到x轴负轴上。
6、线性转换矩阵:multmatrix(m){}
multmatrix(m=[[x1,x2,x3,x4],[y1,y2,y3,y4],[z1,z2,z3,z4],[0,0,0,n]]){图形命令} 先把图形缩放“图形尺寸/n”倍;再把图形整体位移到x4/n,y4/n,z4/n的位置;再把图形的右侧面在x轴上平移x1*(图形的x值/n)位置,在y轴上平移y1*(图形的x值/n)位置,在z轴上平移z1*(图形的x值/n)位置;把图形的后侧面在x轴上平移x2*(图形的y值/n)位置,在y轴上平移y2*(图形的y值/n)位置,在z轴上平移z2*(图形的y值/n)位置;把图形的顶面在x轴上平移x3*(图形的z值/n)位置,在y轴上平移y3*(图形的z值/n)位置,在z轴上平移z3*(图形的z值/n)位置。
例如:multmatrix([[1,0,0,1],[0,1,0,1],[0,0,1,1],[0,0,0,1]]){cube(5);} 表示把一个边长为5的正方体位移到(1,1,1)的坐标位置。
注:第4组数列“[0,0,0,n]”中前3个“0”不知道有啥用,设为“1”没看出有啥变化。另外,无论是平移命令、旋转命令、按比例缩放命令还是镜像命令,其最底层都是这个线性转换矩阵命令。
7、颜色:color([r,g,b,a]){}
color([r,g,b,a]){图形命令} 给图形按“r,g,b,a”数值上色及透明度,其中“r,g,b,a”数值取值范围是“0.0--1.0”,分别为“红、绿、蓝、透明度”。
例如:color([1,0,0,1]){cube(5);} 表示把这个边长为5的正方体染上红色,并且不透明。
注:透明度默认为“1”,可省略不写。显示颜色仅在“F5”预览下有效,目前“F6”编译后不支持显示颜色。颜色命令也可直接输入色彩的英文名(可在网上查各种颜色的名字),例如“color("red") sphere(5);”就是给这个半径5的球体染上红色。
8、偏移(仅对2D图形有效):offset(r|delta,chamfer){}
offset(r|delta,chamfer){2D图形命令} 把2D图形的半径或直径增加“r”或“delta”值,并进行倒角处理。
例如:linear_extrude(height=10,scale=0.5,$fn=80){offset(2){square(10,center=true);}} 表示把这个边长为10的正方形的边长增加2,拉伸到10高,顶部缩放0.5倍,分辨率80,形成一个倒过角的梯形立方体。
注:如果偏移量是负值,则图形半径或直径减少该值,但是不再有倒角效果。另外,命令中的“chamfer”参数不晓得有啥用,试了设成“true”和“false”都没区别。
9、蒙皮(实心):hull(){}
hull(){图形命令;图形命令;...图形命令} 把若干个图形的外表蒙皮连接成一个整体图形(虽然说是蒙皮,但是最终形成的图形是实心的)。
例如:$fn=60;hull(){translate([15,15,0])sphere(10);translate([0,15,15])cylinder(h=8,r=6); cube(10,center=true);} 就是把一个球体,一个圆柱体和一个正方体蒙皮形成一个异形体。
10、闵可夫斯基运算(常用来作圆角):minkowski(convexity){}
minkowski(){图形命令;图形命令} 对两个图形进行运算,得到由一个图形遍历另一个图形的结果,常用来做圆角。
例如:$fn=80;minkowski(){cube(15);sphere(1);} 就是把一个球体遍历一个正方体,得到一个圆角的正方体(新正方体的边长比原来的边长,多出了球体的半径长度)。
五、布尔运算
1、相加(多个多面体的总和):union(){}
union(){图形命令;图形命令;...图形命令} 把若干个图形集合到一起。这是个系统默认命令,即在openSCAD里不写这个命令,所有的图形都是默认集合在一起的,但是也可以单独使用。
2、相减(第一个多面体减去后面的多面体):difference(){}
difference(){图形命令;图形命令;...图形命令} 把第一个图形,去除掉后面所有图形与它相交的部分。
例如:$fn=60;difference(){sphere(5);cube(5);cylinder(h=5,r=2);} 表示把这个球体,挖掉一个正方体及一个圆柱体与它相交的部分后,只保留剩下的部分成为一个新的图形。
3、相交(得出多个多面体相交的部分):intersection(){}
intersection(){图形命令;图形命令;...图形命令} 求这若干个图形相交的部分。
例如:$fn=60; intersection(){sphere(3);cube(5);cylinder(h=5,r=2);} 表示只保留这个球体、正方体和圆柱体相交的部分,得到一个新的图形。
六、特殊变量
1、 弧形分辨率:$fa(最小角度)和$fs(最小尺寸)
$fa=n; n是弧形分辨率的最小角度,单位是度。表示弧形的分辨率等于360除以n的数值。$fa的默认值为12(即把一个完整的圆圈均分成12°的30个片段)。$fa的最小允许值为0.01,任何试图设置低于此值的操作都会引起警告,并且无效。虽然没说有没有最大值限制,但是$fa值超过72以后,都显示的都是正五边形了(即正五边形是$fa最低分辨率下的图形)。
$fs=n; n是弧形分辨率的最小尺寸,单位是毫米。表示弧形的分辨率等于圆周长除以n的数值。$fs的默认值为2(即把一个完整的圆圈均分成“圆周长/2”这么多个的片段)。$fs的最小允许值为0.01,任何试图设置低于此值的操作都会引起警告,并且无效。同样,正五边形是$fs最低分辨率下的图形,即圆周长除以$fs值小于5时显示的都是正五边形了。
注:$fa和$fs这两个函数是同时使用的,$fa单独使用没有什么效果,而$fs可以单独使用,并且实际分辨率以这两个函数中分辨率较低的那个为准。$fa和$fs的数值越小,圆周等分的段数越多,分辨率越高,当然需要的运算量也越大。另外,$fa和$fs是全局参数,可以在代码最前面进行全局申明,就可以赋值到文件中的所有图形了。
2、 弧形分辨率:$fn(分段数量)
$fn=n; n就是弧形分辨率的数值。表示把圆周长平均分成n份。$fn的默认值为0,当此变量的值大于零时,将忽略$fa和$fs两个变量,并使用此数量的片段渲染整个圆形。正三边形是$fn最低分辨率下的图形,即$fn值小于4时显示的都是三边形了。
注:$fn是一个可以单独使用的,调整弧形分辨率的函数。$fn的数值越大,圆周等分的段数越多,分辨率越高,当然需要的运算量也越大。另外,$fn也是全局参数,可以在代码最前面进行全局申明,就可以赋值到文件中的所有图形了。
七、其他
1、模块:module name(){}
module name(){图形命令;图形命令;...图形命令} name(); 把一个或多个图形集合到一个模块中,并给该模块指定一个名字,然后就可以在后续操作中直接引用这个名字的模块了。
例如:$fn=60; module A(){sphere(3);cube(5);cylinder(h=5,r=2);} 表示把这三个图形集合到一个叫做“A”的模块里,然后对A(); 的操作就是同时对这三个图形进行操作,这可以简化需要多次重复引用比较复杂图形的操作。
注:“module”命令与“name”之间有空格,另外,使用“module”命令后,要显示图形,必须输入“模块名称();”的命令。
2、循环:for(i=[start:step:end]){ … }
for(i=[start:step:end]){ … } 把图形命令中设为i的参数进行循环使用,start是起始值,step是步进值,end是结束值。
例如:for(i=[0:1:9]){translate([i,0,0])cube(0.5);} 表示绘制10个边长为0.5的正方体,分别放在x轴的0、1、2、3、4、5、6、7、8、9处。
for(i=[0:3:9]){translate([i,0,0])cube(0.5);} 表示把上述图形的步进值设为3,即每隔3个才显示一个图形,得到的就是在x轴0、3、6、9处的4个实体。
写在最后的话:本文只简单介绍了openSCAD的一些入门操作,还有许多数学运算、三角函数、函数调用等等,感觉有些烧脑,我自己都没整醒火,所以有兴趣的小伙伴,可以自行到网上去参阅那些大神的分享,进行更深入的学习。另外,此文中例子的语法排列,我没按规范书写,仅作为入门简介用,要养成好习惯的话,最好去仿照软件中的示例语法书写。
谦山
2023-04-20


1楼2023-04-20 11:11回复
    感谢分享!


    IP属地:浙江2楼2024-05-10 21:24
    回复
      嗨 这么好的文章 就一个人回复~ 贴吧完了


      IP属地:上海3楼2024-08-29 11:18
      回复