跳至主要內容

工具與應用

Sandflow 開源 Sand3D:專為 LLM 打造的 Python 3D 建模語言與 10 萬件程式碼化 3D 資料集

法國新創 Sandflow 開源 Sand3D 建模語言與 10 萬件 3D-as-Code 資料集,將 3D 物件轉為簡潔易讀的 Python 程式碼,解決大語言模型生成 3D 資產與機器人模擬的關鍵瓶頸。

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、strokeSand3D GitHub
實體與路徑(Solids & Paths)將輪廓轉為 3D 實體或建立基礎幾何體(共 15 個動詞)extrude、revolve、sweep、loft、wire、helix、box、cylinder、tube、sphere、torus、domeSand3D GitHub
編輯操作(Edits)布林運算、鑽孔、挖槽與邊緣處理(共 15 個動詞)cut、join、intersect、split、hole、pocket、fillet、chamfer、shell、dentSand3D GitHub
座標系與配置(Frames & Placement)相對座標定位、陣列排列與吸附對齊Frame、face、edge、bbox、local、at、transform、grid、ring、along、snapSand3D GitHub
關節與動態(Articulation)定義零件之間的運動軸向、類型與角度範圍joint、pose、seatSand3D GitHub
組裝與匯出(Assembly)群組化部件、組合完整物件與多格式輸出(共 8 個動詞)group、assembly、attach、export、units、fingerprintSand3D GitHub
機構零件與材質(Parts & Materials)標準機械特徵生成與表面材質設定gear、knurl、thread、materialSand3D 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、.usdzNVIDIA 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-objaverse66,887 件14 件29 類重建自 Objaverse 的日常用品、家具、建築元素、樂器與運動器材sand3d-objaverse 資料集
sand3d-cad24,495 件0 件200 類重建自 Zero-To-CAD 與 CADFS 的機械 CAD 零件,所有尺寸皆為可調參數Sand3D Collection
sand3d-articraft9,209 件9,139 件238 類重建自 Articraft 的可動日常與工業設備(如攪拌機、升降桌、機械手臂),完整宣告關節Sand3D Explorer
sand3d-simready2,334 件434 件32 類改寫自 NVIDIA 與 Hugging Face 合作的 SimReady 模擬資產,與物理模擬環境高度互補Sand3D Explorer
sand3d-automate3,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 報導)。

相關連結彙整

謝謝你,讀到這裡。

保持好奇,明天繼續探索。

© 2026 Communeify. All rights reserved.