3d 将图像环绕圆柱体

3d 将图像环绕圆柱体,3d,cad,openscad,3d,Cad,Openscad,最近有人问我是否可以在手镯的侧面刻上定制的图案 对我来说,问题很简单:我有一个二维笛卡尔系统(x,y),它表示那个人发给我的矢量化图像的点。我想把它们当作一个三维圆柱系统(θ,r,z'),其中r是常数。最后,我想用通常的方法将这个三维圆柱系统转换成三维笛卡尔系统(x',y',z') 因此: 问题是我不知道如何向OpenSCAD表达这一点。有一个使用multmatrix()进行矩阵变换的选项,但这只允许进行线性变换-即,至少据我所知,我不能表示cos(x)之类的东西 我想要的是: 表示此转换的现

最近有人问我是否可以在手镯的侧面刻上定制的图案

对我来说,问题很简单:我有一个二维笛卡尔系统(x,y),它表示那个人发给我的矢量化图像的点。我想把它们当作一个三维圆柱系统(θ,r,z'),其中r是常数。最后,我想用通常的方法将这个三维圆柱系统转换成三维笛卡尔系统(x',y',z')

因此:

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

我想要的是:

  • 表示此转换的现有模块/黑客,或

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

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

您可以使用
surface()
,请参阅。在外部脚本中计算heightmap并将值写入文件,例如“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);}
2014年10月28日编辑: 在另一种方式中,您可以使用矩阵中的pixeldata,通过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]);
}

我看不出这是如何解决问题的。我知道surface()可以用于图像,否则我会问这个问题。问题不在于如何将图像转换为3d形状,而在于如何弯曲生成的3d形状以符合手镯的侧面。我想,这就是方法:转动手镯,使其轴平行于y轴,并计算x-y平面上每个点的手镯周长z值。在surface.dat中使用这些值,可以得到手镯底边对应的surface()。您可以根据雕刻深度调整x和z。与surface()一样,每个点只能有一个唯一的z,可能需要划分几个扇区。
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]);
}
// 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