4.ทะเบียนพารามิเตอร์ (เป็นข้อบังคับ / normative)

ทะเบียนคือรายการมิติทุกตัวที่ถือเป็นต้นฉบับ. แต่ละแถวคือหนึ่งมิติ (มิติที่มีด้านมีเป็นคู่ _l/_r ที่ใช้นิยามที่ระบุร่วมกัน). ค่า default คือค่ากลางแบบบรรทัดฐาน.

คอลัมน์ความหมาย
รหัส (id)ตัวระบุเครื่องที่คงที่ (เช่น a_hand_x). id ที่มีด้านต่อท้าย _l/_r. ต้องไม่นำกลับมาใช้ซ้ำหรือนิยามใหม่ภายในเวอร์ชันกระบวนทัศน์เดียวกัน (X, §8).
ข้าง (side)L/R (คู่) หรือ none (แนวกลาง).
ความหมาย (definition)นิยามหนึ่งประโยคที่มนุษย์อ่านเข้าใจ.
−1 … +1ความหมายของสองขั้ว (ค่าหน่วยจริง max ในวงเล็บ).
องศาอิสระ (dof)องศาอิสระ.
ใช้ใน latent อารมณ์ (affect)มิตินี้ใช้ใน latent อารมณ์ได้หรือไม่ คือรับเดลตาการแสดงออก (h b f m เท่านั้น).
ค่าปริยาย (default)ค่ากลางแบบบรรทัดฐาน.

4.1.แขน (arm)

ตำแหน่งมือในกรอบยึดคอ โดยแต่ละแกนมีมาตราส่วนความยาวที่คาลิเบรตแยกกัน บวกการกางข้อศอก. ทั้งหมดเป็น bipolar ยกเว้น a_spread (unipolar).

แกนระยะอ้างอิงที่คาลิเบรต d
Xwrist_r ถึง middle_tip_r: ข้อมือถึงปลายนิ้วกลาง ขณะมือกางในท่า bind
Yneck ถึง navel: คอถึงสะดือ ขณะลำตัวอยู่ในท่า bind
Zshoulder_r ถึง wrist_r: ไหล่ถึงข้อมือขณะเหยียดแขนเต็มที่ โดยคงทิศข้อมือเดิม
ระยะอ้างอิงที่คาลิเบรตสามระยะ: ข้อมือถึงปลายนิ้วกลาง คอถึงสะดือ ไหล่ถึงข้อมือเมื่อเหยียดแขน
รูปที่ 3 — ระยะอ้างอิงที่คาลิเบรต d ของแกนแขน

คำอธิบาย: เส้นที่วาดแต่ละเส้นคือระยะอ้างอิง d ของแต่ละแกน — X wrist_r → middle_tip_r (มือกาง ท่า bind) · Y neck → navel (ท่า bind) · Z shoulder_r → wrist_r (เหยียดแขนเต็มที่ คงทิศข้อมือเดิม). หน่วยของแกนคือ L = 2 · r · d ไม่ใช่ความยาวที่วาดโดยตรง; ค่าบรรทัดฐาน n เลื่อนมือ n × max × L ตามแกนของกรอบร่างกาย. ด้านขวากำหนดหน่วยให้ทั้งสองแขน; ไม่วัดระยะใหม่จากท่าขณะเคลื่อนไหว.

ระยะต้อง (MUST) วัดระหว่างจุดบนร่างกายที่คาลิเบรตแล้ว รวมออฟเซ็ตท้องถิ่นของกระดูก ในท่าอ้างอิงคงที่. ต้องไม่ (MUST NOT) วัดใหม่จากท่าทางขณะเคลื่อนไหว: การงอศอก การงอนิ้ว หรือการหมุนลำตัวต้องไม่เปลี่ยนหน่วย. ระยะอ้างอิงของด้านขวากำหนดหน่วยร่วมของแขนทั้งสองข้าง; เครื่องหมายตำแหน่งซ้าย/ขวายังคงเป็นไปตาม §3.2. เมื่อจุดที่คาลิเบรตหรือรูปทรงมือจริงเปลี่ยน ต้องคำนวณระยะอ้างอิงที่ได้รับผลใหม่.

