← 網誌

Jig:一次使用 AI 建立 OpenUSD CAD 零件的實驗,不需要 RTX 顯示卡

2026 年 11 月 9 日 · 閱讀時間 9 分鐘

Jig 是我在探索 OpenUSD 的過程中,使用 Claude Code 開發的一個私人專案。只要輸入一句描述,它就能在一般電腦上建立精確的參數化 CAD 零件,透過線稿檢查幾何形狀,並輸出可在 NVIDIA Omniverse 中開啟的 OpenUSD 檔案,以及供製造使用的 STEP、STL 和 3MF 檔案。

同一個 Raspberry Pi 5 外殼的兩種呈現方式。左側是 Jig 的等角線稿,白色線條顯示在深色背景上,隱藏邊線以虛線呈現,並標示各個零件。右側則是外殼的 USD 檔案在 NVIDIA Omniverse USD Composer 中的渲染結果:白色外殼,頂蓋上有一個風扇座。
同一個外殼的兩種呈現方式:左側是 Jig 繪製的線稿,右側則是它的 USD 檔案在 USD Composer 中的渲染結果。

Jig 是從我之前的兩個專案延伸出來的。

DSX POD 場址模擬器是我花三天完成的專案。它的設備模型是透過與 AI 對話建立的,場址也能匯出成 OpenUSD。每個設備都保留為獨立參照,因此在 NVIDIA Omniverse 中開啟時,會是一個由多個獨立元件構成的場景。

之後,我又花了大約一週開發 Plinth。它是一個將數位產品的設計 Token 與文字語氣保存在程式碼中的工具。程式負責能夠精確計算的部分,AI 負責提出草稿,由我確認,每次修改也都會執行檢查。

於是我開始思考,3D 資產是否也能採用類似的方式:以 AI 能夠理解並協助建立的形式描述模型,同時加入相同概念的檢查機制。

這背後還有一個實際原因。OpenUSD 本身是開放的檔案格式,但 Omniverse 的應用程式需要 NVIDIA RTX 顯示卡。因此,每次做場址模擬器時,我都得透過 RustDesk,從 Mac 遠端連線到一台桌上型電腦。我希望能直接在 Mac 上完成建模。

如果我只想在元件進入場景之前,先建立並檢查一個零件,例如支架、外殼或貨櫃,真的需要那張顯示卡嗎?能不能讓 AI 直接以 CAD 的方式建立零件,透過線稿檢查,再交付一個 Omniverse 可以開啟的 USD 檔案?

Jig 就是我用來探索這個問題的實驗。目前已經有其他工具在嘗試 AI 輔助 CAD。我選擇自己動手做,是因為這是我理解整個流程如何串接起來最快的方式。這是一個私人專案,因此這篇文章會分享實作方式與一段實際操作紀錄,而不是公開程式碼。

從一句描述建立 Raspberry Pi 5 外殼:規劃、建模、確認推測尺寸、切出剖面,再將風扇改為 40 mm。實際過程約六分鐘,影片加速播放 13 倍。Claude Code(Sonnet)在背景執行建模工作。

重點摘要

  • 不需要 RTX 顯示卡也能建模:Claude 將每個零件寫成一連串步驟,再由 CAD 核心在 CPU 上計算出精確幾何形狀,最後透過線稿檢查結果。
  • 同一個模型,多種檔案格式:輸出供 Omniverse 使用的 OpenUSD、供其他 CAD 軟體使用的 STEP,以及用於 3D 列印的 STL 和 3MF。
  • 推測尺寸會清楚標示:當 Claude 必須自行假設尺寸時,這些數值會持續保留標記,直到我確認為止。

