2014-10-21 5 views
1

Кто-то спросил меня недавно, могу ли я напечатать браслет с изображением, выгравированным на его стороне.Оберните изображение вокруг цилиндра

Для меня проблема проста: у меня есть 2-я декартова система (x, y), которая выражает точки векторизованного изображения, отправленного мной человеком. Я хочу рассматривать их как трехмерную цилиндрическую систему (theta, r, z '), где r постоянна. Наконец, я хочу преобразовать эту трехмерную цилиндрическую систему в 3d-декартовую систему (x ', y', z ') обычным способом.

Итак:

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

Проблема заключается в том, я не знаю, как выразить это OpenSCAD. Существует опция преобразования матрицы с использованием multmatrix(), но это допускает только линейное преобразование - т. Е. Я не могу выразить такие вещи, как cos (x), по крайней мере, насколько мне известно.

То, что я хочу, это либо:

  • существующий модуль/хак, чтобы выразить это преобразование, или

  • общий способ выполнения за вершинных преобразований, как и вершинных шейдеров в GLSL

По крайней мере, можно ли подтвердить, что такие вещи недоступны в OpenSCAD?

ответ

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: другим способом вы можете использовать pixeldata в матрице, чтобы поместить пиксель за пикселем на окружности браслета с помощью петли for и итерации по матрице. Векторы в матрице содержат пиксель (x), пиксель (y) и greyvalue/255 как размерность для глубины гравировки. Чтобы уменьшить количество фигур, пиксели одного столбца могут быть объединены, создавая многоугольник, представляющий профиль глубины этого столбца и линейно выдавливая его. В этом случае векторы содержат пиксель (x) и точечную матрицу многоугольника. Я пробовал это с известной графикой Че. Для генерации матрицы я использую 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

+0

я могу Посмотрите, как это работает как решение. Я знаю, что поверхность() может использоваться на изображении, иначе я бы задал этот вопрос. Проблема заключается не в том, как преобразовать изображение в трехмерную фигуру, а в том, как сгибать полученную трехмерную фигуру, чтобы она соответствовала сторонам браслета. – 16807

+0

Так я имел в виду: поверните свой браслет с осью, параллельной оси y, и вычислите для каждой точки на x-y-плоскости значение z по окружности вашего браслета.Используя эти значения в surface.dat, вы получаете с поверхностью() контраст нижней части вашего браслета. Вы можете настроить x и z на глубину гравировки. Как и в случае с поверхностью() только одна уникальная точка z для каждой точки, возможно, вам нужно разделить несколько секторов. –

Смежные вопросы