← 文章

分享自製換裝娃娃:從一張設計圖到 3D

· 14 分鐘閱讀 · 124 次閱讀
3D VRM Tripo Blender three.js ElevenLabs Mixamo ChatGPT
AI 3D 換裝娃娃

分享自製換裝娃娃

從一張設計圖到 3D

跟 Opus 5.5 協作測出來的工作流:用 ChatGPT、Tripo、Blender 和 three.js,把一張設計圖做成能在瀏覽器裡換裝、跳舞、說四種語言的 3D 換裝娃娃。每一步附做法、驗收標準和原因。

開場

一張設計圖,十個步驟

陽菜 Hina|四種造型・中日英韓對嘴(voice: elevenlabs.io) · 在 YouTube 開啟 ↗

影片裡是陽菜 Hina,四種造型各講一種語言:OL 套裝配生氣講中文,偶像服配害羞講日文,短髮講韓文,原本的造型講英文。她是一個 3D 換裝娃娃,存成 VRM(3D 角色常用的檔案格式),從一張 ChatGPT 畫的設計圖開始,2026-09-29 開工,10-05 做完公開版;中間 Claude Code 的額度用完,停了幾天。

ChatGPT 畫的概念圖
ChatGPT 畫的概念圖
起點:ChatGPT 畫的設計圖,正面、兩側和背面
起點:ChatGPT 畫的設計圖,正面、兩側和背面

整個專案我都是跟 Opus 5.5 對話完成的。這篇把測出來的做法整理成十個步驟,每一步分三格:

  • 做法:照著做的步驟
  • 驗收:可以量的標準
  • 為什麼:測試時遇到什麼,才定成這樣

用到的工具:ChatGPT(設計圖、四視圖)、Tripo(3D 生成、自動綁骨)、Blender(組裝和修正)、three.js 和 three-vrm(網頁算繪)、ElevenLabs(聲音)、wav2vec2(對嘴)、Mixamo(動作)。

分工

我看圖拍板,Opus 5.5 動手

分工第一天就定好,之後沒改過:

  • 我:決定設計方向;每一步結束看圖,決定過不過;每次花 Tripo 點數前核可;帳號登入和付款
  • Opus 5.5:寫 Blender、量測和網頁的程式,在背景跑 Blender;操作 ChatGPT 和 Tripo 的網頁;每一步產出比對圖給我看

看圖有兩條規則:

  • 驗收圖至少 1024 px,臉另外裁一張放大圖
  • 臉要看正面、左右 30°、正側面四個角度
第一輪:左邊是輸入的設計圖,右邊是 Tripo 直接生成的臉
第一輪:左邊是輸入的設計圖,右邊是 Tripo 直接生成的臉

為什麼

第一輪我想用一張設計圖直接生成整隻模型,這太異想天開了:生出來的模型面數不夠,細節也不足。所以後來改成頭、頭髮、身體分開生成,最後再合併。

步驟 1

先定品質基準

做法

開工前,把 three-vrm 官方的範例模型放進同一個預覽網頁截圖,先講好「要做到這個程度」。

品質基準:左邊是 three-vrm 官方範例模型,右邊是第一輪做出來的陽菜
品質基準:左邊是 three-vrm 官方範例模型,右邊是第一輪做出來的陽菜

為什麼

第一輪沒有基準,做完放上網頁才發現差很遠。參考的兩位創作者也都說成品還粗糙,其中一位的原話是「經不起鏡頭拉近」。期待要在開工前講清楚。

步驟 2

畫三組四視圖

做法

  • 請 ChatGPT 畫三組四視圖(正面、左、右、背面):
  • 頭:光頭,露出耳朵;眼睛睜大,看得到整個虹膜;嘴巴張成「啊」,看得到上排門牙和舌頭;脖子在鎖骨上方切平
  • 頭髮:只有頭髮和髮飾,裡面是空的
  • 身體:T 字站姿;脖子切在跟頭同一個高度
  • 每張都附上設計稿同角度的視圖,請它「編輯附圖」
  • 每一張開一個新對話
  • 身體的側面圖寫明「手臂正對鏡頭」
