2

最近、カスタムイメージを側面に刻印したブレスレットを印刷できるかどうか尋ねられました。

私にとって、問題は単純です。私は、その人が私に送ったベクトル化された画像の点を表す 2 次元デカルト システム (x,y) を持っています。これらを 3D 円筒システム (シータ、r、z') として扱いたいと思います。ここで、r は定数です。最後に、この 3D 円筒座標系を通常の方法で 3D デカルト座標系 (x',y',z') に変換します。

そう:

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

問題は、これを OpenSCAD に表現する方法がわからないことです。multmatrix() を使用した行列変換のオプションがありますが、これは線形変換しかできません。つまり、少なくとも私の知る限り、cos(x) のようなものは表現できません。

私が欲しいのは次のいずれかです:

  • この変換を表現するための既存のモジュール/ハック、または

  • glsl の頂点シェーダーによく似た、頂点ごとの変換を実行するための一般的な方法

少なくとも、そのようなものが OpenSCAD で利用できないことを確認することは可能ですか?

4

1 に答える 1

1

を使用できます。 http://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#Surfacesurface()を参照してください。外部スクリプトで高さマップを計算し、その値を「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 が含まれます。形状の数を減らすために、1 つの列のピクセルをプールして、この列の深度プロファイルを表すポリゴンを作成し、それを線形押し出します。この場合、ベクトルにはピクセル (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]);
}

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

すべてのスクリプトをダウンロード

于 2014-10-23T10:47:00.943 に答える