Gemini × OpenSCAD:手書き図面とチャットだけで3Dモデル(STL)を作ってみた【爆速モデリング術】

3Dプリンター用のモデルを作るとき、Fusion 360などのCADソフトでマウスをカチカチ操作するのに疲れていませんか?

今回は、Googleの生成AI 「Gemini」 と、プログラムで形状を作るCAD 「OpenSCAD」 を組み合わせた、モデリング方法をご紹介します。

結論から言うと、「簡単な手書き図面と自然な日本語で指示するだけで、欲しかったパーツの3Dプリンタ用のSTLモデルが完成する」 という、今までとは全く違う手法で実現することができました。

1. OpenSCADとは?:マウスを使わない「プログラマのためのCAD」

まず、今回使用した OpenSCAD について簡単に解説します。 OpenSCADは、BlenderやFusion 360のような「マウスで直感的に形を作るソフト」とは全く異なるアプローチをとる、フリーの3D CADソフトウェアです。

公式サイトでは "The Programmers' Solid 3D CAD Modeler" と謳われており、その名の通り「コードを書いて3Dモデルを生成(コンパイル)する」のが最大の特徴です。

主な特徴は以下の3点です。

  1. 形状を「論理演算」で作る(CSG) 積み木のような単純な図形(立方体、球、円柱など)を足したり引いたりして形を作ります。
    • union():結合(足し算)
    • difference():切り抜き(引き算)
    • intersection():共通部分(掛け算)
  2. パラメトリック設計が得意 寸法を数字で直接指定するのではなく、変数として定義できます。例えば width = 20; と定義しておけば、後から「やっぱり1. 30mmにしたい」と思った時、変数の値を1つ書き換えるだけで、モデル全体が一瞬で修正されます。
  3. テキストデータだから管理しやすい 3Dデータの実体はただのテキストファイル(.scad)です。Gitでのバージョン管理やDiff(差分)確認が容易です。

1.1. なぜ AI (Gemini) と相性が良いのか?

ここが今回の肝です。 通常のCADは「マウスの動き」が主体となるため、テキストベースのAIに操作させるのは困難です。しかし、OpenSCADは「テキスト(コード)」そのものです。

この3者の役割分担が完璧に噛み合っているため、「プログラミングの知識がなくても、言葉だけで正確な寸法モデルが作れる」 という新しいワークフローが実現します。


2. 実践:ハット型部品を作る

では実際に、Geminiとペアプログラミング(ペアモデリング?)をして、ある実験用の「ハット型(帽子型)」の部品を作ってみます。

2.1. 最初の指示:ベース形状を作る

まずは手書きで適当に描いた図面の画像を提示してモデリングしてもらいました。定規も使っていないフリーハンドで、寸法を変更した箇所もペンで消して書き直すという、かなりひどい図面とも言えない写真です。 この写真と「奥行きを34mmにして」という指示のみです。

Geminiは即座に polygonlinear_extrude を使ったコードを書いてくれました。これをOpenSCADにコピペするだけで、ベース形状が表示されました。

Information

足りない情報は自動的に補足して生成してくれたようです。

補足が必要な点 図面に記載がなかったため、以下の2点は私(Gemini)が「一般的な値」として仮置きしています。コード内で簡単に変更できます。

高さ (Height): 15mm としました。 厚み (Thickness): 2mm としました。

2.2. 追加指示:リブを立てる

次に、ゴムバンドを通すためにリブを追加します。

私: 「上面の20mmの辺に沿って、幅2mm 高さ4mmのリブを追加して。」

ここでのポイントは、Geminiが union() を使って既存のモデルに新しい形状を適切に結合してくれたこと。座標計算も「上面の高さ + 板厚」を考慮して配置してくれました。

3. 完成したコード

最終的にGeminiが出力したコードがこちらです。(数回のラリーで完成!)

// --- パラメータ設定 ---

// [全体の寸法]
total_depth = 34;      // 奥行き
top_width = 20;        // 上面の幅
bottom_gap_width = 30; // 下部の隙間の幅
flange_width = 10;     // フランジの長さ
model_height = 15;     // 高さ
thickness = 2;         // 本体の厚み

// [リブ(垂直部分)の寸法]
rib_width = 2;         // リブの厚み
rib_height = 4;        // リブの高さ

// [フック部分(水平部分)の寸法]
lip_len = 5;           // 追加する面の長さ
lip_thick = 2;         // 追加する面の厚さ

// 座標計算用
x_inner_bot = bottom_gap_width / 2;
x_inner_top = top_width / 2;
x_outer = x_inner_bot + flange_width;
rib_top_y = model_height + thickness + rib_height;