ChatGPT 改出來的三組四視圖,橫線用來檢查四張圖的高度一致
ChatGPT 改出來的三組四視圖,橫線用來檢查四張圖的高度一致
頭部四視圖半透明疊在設計稿上,對照輪廓
頭部四視圖半透明疊在設計稿上,對照輪廓
身體四視圖半透明疊在設計稿上
身體四視圖半透明疊在設計稿上

驗收

  • 頭頂、下巴、肩膀、腳底在四張圖裡的高度差,小於圖高的 2%
  • 左側面圖裡,角色的臉朝畫面左邊
  • 四張圖的飾品數量一樣

為什麼

  • 頭部張嘴生成,牙齒、舌頭和口腔才會是立體網格。閉嘴可以往回做,閉嘴的頭做不出口腔
  • 只靠文字描述畫的頭髮四視圖,髮型跟設計稿差很多
  • 在同一個對話裡接著生側面,會變成 3/4 視角;身體側面沒寫明,手臂會往背後伸
  • 設計稿本身也會矛盾:側面的鼻尖在眼睛到下巴的 44%,正面在 27%。以正面為準
步驟 3

Tripo 生成,貼圖最後上

做法

  • 用 Smart Mesh P2.0 多視圖,一件一件送:頭 → 身體 → 頭髮。每件 100 點
  • 每次送出前重設四項:模型 P2.0、上傳框第 2 個圖示(多視圖)、面數 25,000、隱私 Private
  • 先只生網格。組裝、修比例都做完,最後才上貼圖(每件 20 點),再照頂點位置把 UV 搬回修過的網格
Tripo 生成的三個部件,還沒上貼圖
Tripo 生成的三個部件,還沒上貼圖

驗收

下載後數面數,每件約 25,000 個四邊形面。只有 5,000 就是設定被重設了。

為什麼

  • 頁面每次載入都回到預設,面數預設是 5,000
  • 上傳框第 3 個圖示是批次模式,四張圖各生一個模型,扣 300 點
  • 頭最難,先生頭,不滿意只重抽頭
  • 實測上貼圖不改網格:頭的 52,220 個面全部找得回來,頂點位置不變,只是沿 UV 接縫拆開。所以網格可以放心先改
  • Left 格要放角色自己的左側面。第一輪放反,頭的側臉長到後腦勺,360 點作廢
步驟 4

照設計稿的高度組裝

做法

  • 在設計稿上量出髮頂、眼睛、下巴、頸根的像素高度
  • 用裙襬和鞋底換算成公尺(這次是每像素 0.785 mm),照高度擺三個部件
  • 逐列比對模型和設計稿的輪廓寬度,列出差距表
  • 一次修一個部位,修完重跑整張表,再修下一個
  • 正面和背面對不上時,取兩邊平均
四視圖稽核:把模型各部件的輪廓線疊在設計稿上,逐列比對寬度
四視圖稽核:把模型各部件的輪廓線疊在設計稿上,逐列比對寬度
模型半透明疊在設計稿上,橫線是比對高度用的參考線
模型半透明疊在設計稿上,橫線是比對高度用的參考線

驗收

每修一處就重跑比對表,給我看修前修後的對照圖。

為什麼

  • 照脖子寬度縮放,頭大了 1.4 倍。生成的脖子比身體那段細
  • 第一張比對表列出十幾項差距,其中兩項是量錯了:下巴「窄 22%」是用眼睛讀的數字,逐欄重量後是 70 對 69 px;腳踝「細 16%」量到的是鞋口,模型那一列還是襪子。差距大得不合理,先檢查量的位置
  • 設計稿的前後視圖會打架:同一條裙子,正面比背面寬 10%
步驟 5

接縫一層一層修

做法

頭和身體接在脖子上,照下面的順序檢查和修正。

