- 2021년에 제작된 Deus Ex 1의 립싱크와 눈깜빡임을 개선하는 모드에 대한 설명임
- 개발자는 원본 게임의 립싱크 구현이 출고 당시부터 제대로 동작하지 않았음을 발견함
- Valve의 Half-Life 2와 유사한 방식의 음소 추출 및 입모양 매핑이 Deus Ex에도 적용됨을 분석함
-
Unrealscript 코드 내 잘못된 프레임레이트 체크 및 블렌딩 타이밍 문제를 수정하여 자연스러운 애니메이션 구현에 성공함
- 완벽한 구현을 위해선 음소 업데이트 빈도 문제 해결이 추가적으로 요구됨
소개 및 배경
- 본 모드는 Deus Ex 1의 캐릭터 대사 립싱크와 눈 깜빡임 애니메이션을 개선하는 프로젝트임
- 원본 게임에서는 립싱크 동작 및 눈깜빡임이 출시 시점부터 비정상적으로 구현됨
- 본인의 트위터에 공개되었던 작업 내용을 정리해서 소개함
- 모드 다운로드는 별도 링크(ModDB)에서 제공함
기존 립싱크 구현 조사
- 게임 플레이 중 립싱크의 입모양 전환 문제와 특이한 애니메이션 현상을 파악함
- Chris Norden (Deus Ex 개발자) 인터뷰 참고: 초기 립싱크 시스템은 정교했으나, 성능상의 이유로 간소화됨
-
Unrealscript 부분에서 어떤 부분까지 구현되었는지와 수정 가능성 검토함
- 소스코드는 없고 스크립트만 접근 가능함
립싱크 동작 원리
- 본인은 이전에 Half-Life 2의 립싱크 시스템을 분석하며 경험을 쌓았음
- Valve는 음성파일의 음소(phoneme)를 추출해서 언어정보를 .wav 파일 끝에 첨부, 그리고 실행시 해당 타이밍에 맞춰 입모양(비짐, viseme)을 전환하는 방법을 사용함
- 이 방식은 사전 음소 추출로 실행 중 부하를 줄이는 장점이 있음
Deus Ex의 구조적 문제
- Deus Ex에선 음소 정보가 어디에도 저장되지 않아서 실행시 실시간 추출일 가능성 있음
- Unrealscript 분석 결과 skeletal animation이 아닌 vertex animation 기반, 총 7개의 입모양과 1개의 눈깜빡임 애니메이션만 제공됨
- 외부 오디오 시스템에서 nextphoneme이 A, E, F, M, O, T, U 또는 X(입을 다무는 상태)로 지정되고, 캐릭터 스크립트가 이에 따라 입모양을 전환함
버그 및 개선 작업
- 원본 코드상 프레임레이트 판정 로직이 반대로 동작, 고프레임에서도 입모양이 즉시 전환됨
- 블렌딩 지속시간(tweentime)이 너무 짧게(0.1초) 설정되어 자연스러운 이동감이 상실됨
- 프레임레이트 체크 조건을 무시하고 tweentime을 충분히 길게(0.35초) 조정함
- 그 결과 립싱크가 부드럽게 연결됨
입다물기 및 눈깜빡임 처리
- 대사가 끝난 뒤 입을 다물 때도 자연스러운 블렌딩 적용을 위해 추가 로직 삽입함
-
애니메이션 로직이 bIsSpeaking만 체크했었으나, 항상 립싱크 애니메이션이 동작하도록 개선함
-
눈깜빡임 속도도 조절하여 사용자에게 지속적으로 인식될 수 있게 함
구조적 한계와 아쉬움
-
nextphoneme의 업데이트 빈도 자체가 불규칙하며, 매 tick마다 갱신되지 않는 구조적 한계가 존재함
- 그 결과 모든 블렌딩을 제대로 적용해도 완벽한 립싱크 체험이 불가능함
- 만약 일정한 빈도로 업데이트된다면 블렌딩 속도를 그에 맞게 최적화할 수 있지만, 현 구조에서는 불가함
- NPC와 플레이어 캐릭터 클래스에 동일 로직이 중복 구현되는 등 코드상 비효율 역시 존재함
최종 수정 예시 코드
- 본문 하단에서 개선된 립싱크 함수 전체 코드를 제공함
- 주요 개선점: 프레임레이트 판정 무시, tweentime 대폭 증가, 대사 종료 후 부드러운 입다물기, 눈깜빡임 빈도 및 속도 조절
결론
- 본 모드를 사용하면 원본 대비 훨씬 자연스럽고 개선된 립싱크 및 눈깜빡임 애니메이션을 경험할 수 있음
- 구조적 제한으로 인해 완전한 립싱크는 어렵지만, 현 시점에서 접근 가능한 최선의 해법임