【问题标题】:Wrap an image around a cylinder将图像包裹在圆柱体周围
【发布时间】:2014-12-16 20:42:11
【问题描述】:

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

对我来说,问题很简单:我有一个二维笛卡尔系统 (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) 之类的东西。

我想要的是:

  • 一个现有的模块/hack 来表达这种转换,或者

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

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

【问题讨论】:

    标签: 3d cad openscad


    【解决方案1】:

    您可以使用surface(),请参阅http://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#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 个元素处关闭渲染。您可以在 Edit/Preferences/Advanced 下将其设置为所需的数字

    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
    

    Download all scripts

    【讨论】:

    • 我看不出这是如何作为解决方案工作的。我知道 surface() 可以在图像上使用,否则我会问这个问题。问题不在于如何将图像转换为 3d 形状,而是如何弯曲生成的 3d 形状以符合手镯的侧面。
    • 这就是我想到的方法:转动手镯,使其轴平行于 y 轴,并为 xy 平面上的每个点计算手镯圆周上的 z 值.在surface.dat 中使用这些值,您可以使用surface() 获得手镯底部的对应物。您可以通过雕刻深度调整 x 和 z。与 surface() 一样,每个点只能有 1 个唯一 z,也许您需要划分为多个扇区。
    猜你喜欢
    • 2011-08-23
    • 2017-04-21
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多