順序 層 檢查 修法 這次的結果
1 幾何 沿邊取樣量縫隙 身體的切口補上頭那圈的每個頂點 0.19 mm → 0
2 法線(受光方向) 接縫兩側的法線夾角 接縫用兩邊的平均法線 22.2° → 0.01°
3 貼圖 切口兩側的 RGB 差 身體貼圖裡接近膚色的像素,每個通道乘上增益 (13, 9, 11) → (1, 1, 2)
4 權重(跟哪根骨頭動) 七種姿勢下的最大裂縫 頭的邊貼到身體的邊,權重照身體內插,往上 15 mm 混回原本的 3.27 mm → 0.001 mm
5 描邊 目視 接縫 1 cm 內不畫描邊 黑線消失
脖子接縫修正前後:正視、抬頭,以及轉 30° 的兩個角度
脖子接縫修正前後:正視、抬頭,以及轉 30° 的兩個角度
灰模上的接縫明暗線:上排修正前,下排定版
灰模上的接縫明暗線:上排修正前,下排定版
低頭時下巴底下的摺痕:1 只修接縫、2 加上權重平滑、3 再統一法線
低頭時下巴底下的摺痕:1 只修接縫、2 加上權重平滑、3 再統一法線

為什麼

頭和身體分開生成,接縫在每一層都出過一次問題,前一層修好,下一層才看得出來。權重修了兩輪:第一輪處理抬頭時裂開,第二輪處理低頭時下巴底下的摺痕。

步驟 6

綁骨和彈簧骨

做法

  1. 整隻減面到 4.5 萬面,上傳 Tripo Auto Rig(VRM 1.0 人形骨架,20 點)
  2. 下載後試 4 個 90° 方向,用 ICP 對回原位
  3. 用最近面內插,把權重抄回完整的網格
  4. 頭髮的權重全部設成只跟頭骨
  5. 加彈簧骨:頭髮繞頭每 20° 一條鏈(13 條、每條 5 節),裙子繞臀骨每 30° 一條(12 條、每條 3 節)
  6. 裙子左右兩半照高度分一部分權重給同側大腿,裙襬最多一半
  7. 量一份軀幹輪廓(每 2 cm 一層、每層 36 個方位)。網頁播動作時,手進入輪廓就把上臂往外轉,每次 4°,最多 48°
Auto Rig 綁好後的姿勢檢查:手臂放下 45°、手肘彎 90°
Auto Rig 綁好後的姿勢檢查:手臂放下 45°、手肘彎 90°
頭髮加上彈簧骨:上排 T 字、下排手臂放下,右邊四格是擺動中的背面
頭髮加上彈簧骨:上排 T 字、下排手臂放下,右邊四格是擺動中的背面
裙子分權重給大腿、手推出軀幹:上排修正前,下排修正後
裙子分權重給大腿、手推出軀幹:上排修正前,下排修正後
裙子的彈簧骨:靜止、抬腿 30°、抬腿 57° 和擺動中的樣子
裙子的彈簧骨:靜止、抬腿 30°、抬腿 57° 和擺動中的樣子
套用 Mixamo 動作的一覽
套用 Mixamo 動作的一覽

驗收

  • 0 個頂點沒有權重,對位殘差約 1 mm
  • 六個姿勢(手臂放下 45°、手肘 90°、膝蓋 60°、轉腰 20°、轉頭 30°、點頭 15°)的特寫,關節和脖子沒破
  • 36 個測試姿勢裡,陷進軀幹的手部頂點從 976 個降到 59 個

為什麼

  • 整隻 15.7 萬面送 Auto Rig,會跳出「Polygon Limit Exceeded」
  • Tripo 會把上傳的模型轉向,再縮成 1 m 高
  • 用 Tripo 給的頭髮權重,手臂一放下瀏海就被扯皺
  • 裙子試過 20° × 4 節:裙子內襯太貼大腿,碰撞體被縮到 5 mm,大腿直接穿出
  • Mixamo 的動作是用別的體型做的,手會插進胸口和腰
步驟 7

表情從張嘴往回做

做法

  • 閉嘴、閉眼都從張嘴睜眼的模型往回推,做成 shape key(記錄頂點位移的變形)
  • 另外生成一顆閉眼閉嘴的參考頭(100 點),對齊後讓眼皮和嘴唇取它表面的深度,往周圍漸弱
  • 眼皮的滑動用調和場求解,固定眼皮硬的那段、下眼瞼和外圈
  • 嘴唇之間的牙齒貼圖,用口紅蓋掉:沿兩唇之間的凹痕烤進臉部貼圖,唇線上方 2.2 mm 內比唇色淺的像素先蓋成唇色
  • 口紅只換色相,保留原本唇色的明暗
