teardown:一個 Claude Code skill,把機器變成可拆的 3D 模擬器

teardown 是一個 Claude Code skill:你問「四行程引擎怎麼運作」,它直接生成一頁離線 HTML——機器在中間運轉、四周面板讀著同一組真實數字、按鈕打開正在工作的零件、沒人碰它時自己導覽,還能逐格錄成 60fps 影片配 -14 LUFS 的程序化配樂。本文拆解它的 73 個檔案、三個範例(V8/Cessna 起落架/Strandbeest)、七條讓模型「像真的」的規則、看圖不看影片的 review loop,以及五個已經踩過的 three.js 坑。

  • Dennis
  • 7 分鐘閱讀
teardown:一個 Claude Code skill,把機器變成可拆的 3D 模擬器

一句話結論

teardown 把「問一個機器怎麼運作」變成「拿到一頁可以拆的 3D 模擬器」。 你在 Claude Code 裡說「做一台可以拆的四行程機車引擎」,它產出的是一個完全離線的單檔 HTML:機器在中間運轉,四周面板讀著同一組真實數字,按鈕會打開「正在工作的那個零件」,沒人碰它的時候頁面自己導覽,最後還能逐格錄成 60fps 影片、配一段跟著同一條時間軸的程序化配樂。

但這個專案真正值錢的不是 demo,而是它寫在 SKILL.md 裡的規則:必須從參考圖開始、所有儀表讀同一組數字、單一輸入驅動全部動作、以及「你無法看影片,只能看圖」的審查流程。這些規則任何做 AI 生成 3D 內容的人都用得上。

專案:elvarofficial/teardown

它是什麼

項目內容
定位Claude Code skill(不是獨立 App,靠 Claude Code 讀 SKILL.md 執行)
星數/分支★1,186/181 forks/5 open issues(2026-11-01 查詢)
授權/語言MIT/JavaScript
建立時間2026-10-30,最後推送 2026-10-31(非常新)
檔案數73 個(sims/ 40、sfx/ 20、根目錄 10、docs/ 3)
安裝npx skills add elvarofficial/teardown -g -a claude-code
環境需求Node 20+;影片要 ffmpeg、配樂要 Python 3(只用標準庫);另需 npx playwright install chromium
產出單檔 HTML 約 800 KB(three.js 與字型全部內嵌)+ 60fps mp4 + −14 LUFS 配樂

用法就是講白話:

「做一台可以拆的四行程機車引擎給我。」 「機械錶是怎麼計時的?做成模擬器給我看。」 「做一台液壓挖土機臂的拆解,順便錄 20 秒影片。」

三個內建範例:具體到可以驗算

repo 直接附了三台完整機器,而且每一台都寫明「靠什麼驅動」與「可以偷什麼」:

範例機器靠什麼驅動值得學的地方
v8-*十字曲軸 V8,汽缸有玻璃內襯曲軸角度;點火順序 1-8-4-3-6-5-7-2,另有缸內壓力模型畫出示功圖三種剖切模式(玻璃/剖面/實體)、把點火順序做成立缸選擇器、與曲軸同步的即時圖表
cessna-*Cessna 337 主起落架收放行程 0..1:201 mm 齒條帶動 32 齒、模數 4 mm 的小齒輪,剛好轉 180°用「一個自由度」擺出整套機構、飛行階段寫成時間的函數、模型底下有一條會滾動的跑道
strandbeest-*Theo Jansen 的 Strandbeest,20 隻腳共用一根曲軸風:曲軸轉速由風積分而來,每個關節用 Jansen 的 11 段連桿長度做圓交集求解67 行寫完的精確連桿求解器、實例化管件、腳尖軌跡、20 隻腳的接觸時序圖

這三個範例就是「教學素材該長什麼樣」的示範:不是動畫,而是每個數字都能對得起來的機構。

一台機器怎麼被拆成 7 個檔案

專案規定每台機器一個資料夾,並按「工作性質」切檔(三個範例完全遵守):

