在圆柱体周围缠绕图像

时间:2014-10-21 14:58:44

标签: 3d cad openscad

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

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

所以:

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

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

我想要的是:

  • 用于表达此转换的现有模块/ hack,或

  • 执行每顶点变换的通用方法,非常类似于glsl中的顶点着色器

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

1 个答案:

答案 0 :(得分:0)

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

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