OpenSCAD

TE01 OpenSCAD

この記事は約14分で読めます。

3Dモデリングツール、OpenSCADの覚書です。

概要

コード(C言語風)でのモデリングなので、chatGPTなどの生成AIとの相性がいいように感じます。

OpenSCADは、プログラミング言語を用いて3Dモデルを作成する3D-CADソフトウェアです。一般的な3D-CADソフトがGUI操作によるモデリングを重視するのに対し、OpenSCADはコードによって形状を記述します。

OpenSCADの特徴

  • プログラミングによるモデリング:
    • 複雑な形状や繰り返し構造を簡単に記述できます。
    • パラメータを変更することで、形状を簡単に変形できます。
  • オープンソース:
    • 無料で利用でき、ソースコードも公開されています。
    • コミュニティが活発で、様々な情報やライブラリが提供されています。
  • CSG (Constructive Solid Geometry):
    • プリミティブな形状(立方体、球体など)を組み合わせ、引き算や足し算などの演算を行うことで、複雑な形状を構築します。

OpenSCADの活用例

  • 3Dプリントモデルの作成:
    • 複雑な形状の3Dプリントモデルを簡単に作成できます。
  • 機械部品の設計:
    • パラメータ化された設計により、様々なバリエーションの部品を迅速に作成できます。
  • シミュレーションのためのモデル作成:
    • 有限要素解析などのシミュレーションに必要なモデルを簡単に作成できます。
Geminiより

生成AIとの相性

OpenSCADのようなコードベースの3Dモデリングツールは、生成AIとの相性が非常に良いと言えるでしょう。その理由をいくつか挙げさせていただきます。

OpenSCADと生成AIの相性の良さ

  • テキストベースの入力: 生成AIは、テキストデータの生成を得意としています。OpenSCADのコードもテキストであるため、生成AIが直接コードを生成し、3Dモデルを作成することができます。
  • パラメータの自動調整: 生成AIは、大量のデータからパターンを学習し、最適なパラメータを自動で調整することができます。OpenSCADのコードは、形状を定義するパラメータを多く含んでいるため、生成AIがこれらのパラメータを調整することで、様々なバリエーションのモデルを生成できます。
  • 複雑な形状の生成: 生成AIは、複雑なパターンや構造を学習することができます。OpenSCADのコードで複雑な形状を定義することは、人間には時間がかかる作業ですが、生成AIであれば短時間で実現可能です。
  • デザインの自動生成: 生成AIは、与えられた条件に基づいて、デザインを自動で生成することができます。例えば、「有機的な形状の椅子をデザインする」といった指示を与えれば、生成AIがそれに合うOpenSCADコードを生成し、椅子モデルを作成することができます。

具体的な活用例

  • デザインのアイデア出し: 生成AIにキーワードを与えることで、様々なデザインのアイデアを提案させることができます。
  • パラメトリックデザイン: パラメータを変化させることで、形状が自動的に変化するパラメトリックデザインを生成することができます。
  • カスタマイズされた製品の設計: ユーザーの好みや制約条件に合わせて、カスタマイズされた製品を設計することができます。
  • シミュレーションモデルの自動生成: シミュレーションに必要なモデルを、自動的に生成することができます。

課題と今後の展望

  • コードの品質: 生成されたコードの品質を保証するためには、さらなる研究開発が必要です。
  • 意図の伝達: 生成AIに正確な意図を伝えるための自然言語処理の研究が重要です。
  • 倫理的な問題: 生成AIが生成したデザインの著作権や倫理的な問題について、議論が必要となります。
Geminiより

環境

インストーラ

OpenSCADのサイト

OpenSCAD

操作

3Dモデリングツールよりも、スクリプトエディターに近いです。

コードを書いて

Previewで描画

作業

サンプル

サンプルの確認です。

押出

linear_extrude.scad

// simple 2D -> 3D extrusion of a rectangle
color("red")
    translate([0, -30, 0])
        linear_extrude(height = 20)
            square([20, 10], center = true);

// using the scale parameter a frustum can be constructed
color("green")
    translate([-30, 0, 0])
        linear_extrude(height = 20, scale = 0.2)
            square([20, 10], center = true);

// with twist the extruded shape will rotate around the Z axis
color("cyan")
    translate([30, 0, 0])
        linear_extrude(height = 20, twist = 90)
            square([20, 10], center = true);

// combining both relatively complex shapes can be created
color("gray")
    translate([0, 30, 0])
        linear_extrude(height = 40, twist = -360, scale = 0, center = true, slices = 200)
            square([20, 10], center = true);

回転押出

rotate_extrude.scad

color("red")
    rotate_extrude()
        translate([10, 0])
            square(5);

color("cyan")
    translate([40, 0, 0])
        rotate_extrude($fn = 80)
            text("  J");

color("green")
    translate([0, 30, 0])
        rotate_extrude($fn = 80)
            polygon( points=[[0,0],[8,4],[4,8],[4,12],[12,16],[0,20]] );


color("magenta") 
  translate([40,40]){
    rotate_extrude(angle=180)
      translate([12.5,0])
        square(5);
    translate([7.5,0])
      rotate_extrude(angle=180)
        translate([5,0])
          square(5);
    translate([-7.5,0])
      rotate_extrude(angle=-180)
        translate([5,0])
          square(5);
  }

