생쥐는 여전히 눈을 깜빡이지 않는다
글: Cinevva CTO 겸 공동 창립자 Oleg Sidorkin
저희는 Cinevva에서 여러분의 모델에 생명을 불어넣는 도구를 만드는 데 많은 노력을 기울여 왔습니다. 모델을 리깅하고, 애니메이션을 적용하고, 움직이기 시작했을 때 드러나는 어색한 부분을 수정하는 작업입니다. 그 과정에서 구부러지지 않는 다리, 애니메이션 전이, 움직일 뼈가 없는 꼬리 문제를 다뤘습니다.
이제 그 캐릭터들에게 감정을 더하고 싶습니다. 캐릭터는 장면을 가로질러 걷는 것뿐 아니라 놀라거나, 짜증을 내거나, 기뻐하는 표정도 지을 수 있어야 합니다. 그러려면 얼굴이 움직여야 합니다. 눈꺼풀, 눈썹, 볼, 그리고 가만히 다문 기본 자세를 넘어 다양한 모양을 만들 수 있는 입이 필요합니다.
저희는 기존 메시에서 실제로 쓸 수 있는 표정을 어느 수준까지 만들 수 있는지 알아보기 위해 최근의 얼굴 리깅 연구를 살펴보기 시작했습니다. 이 글은 그 작업에 대한 첫 번째 기록입니다. 실제로 무엇을 실행할 수 있었는지, 캐릭터를 어떻게 준비했는지, 그리고 직접 시도했을 때 어떤 결과가 나왔는지를 다룹니다.
테스트 대상은 꼬리 작업에 사용했던 생쥐였습니다. 이 생쥐에는 이미 신체 리그와 여섯 개의 애니메이션 클립이 있었습니다. 걷고, 뛰고, 전력 질주할 수 있었지만 어떤 동작을 해도 얼굴은 굳은 채로 움직이지 않았습니다.
저희는 제공된 얼굴 메시에 표정을 전이하는 연구용 구현체인 NFR을 사용해 봤습니다. 첫 출력은 턱 벌리기, 미소, 눈 깜빡이기, 입술 오므리기, 눈썹 올리기라는 이름이 붙은 포즈 시트였습니다. 하지만 유용한 애니메이션은 거의 보이지 않았습니다. 턱은 주둥이를 잡아당겼고, 나머지 이미지 대부분은 거의 똑같아 보였습니다.
결과를 평가하기 전에 수정할 만한 준비 과정의 문제가 하나 있었습니다. 입력 메시를 만들면서 생쥐 눈 테두리의 상당 부분을 잘라냈던 것입니다. 그래서 크롭을 다시 만들고, 작업을 재실행한 뒤 두 결과를 모두 움직이는 영상으로 렌더링했습니다. 아래에서 확인할 수 있습니다.
NFR에 입력한 것
전체 캐릭터에는 내보낸 버텍스 22,744개와 조인트 30개가 있지만, 얼굴 블렌드셰이프나 턱과 눈 전용 본은 없습니다. 기존 리그를 건드리지 않고 얼굴 컨트롤을 추가해야 했습니다.
NFR의 입력 요구 사항을 보면 GLB를 그대로 넘길 수 없었던 이유를 알 수 있습니다. NFR은 눈과 입이 뚫려 있고 내부 구조와 안구가 제외된 얼굴 표면을 요구하며, 메시가 예시와 대략적으로 정렬되어 있어야 합니다. 저희는 뒤통수, 귀, 목을 제거하고 개구부를 만든 다음, 연결된 조각 중 가장 큰 부분만 남겼습니다. 그 결과 버텍스 777개와 삼각형 1,296개가 남았습니다.
이 크롭의 모든 버텍스는 여전히 원본 캐릭터의 특정 위치와 대응했습니다. 추론 후에는 예측된 각 표정에서 예측된 중립 얼굴을 빼고, 오프셋을 다시 생쥐의 스케일로 변환한 다음, 원본에서 대응하는 버텍스에 적용했습니다. 얼굴과 나머지 머리 부분이 만나는 지점에서 움직임이 갑자기 끊기지 않도록 크롭 가장자리 근처에서는 움직임이 점차 줄어들게 했습니다.
그 결과 슬라이더로 중립 메시와 혼합할 수 있는 버텍스 오프셋인 블렌드셰이프 아홉 개를 얻었습니다. 모든 슬라이더를 0으로 설정하면 원래 생쥐로 돌아왔습니다. 기존 스켈레톤과 텍스처, 여섯 개의 신체 애니메이션 클립은 그대로 유지하고 각 표정을 위한 별도의 테스트 클립을 추가했습니다.
체크포인트와 입력을 불러온 뒤 추론 자체는 T4에서 약 7초가 걸렸습니다. 하지만 쓸 만한 표정을 만드는 데는 훨씬 더 오랜 시간이 필요할 듯했습니다.
필요한 부분을 잘라내고 있었다
첫 번째 눈 크롭은 넓은 타원형이었습니다. 이 얼굴에서는 각 눈 주변 테두리의 상당 부분이 제거됐습니다. 입 크롭은 눈에 보이는 입술 경계선보다 아래에 있었습니다. 메시를 수치로만 살펴보면 두 문제 모두 명확하지 않았습니다. 좌표는 모두 유한했고, 퇴화 삼각형이나 비다양체 에지도 없었습니다.
하지만 크롭을 직접 보면 문제는 꽤 명확합니다. 눈꺼풀 움직임을 만들어 줄 수 있는 표면의 상당 부분을 버린 뒤 눈꺼풀이 움직이기를 기대하고 있었던 것입니다.
두 번째 시도에서는 머리를 정면과 두 개의 사선 각도에서 렌더링했습니다. 저는 어시스턴트의 이미지 이해 기능을 활용해 눈의 개구부와 테두리, 입 경계선, 주둥이, 코, 눈썹, 수염의 위치를 표시했습니다. 그 윤곽선을 원본 메시에서 보이는 삼각형에 투영했습니다. 투영 정보와 삼각형 ID를 유지해 각 크롭에서 얼굴의 실제 구성 요소 중 어떤 부분이 남았는지 확인할 수 있었습니다.