檔案負責什麼
kin.js/gear.js/jansen.js數學。真實單位、真實尺寸,一個輸入(曲軸角/行程/風)推導出所有姿態與讀數。這裡不准出現 three.js
engine.js/beast.js幾何。用程式建出車削件、管件、實例化連桿;update(input) 負責擺姿態
stage.js攝影棚。燈光、陰影、後處理(GTAO、bloom);frame(state, cam) 畫一格
console.js面板。固定 1600×900 的 CSS 版面:儀表、圖表、開關、帶引線的標註
film.js影片腳本。SCRIPT 記錄導演的運鏡(視角、隔離、剖切、油門),render(t) 是時間的純函數
live.js互動。按鈕、滑桿、環繞、縮放;沒人操作時播放 film.js 當自動導覽,任何點擊/拖曳/滾輪就交還控制權,安靜 25 秒後再收回
score.py配樂。讀同一份時間軸生成聲音

「數學不准碰 three.js」這條界線是關鍵:機構算對了,畫面才可能對;反過來永遠不會成功。

七條規則,決定它像不像真的

SKILL.md 的「Rules that decide whether it works」,每一條都是踩過的結果:

#規則為什麼
1從參考開始,不要憑想像一張照片、手冊剖視圖、真實影片。憑一句話發明的機器每次都會做得「很通用」
2真實數字、單一來源所有儀表、圖表、標籤都讀同一個擺姿態的函數,畫面上不可能與動作矛盾。還要手算一項抽查:Cessna 那個 32 齒 × 4 mm 模數=128 mm 節圓直徑,圓周一半正好是 201 mm 行程
3一個輸入驅動全部全部由曲軸角/行程/風推導,不手工 keyframe → 影片、互動頁、配樂永遠不會走鐘
4正在工作的零件要打開隔離、剖切、X 光。「能鑽進去的鏡頭」勝過十次環繞
5淺色攝影棚、單一強調色淺底在社群動態牆上才看得清;強調色只標「現在正在變的東西」
6鏡頭要為機構而選平面連桿正面看會塌成一張網,3/4 側面才看得懂每隻腳
7碰撞用數字修,不要用鏡頭藏零件穿模就在參數裡縮放或位移,不要靠運鏡遮掉

第 2 條那個「手算一項」的習慣,是這個專案最專業的地方——AI 生成的模型最怕「看起來對」,所以它要求至少一個數字能用紙筆驗證。

Review loop:你看不到影片,只能看圖

這是全文最值得帶走的一段工程方法。SKILL.md 直接寫:「You cannot watch the video; you can look at frames.」 在宣告完成前,一定要讀過當次渲染的檢查表:

步驟做什麼
1--stills beats:每個時間軸節拍後 0.3 秒出一張圖,標上 t=
2拿這份 checklist 逐格讀
3放大:轉場用 --stills every:0.2 --from A --to B,單格用 --still T
4修、重建、回到步驟 1;直到整整一輪都挑不出問題才停
5最後再跑 sheet.mjs 讀一遍最終 mp4 的接觸表——那才是編碼器真正寫進去的東西

Checklist 有五大類:機構(每一處該接觸的都接觸、沒有東西互穿、面板數字與姿態一致)、構圖(每格一個焦點、重要元素離邊 60 px、標籤不遮住它標的零件)、字(不裁切、關鍵讀數在手機寬度可讀)、3D(bloom 會吃掉細節、近白表面會爆、粗糙度 ≥0.45)、時間(每種狀態停留夠讀:短句 1 秒+超過三個字每字加 0.25 秒)。

三個現實限制:效能、體積、顯卡

限制內容解法
不能在桌機顯卡上測就好桌機 60fps 的頁面,在筆電內顯上可能掉到 15fps內建品質分級(關 AO、降 pixel ratio、縮 shadow map、面板隔格重繪);先找最貴的 shader——一個在每個頂點算 5 次的位移,比所有分級加起來還貴
首帧不能卡著色器編譯會讓頁面凍住kit/warm.js 在第一帧前平行編譯所有 program
頁面必須壓在 1 MB 內X/Slack 這類連結預覽會讀 HTML,15 MB 的頁面它們直接放棄大的模型另外放檔案:build.json 裡指定 heavy.glb → light.glb

