Sandflow 開源 Sand3D:專為 LLM 打造的 Python 3D 建模語言與 10 萬件程式碼化 3D 資料集
法國里昂 AI 新創公司 Sandflow 於 2026 年 11 月 5 日正式開源發布 Sand3D 建模語言與對應的 Sand3D 3D-as-Code 資料集系列。這項計畫將超過 10 萬個 3D 物件(涵蓋螺絲等機械零件、日常家具到平台鋼琴與可動機構)全面改寫為人類易讀、大型語言模型(LLM)易於生成的 Python 程式碼,解決過往 3D 領域缺乏統一程式碼訓練基底的瓶頸(FabScene 報導)。
一般 3D 檔案格式(如傳統網格檔)僅記錄物體表面的幾何頂點,模型難以直接理解零件結構或進行參數化修改。透過 Sand3D,每個 3D 物件都是一支獨立的 Python 程式,清楚描述每個部件的輪廓、實體成形方式、孔洞編輯、相對座標、材質與可動關節,讓語言模型能像讀寫一般軟體程式碼一樣,直接讀取、修改並生成具備物理關節與精確尺寸的 3D 資產(Sand3D 官方專案頁)。
為什麼需要 Sand3D?針對大型語言模型最佳化的三大設計
根據 Sand3D GitHub 專案文件說明,該函式庫建構於 Blender 的 bpy 模組之上,並針對大型語言模型的生成特性進行了結構性的精簡:
- 大幅降低 Token 消耗量:描述同一個 3D 零件時,Sand3D 所需的 Token 數量僅為 Blender Python、CadQuery 或 Onshape FeatureScript 的二分之一至六分之一(中位數統計顯示,Blender Python 撰寫同一零件需消耗 Sand3D 約 4.0 倍的 Token)。此外,整套 API 規格文件(
docs/api.md)僅約 3,600 個 Token,可直接完整放入模型的系統提示詞(System Prompt)中,專案內也內建llms.txt方便 AI 代理快速索引。 - 語意化命名取代手動座標計算:在傳統程式化建模中,定位孔洞或導角往往需要手動計算複雜的三維座標。在 Sand3D 中,所有的零件、邊線(edges)與表面(faces)皆透過語意化名稱直接呼叫,降低語言模型因空間算術錯誤而產生破圖的機率。
- 位元級確定性輸出(Deterministic):相同的 Sand3D 程式碼在相同環境下執行,每次都會生成位元級完全一致(bit-for-bit)的網格模型,確保自動化重建與工程驗證的穩定度。
核心架構與語法:扁平化動詞設計與關節組裝
Sand3D 不提供諸如 chair() 或 table() 這類寫死的物件類別函數,所有物件皆透過統一的 s3d.<verb> 扁平化介面,由基礎幾何與組裝動詞逐步建構而成。
| 動詞家族(Family) | 核心功能說明 | 代表性 API 動詞(Verbs) | 參考來源 |
|---|---|---|---|
| 輪廓(Profiles) | 定義 2D 截面與幾何路徑(共 16 個動詞) | rect、circle、slot、polygon、poly、arc、spline、superellipse、text、offset、stroke | Sand3D GitHub |
| 實體與路徑(Solids & Paths) | 將輪廓轉為 3D 實體或建立基礎幾何體(共 15 個動詞) | extrude、revolve、sweep、loft、wire、helix、box、cylinder、tube、sphere、torus、dome | Sand3D GitHub |
| 編輯操作(Edits) | 布林運算、鑽孔、挖槽與邊緣處理(共 15 個動詞) | cut、join、intersect、split、hole、pocket、fillet、chamfer、shell、dent | Sand3D GitHub |
| 座標系與配置(Frames & Placement) | 相對座標定位、陣列排列與吸附對齊 | Frame、face、edge、bbox、local、at、transform、grid、ring、along、snap | Sand3D GitHub |
| 關節與動態(Articulation) | 定義零件之間的運動軸向、類型與角度範圍 | joint、pose、seat | Sand3D GitHub |
| 組裝與匯出(Assembly) | 群組化部件、組合完整物件與多格式輸出(共 8 個動詞) | group、assembly、attach、export、units、fingerprint | Sand3D GitHub |
| 機構零件與材質(Parts & Materials) | 標準機械特徵生成與表面材質設定 | gear、knurl、thread、material | Sand3D GitHub |
參數化零件與可動組裝範例
以製作一個帶雙孔與頂部導角的固定支架為例,在 Sand3D 中預設以公釐(mm)為單位,僅需數行程式碼即可完成參數化定義並匯出:
import sand3d as s3d
def bracket(w=80, d=40, t=6, hole_d=6.6, pitch=50):
plate = s3d.extrude("plate", s3d.rect(w, d, r=4), t)
s3d.hole(plate, hole_d, on=s3d.grid(2, 1, pitch, 0))
s3d.fillet(plate, 1, edges="top")
return plate
s3d.export(bracket(), "bracket.glb")
針對包含多個可動部件的複雜產品(例如滾筒洗衣機),Sand3D 僅需 38 行程式碼就能定義機殼、滾筒、含玻璃與把手的機門、洗劑抽屜與旋鈕,並透過 s3d.joint 宣告門軸旋轉(range=(0, 143))、滾筒連續旋轉(kind="continuous")以及抽屜線性滑軌(kind="prismatic"):
door = s3d.group("door", ring, glass, handle) # 把手與玻璃隨門移動
s3d.joint("door_hinge", door, hinge, axis="-Z", range=(0, 143))
s3d.joint("drum_spin", drum, front.move(0, 400), kind="continuous")
s3d.joint("drawer_slide", drawer, top_band.move(150), kind="prismatic", axis="+X", range=(0, 200))
s3d.joint("dial_turn", dial, top_band.move(-150), kind="continuous")
return s3d.assembly("washing_machine", cab, drum, door, drawer, dial, front=front)
一鍵匯出支援遊戲引擎、機器人模擬與 3D 列印
完成建模後,呼叫 s3d.export() 即可依照檔案副檔名自動轉換為各種下游應用所需的標準格式(輸出時長度單位會自動轉為公尺):
| 匯出格式 | 包含內容與結構特性 | 主要適用場景與工具 | 參考來源 |
|---|---|---|---|
GLB(.glb) | 網格、材質,以及記錄於各節點 extras 欄位中的關節資訊(維持當前姿態) | 網頁 3D 檢視器、遊戲引擎 | Sand3D GitHub |
URDF(.urdf) | 每個可動部件對應一個 link、關節定義與運動極限(靜止姿態),並附帶對應的 OBJ 網格檔 | ROS、PyBullet、MuJoCo、NVIDIA Isaac 等機器人模擬器 | Sand3D GitHub |
USDA(.usda) | 完整保留 OpenUSD 結構樹(UsdGeom、UsdPhysics)與材質,可透過 usdcat / usdzip 轉為 .usd、.usdc、.usdz | NVIDIA Omniverse、Isaac Sim、OpenUSD 管線 | Sand3D GitHub |
OBJ / STL(.obj / .stl) | 單純輸出當前姿態的網格模型(OBJ 為 Y 軸向上,二進位 STL 為 Z 軸向上) | 通用 3D 建模軟體、3D 列印切片軟體(Slicers) | Sand3D GitHub |
Hugging Face 上的 10 萬件 3D-as-Code 開放資料集
除了建模語言本身,Sandflow 也在 Hugging Face 的 Sand3D Collection 釋出了五大子資料集,並提供互動式網頁應用 Sand3D Explorer 讓開發者直接以視覺或關鍵字搜尋物件、檢視 3D 模型並複製對應的 Python 程式碼。
根據 Sand3D Explorer 與 FabScene 報導統計,整套資料集共涵蓋 103,797 個完整 3D 物件與 2,297 個獨立機械零件(合計達 106,094 筆資料列),其中超過 10,456 個物件具備可動關節(累計約 36,000 個經過逐一比對驗證的關節),且有 101,690 個物件可直接在瀏覽器中以 3D 檢視:
| 資料集名稱 | 收錄數量 | 可動關節物件數 | 類別數(Families) | 資料來源與內容特色 | 連結與來源 |
|---|---|---|---|---|---|
| sand3d-objaverse | 66,887 件 | 14 件 | 29 類 | 重建自 Objaverse 的日常用品、家具、建築元素、樂器與運動器材 | sand3d-objaverse 資料集 |
| sand3d-cad | 24,495 件 | 0 件 | 200 類 | 重建自 Zero-To-CAD 與 CADFS 的機械 CAD 零件,所有尺寸皆為可調參數 | Sand3D Collection |
| sand3d-articraft | 9,209 件 | 9,139 件 | 238 類 | 重建自 Articraft 的可動日常與工業設備(如攪拌機、升降桌、機械手臂),完整宣告關節 | Sand3D Explorer |
| sand3d-simready | 2,334 件 | 434 件 | 32 類 | 改寫自 NVIDIA 與 Hugging Face 合作的 SimReady 模擬資產,與物理模擬環境高度互補 | Sand3D Explorer |
| sand3d-automate | 3,169 筆(872 組裝體 + 2,297 零件) | 869 件(共 2,121 個關節) | 機械組裝類 | 重建自 AutoMate 資料集的精密機械組裝體,每個零件皆為獨立函數並宣告運動關節 | sand3d-automate 資料集 |
代理式重建管線與品質把關(f_score)
根據 sand3d-automate 資料集說明卡,這些程式碼是由 Sandflow 開發的「迭代式代理重建管線(iterative agentic reconstruction pipeline)」自動轉譯而成。AI 代理會針對原始 3D 資產撰寫 sand3d 程式、實際執行算繪,並比對生成網格與原始模型的幾何差異,反覆修正直到成功重建。
為了確保訓練資料品質,每一筆資料都經過全新程序的獨立執行測試,並記錄在邊界框對角線 1% 距離內的表面重合度指標 f_score(sand3d-automate 資料集說明卡):
- 日常與靜態模擬物件(Objaverse 與靜態 SimReady):保留
f_score達 0.70 以上的項目。 - 精密機械與剛體物件(CAD 與 Articraft 剛體):保留
f_score達 0.90 以上的項目。 - 可動關節物件(Articulated Objects):要求每個關節運動方向與軸向完全正確,且個別活動部件的
f_score皆須達 0.90 以上。
每一筆 Parquet 資料列皆完整包含物件 ID、Python 程式碼(program)、入口函數(entry)、512×512 算繪預覽圖(render)、OpenUSD 檔案路徑(usda_path)、關節數(n_joints)、f_score、訓練/驗證集切分標記(split)以及雙層授權溯源資訊(license 與 source_license)(sand3d-objaverse 資料集)。
安裝方式與快速上手
Sand3D 支援 Python 3.13(推薦,自動搭配 bpy 5.2 LTS)與 Python 3.11(搭配 bpy 4.5 LTS,適用於 Intel Mac 等環境),可透過 pip 或 uv 直接安裝:
pip install sand3d
# 或在 uv 專案中執行:
uv add sand3d
若要從 Hugging Face 載入資料集並在本地端重新建構 OpenUSD 或 GLB 檔案,可搭配 datasets 與 huggingface_hub 執行(sand3d-automate 資料集):
from datasets import load_dataset
import bpy
import sand3d as s3d
ds = load_dataset("Sandflow/sand3d-automate", split="train")
row = ds[0]
bpy.ops.wm.read_factory_settings(use_empty=True)
ns = {}
exec(row["program"], ns)
obj = ns[row["entry"]]() if row["entry"] else None
s3d.export(obj, "object.usda") # 亦可改為 .glb 或 .urdf
常見問題(FAQ)
Sand3D 函式庫與資料集可以免費商用嗎?
可以。Sand3D Python 函式庫採用 Apache 2.0 授權條款開源,而 Hugging Face 上的 Sand3D 系列資料集則以 CC BY 4.0 授權釋出(底層原始物件皆源自 CC BY 4.0、Apache 2.0 或 CC0 授權,不含非商業限制條款)。使用資料集時,僅需依據各資料列中的 attribution 欄位保留原始作者與修改標註即可用於商業與研究用途(sand3d-automate 資料集)。
如何讓現有的大型語言模型學會撰寫 Sand3D 程式碼?
開發者只需將 GitHub 儲存庫中的 docs/api.md 放入大型語言模型的系統提示詞(System Prompt)中。該文件僅約 3,600 個 Token,已完整涵蓋所有語法規則、函數簽章與實作範例,模型也可透過儲存庫根目錄的 llms.txt 自動讀取相關規範(Sand3D GitHub)。
Sandflow 接下來的發展規劃為何?
Sandflow 執行長 Félix Balmonet 表示,公開 Sand3D 與 10 萬件程式碼化 3D 資料集是為了幫生成式 3D 建立共通的程式碼基礎建設,團隊預計於 2026 年 12 月中旬推出首款原生 3D 基礎模型(3D Foundation Model)(FabScene 報導)。
相關連結彙整
- GitHub 專案儲存庫:Sandflow-ai/sand3d
- Hugging Face 資料集總集:Sand3D - a Sandflow Collection
- 互動式 3D 程式碼探索器:Sand3D Explorer (Hugging Face Space)
- 官方專案主頁:Sand3D Official Website (sandflow.ai)
- 子資料集連結:
- 外部新聞報導:FabScene:フランスの新興企業、プログラムで書いた3Dモデル10万点を公開