สำหรับแต่ละแกน หน่วยกายภาพคือ L = 2 · r · d โดย d คือระยะอ้างอิงที่คาลิเบรตข้างต้น และ r เป็นอัตราส่วนอ้างอิงคงที่ต่อแกนที่นิยามโดยอวาตาร์อ้างอิงทางการ (based) จึงคงขนาดตัวเลขเดิมไว้. ดังนั้น หน่วยแกน X = 2 · r · ความยาวมือ (ข้อมือถึงปลายนิ้วกลาง), หน่วยแกน Y = 2 · r · ความยาวช่วงตัว (คอถึงสะดือ) และหน่วยแกน Z = 2 · r · ความยาวแขน (ไหล่ถึงข้อมือ ขณะเหยียดแขน); ไม่มีแกนใดใช้ความยาว นั้นโดยตรงเป็นหน่วย. พิกัดแขนบรรทัดฐาน n ให้ระยะเลื่อน n × max × L ตามแกนในกรอบร่างกาย ก่อนแก้ anchor/contact. ในทางเทียบเท่า ผู้บริโภคที่ใช้หน่วยความกว้างไหล่จะคูณแกนนั้นด้วย 2 · r · d / shoulderWidth. ดังนั้นความกว้างไหล่เพียงอย่างเดียวไม่ได้กำหนดตำแหน่งแขนข้ามอวาตาร์ อีกต่อไป. รหัส ค่า max และค่าปริยายในทะเบียนด้านล่างไม่เปลี่ยน.

ผู้บริโภคที่ไม่มีระยะอ้างอิงที่ใช้ได้ควร (SHOULD) ใช้หน่วยความกว้างไหล่แบบเดิมสำหรับแกนนั้น และรายงานว่าขาดการคาลิเบรต. การถอยกลับนี้ไม่ถือว่าอวาตาร์นั้นสอดคล้องกับข้อกำหนดหน่วยแกนที่คาลิเบรตแล้ว.

รหัสข้างความหมาย−1 … +1องศาอิสระค่าปริยาย
a_hand_xL/Rตำแหน่งมือซ้าย-ขวา ในหน่วย L_X = 2 · r · ความยาวมือ (ข้อมือถึงปลายนิ้วกลาง) ที่คาลิเบรตแล้ว−1 = ข้ามไปฝั่งตรงข้าม · +1 = ออกพ้นไหล่ตัวเอง (max 1.5)10.333
a_hand_yL/Rความสูงมือ ในหน่วย L_Y = 2 · r · ความยาวช่วงตัว (คอถึงสะดือ) ที่คาลิเบรตแล้ว−1 = ต่ำ/ระดับสะโพก · +1 = สูงเหนือหัว (max 1.5)1−0.933
a_hand_zL/Rระยะยื่นมือไปหน้า ในหน่วย L_Z = 2 · r · ความยาวแขน (ไหล่ถึงข้อมือเมื่อเหยียดเต็มที่) ที่คาลิเบรตแล้ว−1 = ชิดตัว · +1 = ยื่นสุด (max 1.5)10.35
a_spreadL/Rการกางข้อศอก0 = หุบชิดซี่โครง · +1 = กางออก (unipolar, max 1)10.4

4.2.การหันฝ่ามือ (palm facing)

การวางแนวข้อมือเป็นส่วนเวกเตอร์ของควอเทอร์เนียนหน่วยแบบ global ในกรอบร่างกาย (w สร้างกลับตอนถอดรหัส); ไม่มี gimbal. เอกลักษณ์ (0,0,0) = ฝ่ามือหันไปหน้า นิ้วชี้ขึ้น. มือขวากลับด้าน ข้ามระนาบซากิตทัล. ค่าเริ่มต้นแทน "มือห้อยตามท่อนแขน ฝ่ามือหันเข้าตัว".

การหันฝ่ามือที่เอกลักษณ์: ฝ่ามือเข้าหากล้อง นิ้วชี้ขึ้น พร้อมแกนหมุนสามแกน
รูปที่ 4 — การหันฝ่ามือ: ท่าเอกลักษณ์และแกนหมุน

คำอธิบาย: เอกลักษณ์ (0,0,0) = ฝ่ามือหันเข้าหากล้อง (+z) นิ้วชี้ขึ้น (+y) แสดงด้วยมือขวา (นิ้วโป้งอยู่ซ้ายของผู้ดู). w_qx หมุนรอบแกน x (ก้มเงย), w_qy รอบแกน y (คว่ำหงาย), w_qz รอบแกน z (หมุน); แกนเป็นไปตามรูปที่ 2.