union() {
    // 1. 基本のハット型
    translate([0, 0, -total_depth / 2])
    linear_extrude(height = total_depth) {
        polygon(points = [
            [-x_outer, 0], [-x_inner_bot, 0], [-x_inner_top, model_height],
            [x_inner_top, model_height], [x_inner_bot, 0], [x_outer, 0],
            [x_outer, thickness], [x_inner_bot, thickness],
            [x_inner_top, model_height + thickness],
            [-x_inner_top, model_height + thickness],
            [-x_inner_bot, thickness], [-x_outer, thickness]
        ]);
    }

    // 2. リブとフック(手前側)
    translate([0, model_height + thickness + (rib_height / 2), (total_depth / 2) - (rib_width / 2)])
    cube([top_width, rib_height, rib_width], center = true);

    translate([0, rib_top_y - (lip_thick / 2), (total_depth / 2) - rib_width - (lip_len / 2)])
    cube([top_width, lip_thick, lip_len], center = true);

    // 3. リブとフック(奥側)
    translate([0, model_height + thickness + (rib_height / 2), -(total_depth / 2) + (rib_width / 2)])
    cube([top_width, rib_height, rib_width], center = true);

    translate([0, rib_top_y - (lip_thick / 2), -(total_depth / 2) + rib_width + (lip_len / 2)])
    cube([top_width, lip_thick, lip_len], center = true);
}

あとは、STL形式にエクスポートすれば、3Dプリンタで印刷することができます。

3Dプリンタで印刷したモデル

4. FAQ

プログラミングの知識は全くなくても大丈夫ですか?
はい、基本的には大丈夫です。 今回はGemini(AI)がコードを書いてくれるため、ユーザーは日本語で形状を説明したり、寸法を伝えるだけで済みます。ただし、生成されたコードの数字(width = 20など)を少し書き換える程度の操作は発生するため、全くの未経験でも「コードを見ることに抵抗がない」方であれば問題なく楽しめます。
OpenSCADは無料で使えますか?
はい、完全無料です。 OpenSCADはオープンソースソフトウェア(GPLライセンス)として公開されており、Windows、Mac、Linuxのいずれでも無料で使用できます。サブスクリプション契約などは一切不要です。
Gemini以外のAI(ChatGPTやClaude)でも同じことができますか?
はい、可能です。 ChatGPT (GPT-4) や Claude 3.5 Sonnet など、コーディング能力が高い主要な生成AIであれば同様にOpenSCADのコードを出力できます。今のところ、画像認識(手書き図面の読み取り)とコード生成を同時に行えるモデルを使うのがおすすめです。
手書き図面はどれくらい丁寧に描く必要がありますか?
かなり適当でも伝わります。 記事内の例のように、定規を使わないフリーハンドの線や、修正液の跡があっても、AIは数字と大まかな形状を認識してくれます。重要なのは「寸法(数字)」が読み取れることです。もしAIが読み間違えた場合は、チャットで「幅は20mmだよ」と訂正すればすぐに直してくれます。
Fusion 360などの一般的なCADとの違いは何ですか?
「直感的か、論理的か」の違いです。 Fusion 360はマウスで粘土をこねるように直感的に作れますが、履歴の管理が複雑になりがちです。OpenSCADはすべてが「文字」で書かれているため、後から「全体の幅を1mm広げる」といった修正が非常に得意です。一方で、フィギュアのような有機的で複雑な曲面を作るのには向いていません。
作ったモデルのサイズを変更するのは大変ですか?
非常に簡単です。 AIが作成するコードの多くは「パラメトリック(変数的)」に書かれています。コードの冒頭にある width = 30; などの数字を書き換えてプレビュー更新ボタンを押すだけで、モデル全体のバランスを保ったままサイズが変更されます。
複雑な形状も作れますか?
直線的・幾何学的な形状(ケース、治具、ブラケットなど)は得意です。 一方で、キャラクターのフィギュアや、複雑な曲面が入り組んだデザイン(車のボディなど)は、コードで表現するのが非常に難しいため不向きです。そういった用途にはBlenderなどのソフトをおすすめします。
低スペックのPCでも動きますか?
はい、比較的軽量です。 OpenSCADは非常に軽量なソフトなので、数年前のノートPCやMacBook Airでも十分に動作します。重厚な3D CADソフトのようなハイスペックなグラフィックボードは必須ではありません。
生成されたSTLファイルはそのまま3Dプリンターで印刷できますか?
はい、印刷可能です。 OpenSCADからエクスポートしたSTLファイルは、CuraやPrusaSlicerなどの一般的なスライサーソフトで読み込むことができます。