Intro to Computational Design

2026 | Computational design | Rhino / Grasshopper / Python / Cpp

An introduction to computational design using Rhino, Grasshopper, and Python. Covers three core modeling approaches in Rhino, external communication with Python 3, and Model Context Protocol (MCP).


1. 概要

1.1 ゴール

1.2 用語

フォーカスするポイントの異なる様々な言葉があります。⚠️使う人や文脈によって意味が変わります。

用語 定義
CAD (Computer Aided Design) コンピューターを用いた設計・デザイン手法全般。
Computational Design 計算能力や数理的アプローチをデザインプロセスに統合する手法の総称。
Algorithmic Design 論理的・数理的手順(プロセス)を組み立てることに着目。
Procedural Design 大体同じ。
Parametric Design (アルゴリズムを組んだ上で)パラメーター操作で形状を制御することに着目。
Generative Design 制約条件とゴール(荷重、重量、製造要件等)を設定し、アルゴリズムやAIに最適解を自律探索・生成させる手法。

Parametric Architecture

  • 一般的には… 単なる「Grasshopper等を用いた複雑・有機的な建築造形」
  • 「日照、風向、構造負荷等の多角的環境パラメーターを統合した最適化プロセス」と主張する人もいる
  • ザハ・ハディド・アーキテクツのパトリック・シューマッハ氏が21世紀の建築様式「Parametricism」として提唱(参考:A simple guide to parametricism

Generative Design

1.3 モデリングアプローチ

1.4 Rhinoceros


2. Grasshopper

2.1 コンセプト

2.2 主要操作

  1. 起動・ファイル: コマンド Grasshopper / 拡張子 .gh
  2. コンポーネントの呼び出し: メニュータブ選択、またはキャンバスダブルクリックによるキーワード検索(例:Sphere で球体生成、10.0 でスライダー生成、// でパネル生成等)。
  3. ノード操作:
    • 通常ドラッグで接続
    • Shift + ドラッグで複数接続(上書き防止)
    • Ctrl + ドラッグで接続解除
  4. コンポーネントの制御(右クリック):
    • Enabled / Disabled: 処理の有効化/無効化
    • Preview: ビューポートでの描画ON/OFF
    • Bake: ジオメトリのRhinoオブジェクト化
  5. Bake(ベイク):
    • Gh上で操作中のジオメトリは「一時的なプレビュー表示」。
    • Bakeを実行することで、通常のCAD要素として空間に「焼き付け」される。
    • 注意点: Bake後の要素はGh側のパラメーター変更と連動しなくなる。
  6. 端子(入力・出力)の動的制御(ズーム操作):
    • 端子の増減(Merge, Entwine, Python 等):
      • コンポーネントに一定以上近づく(ズームインする)と、端子付近に「+ / 」アイコンが表示される。
      • +」をクリックで接続ポイントを追加、「」で削除が可能。
    • 端子の設定・カスタマイズ(端子を右クリック):
      • データ構造の直接変更(Flatten, Graft, Simplify 等のデータプリセット適用)。
      • 端子名(変数名)の変更や、入力データ型の指定(Type Hinting)。

2.3 データ構造(データツリー)

他プログラミング言語の「多次元配列」「ネストされたリスト」に相当するGh独自の概念です。使っているとなんとなくわかってきます。

参考: Lesson 3 - Data structures

2.4 Grasshopperの学習

基本的な操作を学習したら、作りたいものを作りながら学習していくのが効果的。

Grasshopperリソース:

チュートリアル:

参考書籍:

AIを使った学習:

  • Grasshopperはドキュメントが豊富でコミュニティも活発なため、多くの場合AIに質問することで適切な回答を得ることができます。
  • Grasshopper定義を通常の.ghではなく.ghx形式(XMLベースのプレーンテキスト)で保存すると、AIが解析できるようになります。

Find Component: コンポーネントを Ctrl + Alt を押しながらクリックすると、そのコンポーネントが上部タブのどこにあるかを赤い矢印で視覚的に教えてくれる。

拡張プラグイン集: Food4Rhino

Grasshopperには、様々な機能を拡張するプラグインがあり、Food4Rhino で多くのツールを探すことができます。用途に応じて既存のプラグインを導入すれば、解析、生成、インタラクション、製造支援など、幅広いワークフローに対応できます。


3. Rhino Script

3.1 実行手順・ライブラリ

  1. 環境の起動と実行手順

    Rhino、Grasshopperどちらからもスクリプトを利用することができます。Rhino上ではバッチ処理・自動化、Grasshopper上ではノード機能の補完・パラメトリックなデータ処理としてスクリプトを利用します。

    • Rhino上で実行する(ワンショット自動化)
      • メニュー → ツール → スクリプト → 編集 でスクリプトエディタ(Rhino 8では Script)を起動。
      • コード記述・実行により、Rhino空間のオブジェクトを直接生成・編集。
      • .py ファイルとして保存し、単体コマンドやツールボタンに割り当てて再利用可能。
    • Grasshopper上で実行する(動的・パラメトリック処理)
      • キャンバス上に Python 3 Script コンポーネントを配置。
      • コンポーネントの入力端子(x, y等)からデータを受け取り、処理結果を出力端子(a等)へ渡す。
      • キャンバス上のパラメーター変更に応じてスクリプトがリアルタイムに再計算される。
      • 入力・出力端子の名前と型(int, Line, Brepなど)は、スクリプト内の変数に合わせる必要があります。
  2. 主要ライブラリ

    Rhino機能の操作、および外部データ処理を行うための主要ライブラリ。

    カテゴリ ライブラリ 概要・用途 リンク
    Rhino操作 rhinoscriptsyntax Rhinoコマンドに相当する操作を直感的に記述できる高レベル・ラッパー関数群。 RhinoScriptSyntax
      Rhino.Geometry (RhinoCommon) ジオメトリを直接扱う下層コアAPI。高度な幾何計算や高速処理向け。 RhinoCommon API
      ghpythonlib.components Grasshopperの既存ノード機能をPythonコード内から直接呼び出して実行。 Node in Code from Python.
    その他 (Rhino 8 / Python 3) 標準ライブラリ math(数値計算)、random(乱数生成)、json / os(ファイル処理)など。  
      外部CPythonライブラリ NumPy, SciPy, Pandas, PyTorch等。# env: numpy 等の記述で読み込み可能。  

3.2 Rhinoスクリプトのアーキテクチャ

  1. ライブラリの階層

    レイヤー コンポーネント 役割・技術スタック
    最上層 (ユーザー記述) スクリプト Python 3 / C#: ユーザーやAIが記述するコード領域。
    高レベル処理 rhinoscriptsyntax Pythonラッパー: RhinoCommonを初心者向けに簡易化した関数群。
    共通API層 RhinoCommon .NET Core API: Rhinoの全機能にアクセスする公式クロスプラットフォームAPI。
    最下層 (コアエンジン) Rhino Kernel C++ ネイティブエンジン: 幾何演算・描画を高速処理するRhino本体。
  2. 動作言語

    言語 特徴・用途 Rhinoでの位置付け
    Python 3 (CPython) AI/LLMとの親和性が極めて高く、外部ライブラリ統合が容易。 現在の推奨標準環境 (Rhino 8〜)
    Python 2 (IronPython) 旧Rhino 7までの標準(.NET上で動作するPython実装)。 互換性維持目的の旧環境
    C# 高度なプラグイン・カスタムコンポーネント開発用。 開発者向けネイティブ環境
    VBScript 旧世代のRhinoScript。 非推奨

    バイブコーディング:

    • ハルシネーション(存在しない関数の捏造など)を防止するため、試行環境(例: Rhino 8 / Python 3)とライブラリ(rhinoscriptsyntax)を指定
    • エラー発生時はエラーメッセージを返しデバッグ

3.3 スクリプトデモ例:フラクタルツリー(再帰処理)

  1. 概要 再帰関数と乱数を用いた幾何生成デモです。Grasshopper(動的パラメーター制御)と Rhino単体(直書きワンショット実行)の両方で検証できます。

  2. Grasshopper上での実行手順
    • キャンバスに Python 3 Script コンポーネントを配置。
    • 端子設定(右クリックし、名前と型を変更)
    • コンポーネント内にコードを貼り付け、Inputにスライダーを繋いでライブ操作。
      名前 目的
    Input gen Integer 世代数制限
      angle Float 分岐角
      scale Float 縮小比
    Output Lines Line アウトプット
  3. Rhino上での実行手順
    • メニュー → ツール → スクリプト → 編集 でエディタを開き、コードを貼り付けて直接実行。
  4. Pythonコード(Rh/Gh共通)

     import rhinoscriptsyntax as rs
     import random
    
     # 入力変数の初期化 (Rhino単体実行用)
     gen = globals().get('gen', 6)
     angle = globals().get('angle', 25.0)
     scale = globals().get('scale', 0.8)
     seed = globals().get('seed', 42)
    
     random.seed(seed)
     Lines = []
    
     # 幹の生成
     A, V = [0, 0, 0], [0, 0, 1]
     B = rs.PointAdd(A, V)
     Lines.append(rs.AddLine(A, B))
    
     # 再帰分岐関数
     def Grow(pt, v, s, a, g):
         if g >= gen: return
         v = rs.VectorScale(v, s)
         plane = rs.PlaneFromNormal(pt, v)
         circle = rs.AddCircle(plane, 0.1)
         t = rs.CurveClosestPoint(circle, A)
         rot_axis = rs.VectorCreate(pt, rs.EvaluateCurve(circle, t))
    
         for sign in [-1, 1]:
             V_next = rs.VectorRotate(v, sign * a + random.uniform(-3, 3), rot_axis)
             pt_next = rs.PointAdd(pt, V_next)
             Lines.append(rs.AddLine(pt, pt_next))
             Grow(pt_next, V_next, s, a, g + 1)
    
     Grow(B, V, scale, angle, 0)
    

3.4 スクリプトのコマンドボタン化

作成した .py スクリプトをRhinoのコマンドにできます。

  1. 保存: コードを .py 形式でローカル(任意フォルダ)に保存し、ファイルの絶対パスをコピー。
  2. ボタン作成: ツールバーの空白領域で右クリック → 新規ボタン を選択。
  3. マクロ設定: コマンド欄に ! _-RunPythonScript "ファイルの絶対パス" と入力して保存。
    • (注: _- はダイアログをスキップして即時実行させるための記述)

4. モデリングアプローチ比較

項目 手動操作 Grasshopper スクリプト
操作 CLI・マウスによるGUI操作 ノード接続(ビジュアルプログラミング) テキストコード(Python/C#)
強み 直感的、事前のロジック設計不要 構造視認性が高い、リアルタイム検証 バッジ処理、ループ/条件分岐
弱み・リスク 大量処理・仕様変更時の工数大 複雑化によるスパゲッティコード 構文・APIの習得コスト
AI(LLM)親和性 極めて低い 低い(グラフ構造生成の難しさ) 極めて高い(コード生成領域)

効率化の思考フレーム: The 5-Step Algorithm (Elon Musk)

Ghやスクリプトで自動化する前に… 「自動化する必要がないことを自動化していないか?」

  1. 要件を疑え: 前提仕様そのものの不必要性を検証する。
  2. プロセスを削除せよ: 不要な工程を破棄する。
  3. 単純化・最適化せよ: 残った工程をシンプルにする。
  4. サイクルタイムを加速させよ: 処理速度を向上させる。
  5. 自動化せよ: 上記を経た上で最終手段として自動化を導入する。

5. 応用例

5.1 Rhino外部通信: IMU・超音波センサーを使ったメッシュ変形システム

  1. 概要

    マイコンとGrasshopperを接続し、センサーデータで3Dジオメトリーをリアルタイムに変形させるインタラクティブな造形システムです。

    • IMUの傾きに合わせたメッシュのフロー変形
    • 超音波センサーによる距離連動パラメータ:
      • 距離が近い場合: 細かい波
      • 距離が遠い場合: ゆったりした波

    ファイル: GitHub Repository

    システム

     [ 物理世界 / センサー ]
     │ MPU-6050 (IMU)    : 運動 / 姿勢変化
     │ HC-SR04 (超音波)   : 手の距離 (分圧:Echo → [1kΩ] → D3 ← [2kΩ] GND)
     ▼
     [ 信号処理・マイコン (XIAO RP2040) ]
     │  - センサ読み取り & 重力補正フィルター
     │  - CSVテキスト成形 ("lin_ax,lin_ay,lin_az,gx,gy,gz,dist\n")
     ▼
     ════════════════════════════════════════════
         USB Serial 通信 ( Baudrate: 115200 )
     ════════════════════════════════════════════
     ▼
     [ 視覚化・CAD (Rhino 8 / Grasshopper) ]
     └─ [ GH Python Component ]
             - pyserial でリアルタイムデータ受信
             - 距離データ ──> メッシュ表面の2軸波紋生成
             - 運動データ ──> 全体のひねり・伸縮(Transform)変形
    
  2. ハードウェア

    • 使用部材
      • マイコン: XIAO RP2040
      • IMU: MPU-6050 (6軸: 加速度3軸 + ジャイロ3軸)
      • 超音波距離センサー: HC-SR04
      • 分圧抵抗: 1 kΩ, 2 kΩ (各1本)
    • ピンアサイン

      HC-SR04のEcho信号(5Vロジック)をXIAOの耐圧(3.3V)に合わせるため、1kΩ / 2kΩの抵抗による分圧回路を使用(Echo → [1kΩ] → D3 ← [2kΩ] GND)。

      モジュール ピン名 XIAO 接続ピン 補足
      HC-SR04 VCC 5V 5V電源供給必須
        Trig D2 GPIO(トリガーパルス出力)
        Echo D3 分圧回路を経由
        GND GND  
      MPU-6050 VCC 3V3  
        SDA D4 I2C
        SCL D5 I2C
        GND GND  
  3. ファームウェア

    センサーデータの取得と初期処理を担います。

    • 環境: PlatformIO (C++)
    • 処理内容:
      • MPU-6050から加速度・角速度を取得。
      • HC-SR04から距離データ(cm)を計測。
      • 重力影響カットのため、加速度データへハイパスフィルター(HPF)を適用。
      • シリアル出力: 115200 bps(CSV形式:lin_ax,lin_ay, lin_az, gx, gy, gz, dist\n
  4. Grasshopper概要

    XIAO RP2040に接続したセンサーデータを、ファームウェア経由でシリアル通信、Rhino GrasshopperのPython(pyserial)でリアルタイム受信、3Dジオメトリーを編集。

    処理工程 スクリプト / コンポーネント 処理概要・詳細
    データ受信 imu_sonic_serial.py pyserial でUSBシリアル経由でデータを受信・パース。 Trigger コンポーネント(100ms周期)によりGHキャンバスを自動更新。パラメータ(ポート /dev/cu.usbmodem14101, ボーレート 115200)は書き換え可能。
    ベース形状 & Flow変形 - 回転体(Revolve)生成後、QuadRemesh でメッシュ化。IMUの gravity_vec(重力ベクトル)を用い、傾き方向へFlow変形。
    波紋テクスチャ生成 mesh_wavy_deform.py 直交する2軸のSine波を法線方向へ付与。 distance 連動: 近い=振幅が大きい + 波長が短い(、遠い=振幅が小さい + 波長が長い。
    最終出力 - SubD from Mesh で滑らかなSubDサーフェスとして出力。

    Ghポイント

    • 外部ライブラリの自動ロード(インラインディレクティブ)
      • Rhino 8のPython 3環境では、スクリプト冒頭に # r: <package_name>(例: # r: pyserial)を記述することで必要な外部ライブラリが自動的にロードされます(pip installなどは不要)。
    • Grasshopper側における再計算トリガーTriggerの役割
      • Grasshopperでは通常「パラメータの変化時のみ」再計算されます。
      • Triggerコンポーネントを接続することで一定周期(例: 100ms)で定期的にコンポーネントを再計算させ、ジオメトリを更新し続けます。


5.2 G-code生成 & 送信 (Slicer & Sender)

  1. 概要

    スライサーソフトを使わず、Grasshopperで直接G-codeを生成するワークフローにより、非平面パスや吐き出し量の調整など、様々なカスタマイズが可能になります。

    ファイル: GitHub Repository

  2. スライサー

    Gh定義(非平面パスの例):

    • Geometry → Curve → Point → XYZ Coordinateへ変換
    • Geometry上に波状のCurveを作成
    • Curveを分解しPointを作成、XYZ座標に変換
    • 移動距離に対応した押し出し量(E)の計算(吐出し面積 / フィラメント断面積 * 移動距離
    • G-code としてフォーマット、スタートプロトコル・エンドプロトコルを連結(Concatenate

    G-code 例: G1 F1200 X110 Y90 Z0.2 E0.2

    G0 / G1 F X Y Z E ; Comment
    移動を初期化(非押出移動にはG0、押出移動にはG1) フィードレート(移動速度)(mm/min) 座標(mm) 移動単位ごとの押出量(mm) セミコロン以降のテキストは無視(コメントや説明用)

    BambuLab SDカード補足:

    • マイクロSDカード
      • 取り外し: 設定 → SDカード → 取り外し
      • .gcodeをマイクロSDカードのルートディレクトリに入れる
      • 印刷: ファイル → 2つ表示されるうち、右側を選択 → 開始(左側は隠しファイル._~~~.gcode
    • Bambu Studio .3mfファイル
      • 拡張子は .3mf (あるいは .gcode.3mf)だが中身は、G-codeやサムネイル画像、設定ファイルを圧縮した「Zipアーカイブ」
      • 拡張子を .zip に変えると解凍できる

    サンプルG-codeの仕様:

    • 対象機種:Bambu Lab A1 mini
    • ノズル径:0.8 mm
    • フィラメント:1.75 mm PETG

    Start / End Protocol

    印刷開始前の準備動作、印刷完了後の安全停止動作のコマンド。プリンターにより異なるので、スライサーソフトで生成されるG-codeを流用・解析する必要があります。

    コマンド例 分類 指示
    G1 移動制御 指定した速度(F値)で直線移動(E軸指定時は樹脂押し出しを伴う)
    G28 原点復帰 設定された全軸(X, Y, Z)のホームポジションへの移動・原点確定
    G90 座標指定 絶対座標指定モードへの切り替え(原点を基準とする移動)
    G91 座標指定 相対座標指定モードへの切り替え(現在地を基準とする移動)
    G92 座標設定 現在位置の座標値(E軸など)を指定した値へ再設定・リセット
    M106 ファン制御 パーツ冷却ファンの出力設定・作動
    M140 / M104 加熱制御 ベッド / ノズルの目標温度を設定(非ブロッキング/到達を待たずに次行へ)
    M190 / M109 加熱制御 ベッド / ノズルの目標温度設定と到達待機(ブロッキング/指定温度まで停止)
    M420 ベッド補正 自動ベッドレベル補正データの読み込み・有効化
    M84 モーター制御 ステッピングモーターの給電(励磁)をオフにする
  3. G-codeセンダー(WIP)

    さらに、ローカルネットワーク(Wi-Fi)接続したBambuLabプリンターを、GhからMQTTサーバーを介してG-codeを送付できないか検討中…

参考:


6. MCP(Model Context Protocol)

6.1 概要・主要ツールの最新動向

6.2 MCP のシステム構成・通信フロー(Rhinoの例)

6.3 Fusion MCP デモ

設定方法

  1. Fusion 360側の設定:
    • Preferences → General → API
    • Fusion MCP Serverにチェック

  2. Claude Desktop側の設定:
    • チャット欄の「+」メニューから「Connectors」を開き、「Fusion」を検索し追加
    • 権限設定と認証: Configureを開いてすべてのTool permissionsAlways allowにする
  3. 参考

デモ結果

Claude Fusion MCPを使用した、回転寿司アセンブリモデルの作成デモ。

  1. 初めのプロンプト: MCP経由で1操作(スケッチ描画・押し出し等)ごとにAPI呼び出しと画面レンダリング(確認)を繰り返したため、シャリ1個の作成でトークン・API使用上限に到達。

     以下のモデリングをしたいので、まず計画を立ててください。
     他に必要な情報があれば教えてください。
     スケーラブルなローポリ回転寿司屋
     - ネタパート、シャリパート
     - 寿司アセンブリ
     - 皿アセンブリ(2つ以上の寿司アッセン)
     - ベルトコンベアパート、アセンブリ
     - 寿司職人
     - 寿司屋アセンブリ(ベルトコンベア、寿司、職人)
     要件
     - これらの寿司ネタ、寿司の数はパラメトリックでスケーラブル
     - Fusionのパート・アセンブリを使い、パート、子アセンブリを更新できること
     - それぞれのモデルはローポリで最低限のジオメトリー
     - パートの色は現物に近づけること
    
  2. 改善版(一括処理指示): 「一括実行により画面描画の確認を減らす」「スクリプトによる処理」プロンプトへ変更。寿司・皿・コンベア・職人のアセンブリ構築に成功。ただし配置数がパラメトリックに編集できなくなる弊害もあった。

     パラメーター作成からモデリングまで一括で実行してください。スクリプト内で全処理(パラメータ作成、コンポーネント作成、アセンブリ配置)を一度に完了させる構成にしてください。
     モデルの形状はシンプルなボックス形状メインで良いです。色の割り当ても省略して良いです。
    

    (履歴のリプレイ)

    ローポリ寿司職人の生成(4x)

デモまとめ

現時点では多くの場合「自分がやった方が早い」が、大まかなベース、叩き台のモデリングには有効そう。 Fusionのモデリング履歴が残り後で調整できるため、アセンブリ構造の作成や、Web検索を活用した汎用部品の寸法に基づいたモデル作成(例:Nema17を配置して 1×08SMDピンヘッダーを作って)などに活用できそう。

  内容・要点
課題点 GUI描画や視点切り替え処理によるAPIトークンの大量消費
API経由でのカメラズーム・全体の視覚確認動作の不安定さ
有用な点 正確な階層・アセンブリ構造構築
コンベア接線配置や空間クリアランスの自動座標計算
パラメータ変更に全パーツが自動追従する拡張性
プロンプト改善点 描画抑制(「途中の描画・視点変更は不要」と指示しトークン節約)
フェーズ分離(ツール実行前に構造計画・コード確認を挟む)