您可以使用surface()
,请参阅http://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#Surface。在外部脚本中计算高度图并将值写入文件,例如“surface.dat”。您可以平移和旋转生成的曲面并将其用于difference()
.
我使用此代码和文档中的“surface.dat”进行了尝试
difference() {
translate([0,0,5])cube([10,10,10], center =true);
rotate([0,0,90])surface(file = "surface.dat", center = true, convexity = 5);}
编辑 28.10.2014:以另一种方式,您可以使用矩阵中的像素数据通过 for 循环和矩阵上的迭代将像素一个像素地放置在手镯的圆周上。矩阵中的向量包含像素(x)、像素(y)和灰度值/255 作为雕刻深度的维度。为了减少形状的数量,可以合并一列的像素,创建一个表示该列的深度剖面的多边形并对其进行线性拉伸。在这种情况下,向量包含多边形的像素(x)和点矩阵。我用 Che 的已知图形成功地尝试了它。要生成矩阵,我使用 python3.4、PyQt5 和 Qt.QtGui.QImage。默认情况下,openscad 在 2000 个元素处关闭渲染。您可以在编辑/首选项/高级下将其设置为所需的数字
openscad脚本:
include <./matrix_p.scad>;
difference() {
translate([-b,0,0]) rotate([0,90,0]) difference() {
cylinder(h = hb, r = rb, center = false);
translate([0,0,-0.5]) cylinder(h = hb+1, r = rb-tb, center = false);
}
for (val = m)
rotate([-ap*val[0],0,0]) translate([0,-rb-0.1,-ps/2]) linear_extrude(height = ps) polygon(points = val[1]);
}
matrix_p.scad 中设置的参数:
// userinput
rb = 50; //radius bracelet
tb = 5; //thickness of b.
hb = 80; //height of b.
b = 10; //borderwidth beside engraving
// input from Qt.QtGui.QImage
iw = 590; //imagewidth in pixel
ih = 726; //height in pixel
ps = (hb-2*b)/ih; //scaling of pixel to fill the free place
ap = (ps*180)/(PI*rb); //angle per pixel
下载所有脚本