ผู้บริโภคต้อง (MUST) คำนวณองค์ประกอบ w คืนจากเงื่อนไขความยาวหนึ่งหน่วย:

w = sqrt(1 - (q_x² + q_y² + q_z²))

หากผลรวมกำลังสองของส่วนเวกเตอร์เกิน 1 ต้อง (MUST) ย่อสเกลส่วนเวกเตอร์ลงให้ความยาวไม่เกิน 1 ก่อนคำนวณ และควร (SHOULD) จำกัดไว้ต่ำกว่า 1 เล็กน้อย (เช่น 0.98) เพื่อเลี่ยงภาวะเอกฐานใกล้ w = 0. การกำหนดให้ w ≥ 0 เสมอยังทำให้การแทนการหมุนไม่กำกวม (q และ −q คือการหมุนเดียวกัน).

รหัสข้างความหมาย−1 … +1องศาอิสระค่าปริยาย
w_qxL/Rควอเทอร์เนียน x (แกนก้มเงย)−1 … +1 (max 1)10.885
w_qyL/Rควอเทอร์เนียน y (แกนคว่ำหงาย)−1 … +1 (max 1)1−0.093
w_qzL/Rควอเทอร์เนียน z (แกนหมุน)−1 … +1 (max 1)1−0.429

4.3.นิ้ว (fingers)

ต่อหนึ่งนิ้วมี curl / fold / side ทั้งสองมือ; นิ้วโป้งเพิ่ม DOF ที่ 4 (roll). นิ้วโป้งถูกผูกหมุน ~90° ดังนั้น fold = การหุบเข้าหาฝ่ามือ (opposition) และ side = การกางเข้า/ออกระนาบฝ่ามือ. g_thumb_roll มักสังเกตไม่ได้จากท่าทาง 2 มิติ; ผู้ผลิตที่ประเมินค่าไม่ได้ ต้อง (MUST) ส่งค่าปริยาย (0). ทั้งหมด bipolar, max 1, default 0.

ขั้วของ DOF นิ้วที่ −1, 0, +1 สำหรับ curl, fold และ side
รูปที่ 5 — ขั้วของ DOF นิ้ว: curl, fold และ side

คำอธิบาย: คอลัมน์ −1 · 0 · +1. Curl (แถวบน; จุดคือข้อนิ้ว): −1 = นิ้วโค้งแอ่นไปด้านหลังตามข้อกลางและข้อปลาย · 0 = เหยียดตรง · +1 = งองุ้มเข้าหาฝ่ามือ. Fold (แถวกลาง; จุดคือจุดหมุนที่โคนนิ้ว): ทั้งนิ้วที่เหยียดตรงหมุนรอบข้อโคนนิ้ว — −1 = ยกไปด้านหลัง · 0 = ตรง · +1 = พับลงเข้าหาฝ่ามือ (≈ 90°). Side (แถวล่าง ไฮไลต์นิ้วชี้): −1 = ไปทางโป้ง · +1 = ไปทางก้อย.

ขั้วของ DOF นิ้วโป้งที่ −1, 0, +1 สำหรับ fold และ side
รูปที่ 6 — ขั้วของ DOF นิ้วโป้ง: fold และ side

คำอธิบาย: มือขวา ฝ่ามือหันเข้าหากล้อง; คอลัมน์ −1 · 0 · +1. โป้ง fold = หุบขวางฝ่ามือ (แถวบน): −1 = กางออกห่างฝ่ามือ · +1 = ขวางฝ่ามือไปฐานนิ้วก้อย. โป้ง side = กางเข้า/ออกระนาบฝ่ามือ (แถวล่าง): −1 = เข้า แนบฝ่ามือ · +1 = ออกจากระนาบฝ่ามือ เข้าหากล้อง. ไม่ได้วาด roll ของโป้ง.