從一句描述到場景圖

  1. 1
    理解需求
    一句描述、STEP 檔案或照片。缺少資訊時,Claude 會提問,每個問題都附上預設值。
  2. 2
    找現成的
    可以複製來修改的零件:標準零件目錄、我的零件庫、我的其他模型。
    可以參照的資產:SimReady 等資產庫,原始檔案保持不動。
  3. 3
    場景圖我核准
    每個零件都標示為新建、目錄或模型庫。我核准之前,什麼都不會建立。
  4. 4
    骨架
    每個零件先放一個佔位方塊,整個組合一開始就看得到。
  5. 5
    逐件細化
    Claude 撰寫每份配方,CAD 核心在 CPU 上計算,Jig 再檢查;失敗就退回給 Claude。
  6. 6
    確認尺寸
    推測的尺寸會一直標示,直到我確認為止。
  7. 7
    第一個版本
    存檔後可以繼續修改:指定零件就能修改、切開剖面查看內部,並匯出 USD、STEP、STL 與 3MF。
Jig 從一個需求到可修改零件的流程。第 3 步會等我核准;其他步驟會自動進行,遇到需要我決定的地方才停下來。

影片中的操作從一句英文描述開始:

A case for a Raspberry Pi 5: a base and a lid, with a 30 mm fan on the lid.
(一個 Raspberry Pi 5 外殼,包含底座與上蓋,上蓋裝有一個 30 mm 風扇。)

文字描述只是其中一種起點。既有的 STEP 檔案,例如廠商提供的電路板或馬達模型,也可以匯入。Jig 不會把它轉成參數化模型,而是保留原檔,把它當成一個零件的第一個步驟。這樣我就能量測它的尺寸、檢查周圍零件是否配合、以新步驟加上孔洞或切削,並像其他零件一樣輸出成 USD 元件。如果廠商更新了檔案,這個零件會標示為需要重建,並改用新版本。像 STL 這類網格模型無法再加工,所以會以參照的形式匯入。我也開始嘗試從照片與草圖建立模型,不過目前只測試過渲染圖片,還沒有使用手機實際拍攝的照片。

Claude 不會一開始就直接繪製模型。它會先尋找已經存在的零件,包括我自己的零件庫、其他模型、一份小型的標準零件目錄,以及 NVIDIA 在網路上的 SimReady 資產。

這次它找到了一顆標準 M3 螺絲,但沒有找到電路板或風扇,因此提出建立四個新零件,並以場景圖呈現整個外殼的結構。只有在我確認這份規劃之後,才會開始建模。

規劃階段的畫面。左側是需求描述與助理執行步驟,其中兩個步驟標示為失敗。右側是從 Raspberry Pi 5 外殼延伸出的場景圖,包含五個零件:外殼底座、Raspberry Pi 5 電路板、外殼上蓋與 30 mm 風扇,這四個標示為 New;另一顆 M3 上蓋螺絲則標示為 Catalog。
建模規劃:四個新零件與一顆目錄中的螺絲。左側步驟顯示 Jig 退回了 Claude 最初的嘗試,直到每個新零件都有可供建模的初始尺寸。

確認規劃後,Jig 會先在每個零件的位置放置一個佔位方塊,接著由 Claude 逐一建立零件的細節。

每個零件都是一份建模配方,由一連串步驟組成,例如草圖、拉伸、切削與圓角處理。每個尺寸都有明確的名稱,方便日後修改。Claude 負責撰寫這份配方,再由 CAD 核心計算出實際形狀。這裡使用的是 build123d,它建立在開源的 OpenCascade 之上。如果某個步驟失敗,Jig 會將失敗原因回報給 Claude,再由 Claude 嘗試修正。

有些尺寸必須先推測,例如風扇的厚度或螺絲孔距。這些數值會以琥珀色標示,直到我確認為止。幾何形狀本身是精確的,但最終結果仍取決於背後使用的尺寸是否正確。我寧可讓這些推測清楚呈現,也不希望它們被隱藏起來。這次操作中,我接受了所有推測值,並在輸入描述約四分鐘後儲存了第一個版本。

透過線稿檢查零件

Jig 會從俯視、前視、側視,以及 3D 視角繪製每個零件。隱藏邊線會以虛線呈現,尺寸則直接從幾何形狀中量測。