五個已經踩過的 three.js 坑

這段是硬貨,任何做 three.js 的人都會遇到:

坑現象修法
smoothstep(a, b, x) 且 a > bWindows(ANGLE/D3D)回傳 0改寫成 1.0 - smoothstep(b, a, x)
貼地的 ShadowMaterial/貼花在後處理 render target 裡過不了深度測試給 polygonOffset
用鏡射貼圖鋪在地面的 quad被當成背面剔除用 DoubleSide
一個 NaN 像素透過 bloom 整個畫面變黑shader 裡每個 pow() 的底數都要 clamp
GTAO +剖切模型切掉那一半變成淡影鬼影gtao.normalMaterial 要套同一組 clipping plane

聲音:不是配音,是「在對的時間響」

sfx/ 用純 Python 合成所有音效(48 kHz、可重現),而且直接讀影片的時間軸——所以聲音不可能跑掉。母帶自動處理到 −14 LUFS、真峰值 ≤ −2 dBFS。設計原則是「強調、不旁白」:連續運轉的地方保持安靜,畫面有轉折才給一個音。

「品味,有數字」

另一個少見的地方:它把主觀審美寫成可檢查的數字。

  • 進場緩動 cubic-bezier(0.16, 1, 0.3, 1);退場 cubic-bezier(0.6, 0, 0.9, 0.35)、長度是進場的一半;狀態間切換 cubic-bezier(0.65, 0, 0.35, 1);線性只用在連續運動
  • 機器要佔畫面的 60–70%;1080 畫布上標籤不小於 34 px
  • 強調色只有一個,而且它代表「現在正在工作的零件」
  • 沒有東西完全靜止:至少留一個元素在動

五個該保留懷疑的地方

疑點說明
誕生才兩天建立 2026-10-30、最後推送 10-31;星數衝很快,但沒有任何長期驗證
未實跑本文未安裝、未生成任何機器,所有描述取自 repo 檔案與 SKILL.md 原文
產出品質高度依賴參考圖規則第 1 條自己就說了:憑一句話發明的機器「每次都很通用」。想要好結果,你得先找照片或剖視圖
它不自己會動這是 Claude Code 的 skill,不是一鍵工具;要 Claude Code、要 Node 20+、要 playwright、影片還要 ffmpeg
上游是另一個專案runtime、逐格擷取、音效引擎與審查規則來自 whaleyxbt/claude-motion(★791、MIT),teardown 是在它上面長出來的

誰適合、誰先不用碰

適合

  • 做技術教學/產品說明的人:需要「一頁就能講清楚一台機器」的素材
  • three.js 開發者:那 7 條規則、5 個坑、review loop 可以直接搬進自己的專案
  • 已經在用 Claude Code 的人:這是把 skill 從「改程式」推到「生成互動教材」的例子

先不用碰

  • 只想要現成動畫素材的人:它產出的是模擬器,不是影片素材庫
  • 沒有 Node 環境或不熟 Claude Code 的人:安裝鏈有三段(skill、npm、playwright)

站內延伸閱讀

本文為獨立評測與整理,不含聯盟連結、未受任何廠商贊助。專案數據取自 GitHub 公開資料與 repo 內檔案(2026-11-01 查證);本文未安裝或執行該 skill。

📬 訂閱 most.tw 電子報

每週精選 AI 工具教學與技術乾貨,直接送到你的信箱。免費、隨時可退訂。

訂閱即表示同意收到 most.tw 電子報,隨時可一鍵退訂。

💬 有問題想討論?加 LINE 聯絡我

歡迎透過 LINE 官方帳號直接留言,我會盡快回覆你的問題。

加入 LINE 好友