6 · 角色與臉部表情
身體
makeCharacter(spec) 在 recipe/engine/character.mjs 中建立骨架:頭部半徑 0.42、身體高度 0.8、腿部 0.52、手臂 0.30 + 0.28。這些比例即為風格:大圓頭、分為上下兩色的豆狀身體、細瘦的 Anthracite 色細枝四肢、膚色連指手掌、圓潤的 Cognac 色鞋子。
const host = makeCharacter({
name: 'host', skin: SKIN.tan,
top: BRAND.blueCoral, bottom: BRAND.anthracite, split: 0.32, width: 1.0,
hair: 'curly', hairColor: '#2a1d18',
hat: null, glasses: true, beard: false,
face: { browColor: BRAND.anthracite, browThick: 3.4, mustache: null },
extras: torso => { /* 添加領巾、鈕扣、徽章、工具腰帶… */ },
});
host.root.position.set(x, 0, z); place.scene.add(host.root);
| 選項 | 值 |
|---|---|
skin | SKIN.light / fair / medium / tan / brown / deep,或任意十六進位色。可混合使用於不同角色。 |
top, bottom, split, width | 豆狀身體的兩種顏色、交界位置(0–1 表示高度)、以及寬度係數(1.06 使身材更壯)。 |
hair | short(或 cap)、bob、bun、ponytail、curly、spiky、bald,以及兩種時代假髮:newton(長捲髮)與 einstein(帶自發光的凌亂白髮)。 |
hat / hatColor | cap、tophat(可搭配 hatBand)、helmet(圓頂盔)、hardhat、beret、crown |
glasses | true 或指定鏡框顏色:圓框覆蓋於繪製的眼睛之上。 |
beard | true(使用髮色)或指定顏色。 |
face | { browColor, browThick, mustache }:眉毛顏色與粗細,以及可選的繪製鬍子顏色。 |
extras(torso) | 使用 part(geometry, color) 添加服裝零件:領巾、領子、鈕扣、徽章、工具。 |
為新主題設計角色: 先選擇輪廓(在手機尺寸下,頭髮或帽子形狀是最明顯的識別特徵),然後為上衣選一個品牌主色,再選膚色。歷史人物將被繪製成我們自己的卡通風格:時代感的頭髮和服裝就已足夠(牛頓的捲曲假髮與 Rouge Noir 大衣;愛因斯坦的凌亂白髮、鬍子與 Blue Coral 毛衣)。切勿複製受版權保護的角色。
帶有臉部的物體(蘋果、行星、分子、機器):使用 faces.mjs 中的 faceDecal(radius, { skin: <物體顏色> }) 為它們添加臉部,將眼皮顏色設為物體顏色,並將該物體的群組加入場景的 faceCamera 清單,使其能面向鏡頭。
臉部
頭部前方的平面繪製貼花(faceDecal):眉毛、帶瞳孔與高光的眼睛、嘴巴、沒有鼻子,所有元素皆來自同一組形狀家族。無唇形同步;臉部表情即為表演本身。
表情(faces.mjs 中的 EXPRESSIONS):neutral, content, sleepy, surprised, shocked, curious, thinking, eureka, delighted, smug, knowing, confused, worried(帶一滴汗)、proud(臉紅)、no, wheee, dizzy(螺旋眼)、lookDown。若要新增表情,複製一個現有條目並修改眉毛 [內側角度, 外側角度](度數)、lid(0 睜開 … 1 閉合)、look(瞳孔偏移)、eye 與 pupil 縮放、以及 mouth(flat, smile, smirk, side, wavy, o, grin, shout)。
臉部切換(參考規則,已測量)
- 僅能透過眨眼切換:一個半閉框架,一個全閉框架,然後出現新臉孔。
- 新臉孔需在重音單詞前 2 幀出現(
W(i) - FACE)。 - 禁止在表情之間形變過渡。
- 主要角色約每 1.2 秒換一次新臉;物體則在其故事節拍處切換(蘋果在「wrong」這個詞上從
smug轉為shocked)。 - 長時間保持表情時的自然眨眼:傳入
blinks時間列表。
rig.faceAt(t, [[0, 'curious'], [W(17) - FACE, 'smug']], [0.75, 6.2]); // 切換,然後自然眨眼
objectFace.set('shocked'); // 物體直接設定
雙手與手持道具
rig.handPos('L' | 'R' | 'both') 回傳目前姿勢下手部的世界座標;每一幀將手持道具放置於該位置(牛頓手中的書,愛因斯坦丟擲保齡球前的球)。rig.headPos() 提供頭部中心位置以供取景。
檢查事項
- 在手機尺寸下,能否僅憑輪廓區分每個角色?
- 眼皮顏色是否與膚色或身體顏色一致(避免眨眼時透視)?
- 臉部是否在每個表演鏡頭中都面向攝影機?