我透過這些圖面檢查尺寸、孔洞,以及零件之間是否能夠配合。Jig 也會檢查零件是否互相重疊,並計算重量。

這些都是基本的幾何檢查,並不等同於工程分析。它們無法告訴我螺絲是否能夠承受負載,或是壁面是否夠堅固。所有檢查都在 CPU 上執行,圖面則以 SVG 檔案呈現,任何瀏覽器都能顯示。

模型編輯頁面。左側是零件樹狀結構,中間是工程圖,右側是組合體資訊。圖面包含等角視圖與三個正投影視圖,以白色線條呈現在深色背景上。資訊欄顯示共 8 個零件、沒有干涉、質量為 0.073 kg,外觀尺寸為 106 × 66 × 37 mm。
第一個儲存的版本。右側欄位顯示幾何檢查結果:共 8 個零件,沒有重疊,重量為 73 g。

單純查看模型不會改變模型本身。剖面切割或其他視角都只會顯示在頁面上,因此我可以自由查看不同位置,也不會因此多出需要儲存的修改。

如果要修改,我會直接從零件開始。我輸入 @,選取風扇,再輸入:

Change @fan to a 40 mm fan.
(將 @fan 改成 40 mm 風扇。)

Claude 修改了風扇,也同步調整上蓋以配合新尺寸:風扇開口從 27 mm 擴大到 37 mm,螺絲孔距則從 24 mm 改為 32 mm。它會列出每一項修改的原始值與新數值,並重新標示新增的推測尺寸。

修改後的編輯頁面。對話紀錄列出修改前後的數值,包括風扇框架寬度從 30 mm 改為 40 mm,以及上蓋的風扇螺絲孔距從 24 mm 改為 32 mm。圖面顯示帶有剖面線的 A–A 剖面,以及尺寸較大的風扇。
風扇改為 40 mm 後,上蓋也隨之調整,零件之間沒有重疊。A–A 剖面只顯示在頁面上。

六分鐘的操作過程中,Claude Code 針對我的三次請求,總共執行了 221 秒。按照 API 計價,費用約為 0.84 美元。我用的是 Claude Code 訂閱方案,所以這些用量計入使用額度,不另外收費。其餘時間主要花在閱讀規劃、確認尺寸,以及切出剖面。

Claude Code 在背景執行,結果呈現在 Claude App

Jig 本身不會直接呼叫模型 API。它的頁面會將每次請求傳送給在背景執行的 Claude Code,並以外掛的形式載入 Jig 的工具。這讓我可以使用 Claude 的新模型與通用工程知識,而不需要自己建立一套 AI Agent。

這些知識確實有幫助。即使沒有機械 CAD 訓練背景的人,也可以詢問兩個零件應該如何連接,再讓 Claude 建立幾種方案供比較。代價是 Jig 目前仍依賴 Claude Code,而且每次執行都會消耗部分使用額度。

Jig 也會為每個模型產生一個獨立的 3D 頁面,並以 Artifact 的形式在 Claude App 中開啟。我可以在手機上用一根手指旋轉外殼、用雙指縮放,點選零件查看名稱,再直接在對話中提出修改要求。

三張手機畫面,展示 Raspberry Pi 5 外殼的 3D 頁面。第一張顯示完整外殼,風扇被點選並顯示名稱。第二張將外殼旋轉至另一端,露出連接埠開口。第三張放大至近距離,透過連接埠開口點選並標示內部電路板。
手機尺寸下的 3D 頁面,以觸控操作模擬:點選風扇、用一根手指旋轉,再用雙指放大,接著透過連接埠開口點選內部電路板。Claude App 會以 Artifact 開啟同一個頁面。

我也可以直接用手機操作整個流程。透過 Claude App,我可以連線到桌上型電腦上的 Claude Code 工作階段,再由它將請求交給 Jig,最後把結果以 Artifact 的形式傳回來。一塊簡單的板子,從輸入描述到存成第一個版本不到一分鐘。