另外生成的閉眼閉嘴參考頭(100 點),借它眼皮和嘴唇的深度
另外生成的閉眼閉嘴參考頭(100 點),借它眼皮和嘴唇的深度
閉眼的前兩版:上排眼窩有 U 形凹痕,下排撫平後像腫起來
閉眼的前兩版:上排眼窩有 U 形凹痕,下排撫平後像腫起來
從側面才看得到的上唇凸出
從側面才看得到的上唇凸出
烤進貼圖的口紅,蓋掉兩唇之間的牙齒白邊
烤進貼圖的口紅,蓋掉兩唇之間的牙齒白邊
表情一覽:閉嘴、半閉眼、閉眼、張嘴一半、張嘴到底,上排正面、下排轉 30°
表情一覽:閉嘴、半閉眼、閉眼、張嘴一半、張嘴到底,上排正面、下排轉 30°
張嘴 0、0.25、0.5、0.75、1:牙齒和舌頭都不穿出嘴唇
張嘴 0、0.25、0.5、0.75、1:牙齒和舌頭都不穿出嘴唇
口紅只蓋閉嘴時的白邊,張嘴時牙齒照樣是白的
口紅只蓋閉嘴時的白邊,張嘴時牙齒照樣是白的

驗收

  • 閉嘴:從五個角度看嘴巴裡面,可見像素是 0(對照組:全開時正面 10,854 px)
  • 張嘴:開到 25%、50%、75%、100%,牙齒和舌頭都不穿出嘴唇
  • 閉眼:從正面和左右 30° 數露出的眼球縫(這次定版右眼 0 條,左眼 1–3 條)
  • 每個表情都從側面看一次

為什麼

  • 這顆頭的眼球比周圍皮膚深 6 mm。眼皮照原本的深度往下滑,眼窩出現 U 形凹痕;撫平之後又像腫起來
  • 上唇直接合起來,會往前凸 6.4 mm,從正面看不出來。借參考頭之後降到 3.8 mm,參考頭本身是 4.0 mm
  • Tripo 把上排牙齒畫在張嘴的貼圖上,閉嘴後剛好落在上唇下緣,正面看是一條白邊。烤上口紅後,唇線上的白色像素從 577 個降到 0
步驟 8

換裝和表情

做法

  • 衣服:請 ChatGPT 把四視圖改成新衣服 → Tripo 生成 T 字站姿的無頭身體 → 用 ICP 對齊陽菜,每輪排除誤差最大的 30% → 每個頂點抄陽菜身體最近點的權重,不含裙子,保留影響最大的四根骨頭 → 脖子切口接到頭上
  • 髮型:Tripo 生成「頭加頭髮」,把陽菜的頭疊到那顆頭上算出對位,頭髮跟著搬過來,綁到頭骨
  • 生氣、害羞:眉毛從貼圖摳出來做成貼片,原位補上膚色;害羞另外加臉紅
目前的髮型和服裝,可以任意搭配
目前的髮型和服裝,可以任意搭配
表情:最上排是 ChatGPT 畫的目標參考,下面兩排是網頁上的實際結果(正面、轉 30°)
表情:最上排是 ChatGPT 畫的目標參考,下面兩排是網頁上的實際結果(正面、轉 30°)
ChatGPT 改畫的換裝視圖:偶像服、OL 套裝
ChatGPT 改畫的換裝視圖:偶像服、OL 套裝
Tripo 生成的無頭衣服身體,之後對齊到陽菜身上
Tripo 生成的無頭衣服身體,之後對齊到陽菜身上

驗收

每一件都在網頁上實際穿過,每個表情都在網頁上切過一次。

為什麼

  • 一具身體綁好之後,衣服抄它的權重,換幾件都不用重新綁骨
  • 眉毛畫在皮膚上時,皮膚一動 2–4 mm,眉尾附近就有 22–47 個三角形翻面
  • 紫色捲髮做好了沒放上去:頭髮太稀,看起來像禿頭

