2

最近有人问我是否可以打印一个侧面刻有自定义图像的手链。

对我来说,问题很简单:我有一个二维笛卡尔系统 (x,y),它表达了这个人发给我的矢量化图像的点。我想将这些视为 3d 圆柱系统 (theta, r, z'),其中 r 是常数。最后,我想以通常的方式将这个 3d 圆柱系统转换为 3d 笛卡尔系统 (x',y',z')。

所以:

z' = y
y' = r cos(x)
x' = r sin(x)

问题是我不知道如何向 OpenSCAD 表达这一点。有一个使用 multmatrix() 进行矩阵变换的选项,但这只允许线性变换 - 即我不能表达像 cos(x) 这样的东西,至少据我所知。

我想要的是:

  • 一个现有的模块/黑客来表达这种转变,或者

  • 执行逐顶点转换的通用方法,很像 glsl 中的顶点着色器

至少,是否有可能确认 OpenSCAD 中没有这些东西?

4

1 回答 1

1

您可以使用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

下载所有脚本

于 2014-10-23T10:47:00.943 回答