進入 Omniverse

Jig 會為每個零件產生一個 USD 檔案,包含材質、標籤,以及質量等基本物理屬性。組合體則透過參照連結各個零件,而不是將它們複製到同一個檔案中。

這一點在需要修改時最重要。一個 OpenUSD 場景可以參照許多獨立的模型。要修改其中一個,通常得回到 CAD 軟體裡編輯,再重新匯出、轉檔,接著對下一個模型重複同樣的步驟。我想像在模型很多的場景裡,這些時間會很快累積起來。

在 Jig 裡,我只要用一句話提出修改,在電腦前或用手機都可以。Claude 會修改這個零件和需要跟著調整的零件,檢查會重新執行,Jig 再覆寫同一個 USD 檔案。參照這個檔案的場景下次載入時,就會讀到新的版本,場景本身不需要任何改動。

我將這些檔案匯入 Omniverse,確認它們是否能正常運作。檔案可以在 USD Composer 中載入,也能通過 Asset Validator 的檢查,只有一項與檔案格式有關的規則例外。在一個簡單的物理測試中,外殼會落下,最後以一個整體的形式停穩。這就是目前模擬測試的範圍。

Raspberry Pi 5 外殼在 USD Composer 中的渲染畫面:白色外殼,上蓋有方形風扇座與圓形開口,四個角落有螺絲頭,一端則有連接埠開口。
外殼的 USD 檔案在 USD Composer 中開啟,是在配備 RTX 顯示卡的電腦上渲染的。在這次測試中,只有這個步驟需要用到 RTX 顯示卡。

同一個模型也可以匯出成 STEP,供其他 CAD 軟體使用,或匯出成 STL 與 3MF,供 3D 列印使用。

至於已經存在的設備,使用資產庫會比重新建模更合理。NVIDIA 與 Vertiv 在 Hugging Face 上發布了 SimReady 資產,Jig 可以直接以參照的方式匯入,不會修改原始檔案。

部分資產的資料量相當龐大。例如 NVIDIA 的 GB300 機櫃就有將近 2,500 萬個三角面。因此,Jig 會在自己的視圖中顯示一個輕量化版本,當電腦顯示跟不上時,還會進一步簡化模型。

左側是 Jig 的 3D 視圖,三個設備以灰色方塊呈現,勾勒出面板與框架的輪廓。左上角顯示提示,說明為了保持流暢,畫面已經簡化。右側則是 USD Composer 中的完整細節:黑色運算機櫃、白色列間冷卻設備,以及一座開放式機櫃框架。
Jig(左)與 USD Composer(右)中的貨櫃內部場景。兩座機櫃是 SimReady 資產,分別是 NVIDIA GB300 與 Vertiv ORV3 機櫃,採用 CC BY 4.0 授權;中間的白色冷卻設備則是由 Jig 建立的零件。左側 Jig 的畫面是在瀏覽器只用 CPU 渲染的情況下擷取,因此 Jig 切換成較簡化的視圖,並在左上角顯示提示。

Jig 負責建立零件,不負責工廠配置

風扇在外殼上蓋的位置,屬於外殼建模的一部分。但外殼、機櫃或機器應該放在工廠的哪個位置,感覺就是另一種工作。在 USD 的架構中,這似乎應該由負責建立場景的人處理。

Jig 可以將零件放在一起,檢查它們是否能夠配合,但我不認為工廠配置應該成為它的工作範圍。我也很好奇,實際的團隊是怎麼分工的。

為了驗證當初的出發點,我在自己的 Mac 上使用 Jig 建立了一座貨櫃式資料中心。這台電腦是一台較舊的 Intel MacBook Pro,沒有 NVIDIA 顯示卡。場景以先前場址模擬器專案中的 GIGABYTE GADU 為基礎。貨櫃、電力模組與冷卻設備由 Jig 建模,冰水機與機櫃則取自 SimReady 資產庫。

