• คำอธิบายเกี่ยวกับม็อดที่สร้างขึ้นในปี 2021 เพื่อปรับปรุงลิปซิงก์และการกะพริบตาใน Deus Ex 1
  • ผู้พัฒนาพบว่าการทำงานของ ระบบลิปซิงก์ ในเกมต้นฉบับนั้นทำงานผิดปกติมาตั้งแต่ตอนวางจำหน่าย
  • มีการวิเคราะห์ว่า Deus Ex ใช้วิธีดึงหน่วยเสียงและแมปปากคล้ายกับ Half-Life 2 ของ Valve
  • แก้ไขปัญหาการตรวจสอบเฟรมเรตและจังหวะการ blend ที่ผิดพลาดใน โค้ด Unrealscript จนทำให้แอนิเมชันดูเป็นธรรมชาติมากขึ้น
  • หากต้องการให้สมบูรณ์แบบ ยังต้องแก้ปัญหาเรื่อง ความถี่ในการอัปเดตหน่วยเสียง เพิ่มเติม

บทนำและพื้นหลัง

  • ม็อดนี้เป็นโปรเจกต์ที่ปรับปรุงลิปซิงก์บทพูดของตัวละครและแอนิเมชันการกะพริบตาใน Deus Ex 1
  • ในเกมต้นฉบับ การทำงานของลิปซิงก์และการกะพริบตาถูกทำไว้ผิดปกติมาตั้งแต่ช่วงเปิดตัว
  • ผู้เขียนนำงานที่เคยเผยแพร่ไว้บน Twitter มาจัดเรียงและอธิบายอย่างเป็นระบบ
  • ดาวน์โหลดม็อดได้จากลิงก์แยกต่างหาก(ModDB)

การตรวจสอบระบบลิปซิงก์เดิม

  • ระหว่างเล่นเกม ผู้เขียนสังเกตเห็นปัญหาเรื่อง การสลับรูปปากของลิปซิงก์ และลักษณะแอนิเมชันที่แปลกผิดปกติ
  • อ้างอิงบทสัมภาษณ์ของ Chris Norden (ผู้พัฒนา Deus Ex): ระบบลิปซิงก์ช่วงแรกละเอียดกว่านี้ แต่ถูก ลดทอนลงเพราะเหตุผลด้านประสิทธิภาพ
  • จึงตรวจสอบว่าภายในส่วนของ Unrealscript มีการทำไว้ถึงระดับใด และสามารถแก้ไขได้มากน้อยแค่ไหน
  • ไม่มีซอร์สโค้ดให้ใช้งาน และเข้าถึงได้เพียงสคริปต์เท่านั้น

หลักการทำงานของลิปซิงก์

  • ผู้เขียนเคยสั่งสมประสบการณ์จากการวิเคราะห์ระบบลิปซิงก์ของ Half-Life 2 มาก่อน
  • Valve ใช้วิธี ดึงหน่วยเสียง (phoneme) จากไฟล์เสียง แล้วแนบข้อมูลภาษานั้นไว้ท้ายไฟล์ .wav จากนั้นตอนรันจึง สลับรูปปาก (viseme) ให้ตรงตามจังหวะเวลา
  • วิธีนี้มีข้อดีคือใช้การดึงหน่วยเสียงล่วงหน้า จึง ลดภาระระหว่างรันไทม์

ปัญหาเชิงโครงสร้างของ Deus Ex

  • ใน Deus Ex ดูเหมือนว่าข้อมูลหน่วยเสียงไม่ได้ ถูกเก็บไว้ที่ใดเลย จึงมีความเป็นไปได้ว่าระบบจะดึงแบบเรียลไทม์ระหว่างรัน
  • จากการวิเคราะห์ Unrealscript พบว่าเกมใช้ vertex animation แทน skeletal animation และมีเพียงรูปปาก 7 แบบกับแอนิเมชันกะพริบตา 1 แบบเท่านั้น
  • ระบบเสียงภายนอกจะกำหนด nextphoneme เป็น A, E, F, M, O, T, U หรือ X (สถานะปิดปาก) และสคริปต์ตัวละครจะสลับรูปปากตามนั้น

บั๊กและการปรับปรุง

  • ในโค้ดเดิม ตรรกะการตัดสินเฟรมเรตทำงานกลับด้าน ทำให้แม้ในเฟรมเรตสูงก็ยังสลับรูปปากทันที
  • ระยะเวลาการ blend (tweentime) ถูกตั้งไว้ สั้นเกินไป (0.1 วินาที) จนการเคลื่อนไหวดูไม่เป็นธรรมชาติ
  • ผู้เขียนจึง ไม่สนใจเงื่อนไขตรวจสอบเฟรมเรต และปรับ tweentime ให้ยาวขึ้นพอสมควรเป็น 0.35 วินาที
  • ผลลัพธ์คือ ลิปซิงก์เชื่อมต่อกันได้ลื่นไหลขึ้น

การปิดปากและการกะพริบตา

  • มีการเพิ่มตรรกะเพิ่มเติมเพื่อให้ช่วง ปิดปากหลังพูดจบ ใช้การ blend อย่างเป็นธรรมชาติด้วย
  • เดิมที ตรรกะแอนิเมชันตรวจแค่ bIsSpeaking แต่ได้ปรับปรุงให้แอนิเมชันลิปซิงก์ทำงานอยู่เสมอ
  • ยังมีการปรับ ความเร็วของการกะพริบตา ให้ผู้เล่นสังเกตเห็นได้ต่อเนื่องมากขึ้น

ข้อจำกัดเชิงโครงสร้างและจุดที่น่าเสียดาย

  • ตัว ความถี่ในการอัปเดตของ nextphoneme เองมีความไม่สม่ำเสมอ และมีข้อจำกัดเชิงโครงสร้างที่ทำให้มันไม่ได้อัปเดตทุก tick
  • ผลคือ ต่อให้ใส่การ blend ได้ครบถ้วนก็ยัง ไม่สามารถมอบประสบการณ์ลิปซิงก์ที่สมบูรณ์แบบได้
  • หากอัปเดตด้วยความถี่คงที่ ก็จะสามารถปรับความเร็วของการ blend ให้เหมาะสมได้ แต่ในโครงสร้างปัจจุบันทำไม่ได้
  • ยังมีความไม่มีประสิทธิภาพในโค้ด เช่น การ ทำตรรกะชุดเดียวกันซ้ำ ทั้งในคลาส NPC และคลาสตัวละครผู้เล่น

โค้ดตัวอย่างฉบับแก้ไขขั้นสุดท้าย

  • ช่วงท้ายบทความมี โค้ดเต็มของฟังก์ชันลิปซิงก์ที่ปรับปรุงแล้ว ให้ดู
  • จุดปรับปรุงหลัก: ไม่ใช้การตัดสินเฟรมเรต, เพิ่ม tweentime อย่างมาก, ปิดปากอย่างนุ่มนวลหลังจบบทพูด, และปรับความถี่กับความเร็วของการกะพริบตา

บทสรุป

  • เมื่อใช้ม็อดนี้ จะได้สัมผัสกับ ลิปซิงก์และแอนิเมชันกะพริบตาที่เป็นธรรมชาติและดีขึ้นกว่าต้นฉบับมาก
  • แม้จะยังทำ ลิปซิงก์ที่สมบูรณ์แบบ ได้ยากเพราะข้อจำกัดเชิงโครงสร้าง แต่นี่คือแนวทางแก้ที่ดีที่สุดเท่าที่เข้าถึงได้ในตอนนี้

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น