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