눈에 보이는 삼각형 131개를 양쪽 눈 테두리에 속하는 것으로 표시했습니다. 첫 번째 크롭에는 그중 25개만 남아 있었습니다. 새 크롭에는 123개가 남았습니다. 입력 측면에서는 유용한 개선이지만, 이 수치는 독립적인 세그멘테이션 정확도가 아니라 저희가 직접 작성한 주석을 기준으로 측정한 보존율입니다.
정렬 방식도 변경했습니다. 이전 기준의 범위에 맞추는 대신, 서로 대응하는 얼굴 랜드마크를 사용해 균일한 스케일과 위치를 설정했습니다. 새 크롭에는 버텍스 586개와 삼각형 952개가 있었습니다. 여전히 틈과 열린 경계가 남아 있었습니다. 이번 작업은 새 눈꺼풀이나 입 내부를 만드는 것이 아니라 기존 지오메트리를 선택하는 방식이었기 때문입니다.
움직임은 늘었지만 늘어짐도 심해졌다
두 번째 실행에서도 동일한 가중치와 아홉 개의 표정 컨트롤을 사용했습니다. 이번에는 전체 움직임을 확인하고 싶어서 중립 상태에서 각 표정의 최대 강도 사이에 중간 강도를 렌더링한 다음 다시 중립 상태로 돌아오게 했습니다. 글 상단의 영상은 동일한 조명 아래에서 두 버전을 보여 줍니다.
눈은 여전히 열린 상태입니다. 턱 컨트롤은 주둥이 모양을 바꾸지만 입이 자연스럽게 벌어지지는 않습니다. 특히 입 오므리기처럼 일부 입 컨트롤은 이전보다 더 많이 움직이지만, 그 움직임과 함께 표면도 왜곡됩니다.
왜곡 정도를 수치화하기 위해 에지 길이를 확인했습니다. 캐릭터 메시의 모든 에지에 대해 표정 강도가 최대일 때의 길이를 중립 상태의 길이로 나눈 뒤, 길이가 두 배 넘게 늘어난 에지의 수를 셌습니다.
| 컨트롤 | 첫 번째 크롭: 2배를 초과한 에지 | 수정된 크롭: 2배를 초과한 에지 | 수정본의 최대 늘어짐 |
|---|---|---|---|
| 턱 벌리기 | 13 | 44 | 5.27× |
| 왼쪽 미소 | 0 | 30 | 5.53× |
| 입 오므리기 | 0 | 89 | 11.29× |
짧은 에지는 큰 비율이 나올 수 있으므로 이 수치만으로 얼굴 리그를 평가하지는 않을 것입니다. 하지만 이번에는 렌더링 결과와 일치합니다. 수정된 버전에서는 입이 더 많이 움직이고, 그 움직임 중 일부는 원치 않는 표면 늘어짐입니다.
저희는 크롭, 정렬, 바깥쪽 경계의 페이드라는 세 요소를 동시에 변경했습니다. 따라서 이 비교만으로는 각 아티팩트가 어떤 변경 때문에 발생했는지 알 수 없습니다. 다만 수정된 준비 과정 전체를 적용했음에도 이 캐릭터의 얼굴 문제가 해결되지 않았다는 점은 알 수 있습니다.
NFR을 사용한 이유
이 실험을 진행하기 전에 다른 구현체들도 살펴봤습니다. Google의 GNM Head는 정상적으로 로드됐고 자체 인간 머리 메시에서 표정을 생성했습니다. 하지만 그 표정을 생쥐에 적용하려면 별도의 피팅과 전이 단계가 필요했습니다. Example-Based Facial Rigging은 서로 대응하는 표정 예시가 필요했지만 저희 캐릭터에는 그런 데이터가 없었습니다.
RigAnyFace와 OmniFaceRig도 관련성이 있었지만, 2026년 9월 11일 기준으로 둘 다 저희가 실행할 수 있는 공개 추론 코드와 가중치를 찾지 못했습니다. OmniFaceRig의 데이터세트 링크에는 여전히 “출시 예정”이라고 적혀 있었습니다. NFR에는 공개된 체크포인트와 커스텀 메시를 위한 절차가 있었으므로 실제로 애니메이션이 적용된 생쥐까지 만들어 본 것은 NFR이었습니다.
이것은 동등한 조건에서 진행한 다섯 번의 비교 실험이 아닙니다. 저희는 자체 얼굴 표면으로 NFR을 테스트했고, GNM은 기본 제공 머리에서만 확인했으며, 나머지는 입력 조건이나 공개 여부의 한계 때문에 더 진행하지 못했습니다.
다음 시도에는 눈꺼풀이 필요하다
첫 번째 크롭은 좋지 않았고, 이를 수정한 것은 가치 있는 작업이었습니다. 하지만 눈 테두리를 보존하는 것만으로는 눈을 덮을 만큼 충분한 지오메트리나 적절한 움직임을 얻을 수 없습니다. 입에도 비슷한 문제가 있습니다. 주둥이를 잡아당길 수는 있지만, 이번 실험에서는 포즈에 필요한 입의 개구부와 내부를 만들지 않았습니다.
다음에는 눈 깜빡임 하나와 턱 벌리기 하나에 집중할 생각입니다. 눈을 덮으며 닫힐 수 있는 형태로 눈꺼풀을 만들고, 입술과 입 내부를 준비한 다음, 이 두 움직임에 맞는 보정 셰이프를 피팅하거나 직접 제작하는 것입니다. 나머지 컨트롤을 추가하기 전에 정면뿐 아니라 측면에서도 확인해야 합니다.
원시 예측 결과와 정확한 크롭을 포함해 두 번의 시도를 모두 보관했으므로, 이후 작업을 이번 결과와 비교할 수 있습니다. 현재 신체 리그와 애니메이션은 그대로 유지되어 있습니다. 얼굴 셰이프는 여전히 실험 단계이며, 완성된 캐릭터에는 사용하지 않을 것입니다.