目前有高馬尾、公主頭、短髮三種髮型,偶像服、OL 套裝兩套衣服。

步驟 9

聲音和對嘴

做法

  1. ElevenLabs 的 Voice Design 用文字描述聲線,生成陽菜的聲音;Eleven v4 念出中、日、英、韓台詞(免費方案)
  2. wav2vec2(XLSR-53,輸出國際音標的版本)每 20 ms 辨識一個音
  3. 音標歸成 a、i、u、e、o 五種嘴形。i、u 開頭的滑音(像「月」「亮」),嘴形用後面那個母音;b、p、m、f、v 短暫閉嘴
  4. 開口大小看音量,分閉、半開、全開三段,每秒 30 格
  5. 模型只有一個張嘴形狀。i、e、o、u 在網頁上從它推出來:開口縮小,嘴角往外拉成 i、e,往內收、往前噘成 o、u
  6. 字幕用 ElevenLabs 回傳的逐字時間,每種語言各校正一個位移
四種語言的對嘴影片截圖,字幕是原文加繁體中文
四種語言的對嘴影片截圖,字幕是原文加繁體中文

驗收

字幕時間要跟聲音對上。把「這個字正在念」和「聲音夠大」兩條時間線錯開比對,取重疊最多的位移。這次的結果是中文提前 0.24 秒、韓文 0.15 秒、日文 0.12 秒、英文 0.04 秒。

為什麼

對嘴只看聲音,四種語言共用同一套程式。ElevenLabs 回傳的時間比實際聲音晚,晚多少要看語言。

步驟 10

放上網頁

做法

匯出 VRM,用 three.js 和 three-vrm 在網頁上即時算繪。Mixamo 的動作先在本機轉到陽菜的骨架上。成品在文章最下面,可以直接玩。

公開版另外做了三層保護:

  • 貼圖降到 256 px,原版留在自己的電腦裡
  • 模型和動作加密傳送
  • 貼圖裡藏了看不見的浮水印

網頁上能轉的模型,檔案終究會到讀者的電腦,這三層只能提高門檻。

上排是原版貼圖,下排是公開版的 256 px 貼圖
上排是原版貼圖,下排是公開版的 256 px 貼圖

驗收

授權一項一項查過。

  • Mixamo:可以商用,不能散布原始動作檔。公開版只放轉換過的動作;這是我照遊戲的做法對條款的解讀,沒有向 Adobe 確認
  • Bandai Namco 動作資料集:CC BY-NC-ND。套到別的角色上算改作,公開版沒放
  • ElevenLabs 免費方案:標註 elevenlabs.io,不營利
花費

花了多少

有紀錄的現金支出只有 Tripo 一個月的 Pro 方案:月費 CN¥140,首月七折,實付 CN¥98。2026-09-29 付款,計費期間 9/29–10/29。匯出 P2.0 的模型需要 Pro。

Tripo 的付款收據(收據編號、發票編號、卡號末四碼和信箱已遮蔽)
Tripo 的付款收據(收據編號、發票編號、卡號末四碼和信箱已遮蔽)

點數(有紀錄的部分,換裝的生成沒有記到):

用途 點數
頭、身體、頭髮的網格 300
身體、頭髮貼圖(頭用 8K 試用,0 點) 40
Auto Rig 20
閉眼閉嘴參考頭 100
第一輪左右放反,作廢 360

其他工具:ElevenLabs 免費方案、Mixamo 免費、Blender 和 three.js 是開源軟體。ChatGPT 和 Opus 5.5 的訂閱費不算在上面的現金裡。

Opus 5.5 這一週寫的程式和修正,一共 93 個 commit。

現況

還沒做完的

目前的已知問題:

  • 閉眼時外眼角有一道細片,睫毛帶偏厚、有幾根尖刺;左眼從側面看還露出 1–3 條眼球縫
  • 低頭加轉頭時,下巴底下還有淡淡的摺痕
  • 右嘴角有 2 個小面轉折超過 60°
  • 近看下唇下方有細細的顆粒
  • T 字站姿時手臂會穿過頭髮(公開版預設手臂放下)
  • 還沒在手機上測效能。公開版頁面的統計是約 27 萬個三角面,描邊會把模型再畫一次