投影

projection.scad

echo(version=version());

%import("projection.stl");

color("red")
    translate([0, 0, -20])
        linear_extrude(height = 2, center = true)
            difference() {
                square(30, center = true);
                projection()
                    import("projection.stl");
            }

color("green")
    rotate([0, 90, 0])
        translate([0, 0, -20])
            linear_extrude(height = 2, center = true)
                difference() {
                    square(30, center = true);
                    projection()
                        rotate([0, 90, 0])
                            import("projection.stl");
                }

color("cyan")
    rotate([-90, 0, 0])
        translate([0, 0, 20])
            linear_extrude(height = 2, center = true)
                difference() {
                    square(30, center = true);
                    projection()
                        rotate([90, 0, 0])
                            import("projection.stl");
                }

// Including the cut = true uses the outline of the cut at
// the X/Y plane.at Z = 0. This can make internal features
// of the model visible.

color("yellow", 0.5)
    translate([0, 0, 20])
        linear_extrude(height = 2, center = true)
            difference() {
                square(30, center = true);
                projection(cut = true)
                    import("projection.stl");
            }

CSG(Constructive Solid Geometry)

CGS演算

CGS演算とは、計算幾何の基本的な演算です。これは、立体的な形状に対してさまざまな幾何学的操作を行うためのものです。例えば、次のような演算が含まれます。

  • 移動(Translate): 形状を指定した軸に沿って動かします。
  • 回転(Rotate): 形状を指定した軸に沿って回転させます。
  • スケール(Scale): 形状を指定した倍率で拡大または縮小します。
  • 押し出し(Extrude): 2D形状を3D形状に変換します。

これらの演算は、OpenSCADなどの3Dモデリングソフトウェアで頻繁に使用され、複雑な形状の作成や編集に役立ちます。

ブール演算

ブール演算は、3Dモデリングで形状の論理的な結合や分離を行うための基本的な操作です。ブール演算には以下の主要な操作があります。

  • 和(Union): 複数の形状を結合して一つの形状にします。
  • 差(Difference): 一つの形状から別の形状を引きます。
  • 共通部分(Intersection): 複数の形状が重なる部分だけを残します。

これらの演算を使用することで、基本的な形状から複雑なオブジェクトを作成することができます。

例えば、ブール演算を使った例として、以下のように記述できます。

scad

// 和(Union)演算の例
union() {
    cube([10, 10, 10]);
    sphere(10);
}

// 差(Difference)演算の例
difference() {
    cube([20, 20, 20]);
    sphere(15);
}

// 共通部分(Intersection)演算の例
intersection() {
    cube([20, 20, 20]);
    sphere(15);
}

これらの演算により、3Dモデリングの幅が広がり、さまざまな複雑な形状を効率的に作成することができます。

CSG.scad

// CSG.scad - Basic example of CSG usage

translate([-24,0,0]) {
    union() {
        cube(15, center=true);
        sphere(10);
    }
}

intersection() {
    cube(15, center=true);
    sphere(10);
}

translate([24,0,0]) {
    difference() {
        cube(15, center=true);
        sphere(10);
    }
}

echo(version=version());

関数

hull()

複数の形状を包み込む最小の外殻を生成します。形状を滑らかに接続したいときに便利です。

hull() {
    cylinder(h=10, r=5);
    translate([10, 0, 0]) cylinder(h=10, r=5);
}

resize()

形状をリサイズする関数で、各軸方向の大きさを指定できます。

resize([20, 10, 5]) {
    cube([5, 5, 5]);
}

offset()

形状の輪郭をオフセットして、新しい形状を作成します。2Dの形状に特に有用です。

offset(r=3) {
    square([10, 10], center=true);
}

mirror()

指定した平面に対して形状を反転させます。

mirror([1, 0, 0]) {
    translate([10, 0, 0]) cube([5, 5, 5]);
}

dxf_import()

DXFファイルをインポートし、2D形状として使用します。

dxf_import("example.dxf");

minkowski()

ミンコフスキー和を適用する機能です。

module star() {
linear_extrude(height = 1) // 星形ポリゴンを高さ1で押し出し
polygon(points=[
[0,10], [2,2], [10,2], [4, -2], [6, -10], [0, -5], [-6, -10], [-4, -2], [-10,2], [-2,2]
]);
}

minkowski() {
star();
sphere(r=2);
}

text()

// 任意のフォントを使用した文字ブロックの作成

// 文字とサイズ
letter = "M";
size = 30;

// 任意のフォント名(システムにインストールされている必要があります)
font_name = "Book Antiqua";  // 例: "Bitstream Vera Sans", "Courier New,ress Start 2P Regular" など

module LetterBlock(letter, size=30, font=font_name) {
    difference() {
        translate([0,0,size/4]) cube([size,size,size/2], center=true);
        translate([0,0,size/6]) {
            // 文字を作成し、ブロックに切り抜き
            linear_extrude(height=size, convexity=4)
                text(letter, 
                     size=size*22/30,
                     font=font,
                     halign="center",
                     valign="center");
        }
    }
}

// モジュールの呼び出し
LetterBlock(letter, size);

これらの関数を組み合わせることで、さらに複雑で面白い形状を作成することができます。

コメント

Translate »
タイトルとURLをコピーしました