รหัสข้างความหมาย−1 … +1องศาอิสระค่าปริยาย
g_{thumb,index,middle,ring,pinky}_curlL/Rงอปลายนิ้ว (PIP/DIP เข้าฝ่ามือ)−1 = กรีดนิ้ว (แอ่นไปด้านหลัง) · 0 = เหยียดตรง · +1 = งอสุด10
g_{index,middle,ring,pinky}_foldL/Rพับโคนนิ้ว (MCP)−1 = พับไปด้านหลัง · 0 = เหยียดตรง · +1 = พับเข้าหาฝ่ามือ10
g_thumb_foldL/Rโป้งหุบขวางฝ่ามือ (ไปฐานนิ้วก้อย)−1 = ออกห่าง · +1 = ขวางฝ่ามือ10
g_{index,middle,ring,pinky}_sideL/Rกางนิ้ว−1 = ไปทางโป้ง · +1 = ไปทางก้อย10
g_thumb_sideL/Rโป้งกางเข้า/ออกระนาบฝ่ามือ−1 = เข้า · +1 = ออก10
g_thumb_rollL/Rโป้งหมุนอุ้งนิ้ว−1 = อุ้งออกจากฝ่ามือ · +1 = อุ้งเข้าฝ่ามือ10

4.4.ศีรษะ (head) (ใช้ใน latent อารมณ์ได้)

มุมออยเลอร์ของศีรษะ (เก็บเป็น bipolar องศา). ใช้ใน latent อารมณ์ได้.

รหัสข้างความหมาย−1 … +1องศาอิสระใช้ใน latent อารมณ์ค่าปริยาย
h_yawnoneหันซ้าย-ขวา±80° (max 80)1yes0
h_pitchnoneก้มเงย±60° (max 60)1yes0
h_rollnoneเอียงหัว±50° (max 50)1yes0

4.5.ลำตัว (body) (ใช้ใน latent อารมณ์ได้)

การเคลื่อนลำตัวกระจายตามกระดูกสันหลัง (องศา). ใช้ใน latent อารมณ์ได้.

รหัสข้างความหมาย−1 … +1องศาอิสระใช้ใน latent อารมณ์ค่าปริยาย
b_twistnoneบิดตัวซ้าย-ขวา±60° (max 60)1yes0
b_bendnoneก้มเงยตัว±50° (max 50)1yes0
b_leannoneเอียงตัว±40° (max 40)1yes0

4.6.ใบหน้า (face) (ใช้ใน latent อารมณ์ได้)

มิติการแสดงออกแบบ bipolar; แต่ละตัวขับช่อง morph ชื่อ ARKit หนึ่งช่องขึ้นไปต่อทิศทาง. ทั้งหมด max 1, default 0. ใช้ใน latent อารมณ์ได้.

รหัสข้างความหมาย−1 … +1องศาอิสระใช้ใน latent อารมณ์ค่าปริยาย
f_brow_innernoneคิ้วด้านใน−1 = ขมวด (โกรธ) · +1 = เลิก1yes0
f_browL/Rคิ้วด้านนอก−1 = ลง · +1 = ขึ้น1yes0
f_eyeL/Rเปลือกตา−1 = หลับ · +1 = เบิ่ง1yes0
f_squintL/Rหยีตา0 = ปกติ · +1 = บีบตา (plus เท่านั้น)1yes0
f_nosenoneย่นจมูก / เชิดจมูก0 = ปกติ · +1 = ย่น (plus เท่านั้น)1yes0

4.7.ปาก (mouth) (ใช้ใน latent อารมณ์ได้)

รูปปาก/ช่องปากแบบ bipolar; แต่ละตัวเรียก morph ARKit หลายช่องต่อทิศทางเพื่อให้สุดขั้วไปถึงรูป ISWA ที่เข้ม (หาว จูบ โชว์ฟัน). แก้ม ลิ้น ฟัน เป็นอวัยวะช่องปากจึงจัดไว้ที่นี่. ทั้งหมด max 1, default 0. ใช้ใน latent อารมณ์ได้.