下一步是把陽菜做成完整的換裝娃娃。下面三項都還沒試:

  1. 換裝系統
  2. 瞳色:眼球是獨立的網格,打算只換那一塊貼圖的顏色
  3. 表情:補上 VRM 標準的開心、難過、驚訝、放鬆
  4. 服裝和動作:繼續加
  5. 捏身材和臉型
  6. 身高、腿長、頭和臉的大小:打算縮放骨頭。預期的風險是非等比縮放會讓臉和手變形
  7. 胸圍、腰圍、臀圍、臉寬:打算做成 shape key,用滑桿調
  8. 衣服:每件衣服都要有一組跟身體對應的 shape key,身體調胖時衣服才會跟著變。預期這是工作量最大的一塊:每加一根身材滑桿,每件衣服都要多做一組
  9. webcam 動作捕捉:打算在瀏覽器裡偵測臉部和身體的特徵點,換算成骨頭角度和表情權重,即時套到陽菜身上。影像只在讀者的電腦裡處理,不上傳
成品

玩玩看

拖曳可以轉視角,按鈕可以換髮型、衣服和表情,右上角選單有 38 個動作。為了降低模型被直接下載走的風險,網頁版的貼圖降到 256 px,近看會有點糊,這是正常的。

版權聲明

  • 陽菜 Hina 的角色設計、3D 模型、貼圖、表情與換裝 © 2026 JonesHong。只供在本頁觀看,不得下載、轉載、再散布或改作
  • 3D 網格與貼圖:以 Tripo AI 生成(tripo3d.ai)
  • 設計圖與四視圖:以 ChatGPT(OpenAI)生成
  • 聲音:以 ElevenLabs 生成(elevenlabs.io)
  • 動作:Mixamo(© Adobe)。頁面只放轉換後的動作資料,不提供原始檔
  • 網頁算繪:three.js(MIT,© three.js authors)、@pixiv/three-vrm 與 @pixiv/three-vrm-animation(MIT,© pixiv Inc.)
  • 3D 編修:Blender(GNU GPL,Blender Foundation)
  • 對嘴:wav2vec2 XLSR-53 音標辨識模型(Apache-2.0,Meta)
帶走這段

拿十個步驟對照你的角色檔

分開生成、逐層修接縫、表情看側面、公開前查授權:這四件事最容易漏。

把下面這段貼給你的 AI,讓它對照你手上的 3D 角色。

幫我用這篇文章的十步工作流,檢查我手上的 3D 角色檔(glTF 或 VRM): https://blog.joneshong.com/zh/blog/hina-3d-playground 1. 讀出面數、貼圖尺寸、骨頭數量、有哪些表情(shape key 或 VRM expression),列成表 2. 對照步驟 2、3:問我頭、頭髮、身體是不是分開生成,四視圖有沒有檢查高度差(2% 以內)和左右方向 3. 對照步驟 5:如果頭和身體是分開的部件,從脖子接縫依序檢查幾何縫隙、法線、貼圖色差、權重(抬頭和低頭時會不會裂開)、描邊 4. 對照步驟 7:如果有閉嘴、閉眼的表情,從正面、左右 30°、正側面各看一次,回報有沒有露出口腔或眼球 5. 對照步驟 10:如果要公開放在網頁上,列出每一項素材(模型、動作、聲音)的授權,標出哪些不能散布原始檔 如果我只需要一張靜態圖,或角色是用現成的捏人工具做的,直接告訴我這套工作流用不到,不要硬套。
參考資料

延伸閱讀

資源為什麼重要
Nano(@Dstudio_ai)的製作分享頭和身體各 2 萬面,一半以上的時間在刷權重,臉部貼圖要手修。我們因此把每個部件設成 25,000 面。
お寿司職人(@SushiNFTart)的長文頭髮、頭、身體三件分開生成,嘴巴從張嘴的模型往回做。這套工作流的順序從這篇來。
three-vrm 的 humanoidAnimation 範例Mixamo 動作怎麼轉到 VRM 骨架上。步驟 10 預先轉換動作,用的就是它的轉換程式。
✦ 帶走這段