最近有人问我是否可以打印一个刻有自定义图像的手镯。
对我而言,问题很简单:我有一个二维笛卡尔系统(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中没有这些东西?
答案 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