รหัสข้างความหมาย−1 … +1องศาอิสระใช้ใน latent อารมณ์ค่าปริยาย
m_mouthL/Rมุมปาก−1 = คว่ำ · +1 = ยิ้ม1yes0
m_jawnoneขากรรไกร−1 = กัด · +1 = อ้า (หาว)1yes0
m_lipsnoneห่อปาก−1 = ห่อ (funnel) · +1 = จู๋ (pucker)1yes0
m_widenoneความกว้างปาก−1 = แคบ (/u/) · +1 = กว้าง (signed)1yes0
m_rollnoneม้วนริมฝีปาก−1 = ล่างทับบน · +1 = บนทับล่าง1yes0
m_pressnoneเม้มปาก−1 = คลาย-แยก · +1 = เม้ม/เกร็ง (signed)1yes0
m_fwdnoneยื่นปาก/ขากรรไกร0 = ปกติ · +1 = ยื่นหน้า (plus เท่านั้น)1yes0
m_cheeknoneแก้ม−1 = ตอบ · +1 = ป่อง (signed)1yes0
m_tonguenoneแลบลิ้น0 = เข้า · +1 = ออก/เลีย (plus เท่านั้น, best-effort)1yes0
m_teethnoneโชว์ฟัน (เปิดริมฝีปาก)0 = ปกติ · +1 = โชว์ฟัน (plus เท่านั้น)1yes0

เมื่อ mouthing ทำงาน morph viseme_* ของศิลปินยังเป็นรูปหลัก และ m_* เป็น delta ที่มีขอบเขตจากรูปนั้น. ส่วนผสม viseme ที่ normalize แล้วให้ baseline โดยน้ำหนัก b; ตอนถอดรหัสจะส่งเฉพาะ clamp(b + authored, −1, 1) − b ไปยังช่องปาก ARKit. ดังนั้นค่า authored เป็นศูนย์จะไม่เปลี่ยนรูปปากของศิลปิน, การปรับทิศเดียวกันใช้ได้เฉพาะช่วงที่เหลือ, และการปรับทิศตรงข้ามหักล้างกันได้. ตารางเริ่มต้นแบบระมัดระวังคือ viseme_aa → m_jaw +0.7 และ viseme_PP → m_jaw −0.7, m_press +0.7; คู่อื่นมี baseline เป็นศูนย์จนกว่าจะปรับจูน.

4.8.เงื่อนไขเสริม (hyper conditions)

ช่องเงื่อนไข/ไม่ต่อเนื่องที่พกไปพร้อมเวกเตอร์ต่อเนื่อง — ดู §3.4. (เปลี่ยนชื่อหมวดจาก "4.cat ช่องเชิงหมวดหมู่" ในร่างก่อนเผยแพร่; id เดิมทั้งหมด.)

รหัสโดเมนกลุ่มเจ้าของขั้นที่ใช้ความหมาย
eye_lookatenumfaceถอดรหัสเป้าหมายการมอง (มองหน้าตรง / มองมือซ้าย / มองมือขวา / ชำเลืองซ้าย ขวา บน ล่าง).
visemeแมปกระจาย viseme_* → 0…1mouthถอดรหัสการขยับปาก: แมปกระจาย (sparse map) จาก id รูปปาก viseme_* ไปยังสัดส่วนของรูปนั้น เช่น {viseme_PP: 0.7, viseme_aa: 0.3} — id ที่ไม่ปรากฏมีค่าเป็น 0, {} คือไม่ขยับปาก และผลรวมของสัดส่วนต้องไม่เกิน 1. รูปปากหลายรูปทำงานพร้อมกันได้ (แต่ละ id เป็นช่อง morph ของตัวเอง ตอนถอดรหัสจึงกำหนดค่าสัดส่วนลงช่องนั้นตรง ๆ) และเพราะค่าเป็นแบบต่อเนื่อง คีย์ปากสองคีย์จึงไล่ข้ามกัน (crossfade) ตอน interpolate แทนที่จะกระโดด. แมปที่เข้ามาเกินเพดานจะถูกตัดค่าทีละรายการให้ไม่เกิน 1 ก่อน แล้วหารลงให้ผลรวมเป็น 1.
contactจุด mover → จุด targetarm (ฝั่ง mover)การปรับปรุงผลลัพธ์จุด mover ไปสัมผัสจุด target บนร่างที่ถอดรหัสสมบูรณ์แล้ว; target ไม่ขยับ (§3.4).
anchorจุดอ้างอิงต่อข้างแขนarm (ต่อข้าง)การปรับปรุงผลลัพธ์แขนข้างที่ anchor วัดตำแหน่งจากจุดของตนแทนคอ; แขนที่คีย์ไม่มี anchor ไม่ขยับ; ฝั่งที่ contact ทำงาน contact ชนะ (§3.4).