USD Composer 中的貨櫃場景:一座一端開口的 40 呎貨櫃、兩台配有成排黑色風扇的長型冰水機,以及一座電力模組,放置在深色地面上。
貨櫃場景先在 MacBook 上使用 Jig 建立,再到配備 RTX 顯示卡的電腦上,透過 USD Composer 開啟。冰水機使用 Vertiv FF3135 SimReady 資產,採用 CC BY 4.0 授權。

讓流程形成閉環:兩個尚未實現的構想

建模、模擬、調整

Claude 建立零件,Omniverse 在模擬中測試,再將結果回傳 Jig,進行下一輪修改。目前這只是一個流程的草圖,還稱不上計畫。

  • 目前已有:能夠在 Omniverse 中開啟、包含基本物理屬性的 USD 檔案。
  • 尚未完成:把模擬結果讀回 Jig、判斷何時應該停止,以及決定每一輪應該在哪個階段由我確認。

列印、測量、調整

透過 3D 列印機製作零件,再根據照片、溫度與零件重量,讓 Claude 建議應該如何調整模型。

  • 目前已有:每個零件的列印紀錄,以及透過 OrcaSlicer 取得的列印時間與耗材估算。
  • 尚未完成:與列印機的連線、一台攝影機,以及列印機本身。

接下來的方向

一台 3D 列印機

我目前還沒有 3D 列印機。添購一台,實際測試第二個閉環流程,會是很好的下一步。

Claude Code 之外

我也希望未來能讓 Jig 不再綁定 Claude。它的工具已經採用 MCP,也就是其他 Agent 同樣能使用的開放協定。目前真正讓 Jig 與 Claude 綁定的,主要是它的頁面如何啟動 Claude Code。

如果能將這部分開放,就能讓使用者自行選擇 Agent,包括在自己電腦上執行的模型,讓機密零件資料不必離開本機。較小型的本地模型可能會犯更多錯誤,我也很好奇現有的檢查機制能在多大程度上彌補這些問題。

一個模型,還是兩個?

我一直在思考,模擬與製造是否應該共用同一個模型。

用於 Omniverse 生產線的模型,需要外觀、標籤、物理屬性,以及輕量化的檔案。用於實際製造的模型,無論是 3D 列印、CNC 加工或鈑金製作,則需要精確尺寸、公差與工程圖。

兩者需要的檢查也不同:壁厚是否印得出來?刀具能不能加工到角落?鈑金能不能順利折彎?Jig 目前已經有幾項 3D 列印檢查,例如壁太薄,以及需要支撐的懸空結構。CNC 與鈑金則還沒有任何檢查。

我目前的想法是採用一個模型、兩種輸出:保留同一份參數化零件幾何,再針對模擬與製造提供不同的輸出格式和檢查機制。前面提到的兩個閉環流程,最終都會回到同一個模型,這也是我傾向這個方向的原因。

不過,每天實際從事模擬或製造工作的人,可能會有不同看法。我也很希望聽聽他們的想法。對我來說,這仍然是一個開放的問題。

目前的進度

Jig 目前仍是一個概念驗證專案。我在完成 Plinth 後,花了大約三天建立它。它可以在 Windows 與 macOS 上搭配 Claude Code 執行,目前有 176 項自動化測試。我目前是唯一的使用者,專案也尚未開源。

目前成果:從一句描述建立精確的參數化零件,在一般電腦上完成建模,既有的 STEP 檔案也能作為固定零件,在上面繼續加工;產生線稿與基本幾何檢查;輸出包含材質、標籤與基本物理屬性的 USD 檔案,並能在 USD Composer 中開啟;同時也能輸出 STEP、STL 與 3MF 檔案,供後續製作使用。

最後,回到一開始的問題。建立並檢查一個零件,不需要 RTX 顯示卡,使用 Mac 就足以完成建模。直到最後將外殼匯入 Omniverse 進行渲染時,才需要用到那張顯示卡。

接下來,我想知道這套流程有多少部分,能真正應用在實際的數位孿生專案中。