iPhone X에서 얼굴 애니메이션 녹화하기

라이브 링크 페이스(Live Link Face) 앱, ARKit 및 라이브 링크(Live Link)를 사용하여 얼굴 애니메이션을 캡처하여 언리얼 엔진의 캐릭터에 적용합니다.

Choose your operating system:

Windows

macOS

Linux

Apple iPhone의 최신 모델은 사용자의 얼굴에서 50개 이상의 특정 근육의 위치, 해부학적 특성과 움직임을 구분하는 정교한 얼굴 인식 및 모션 트래킹 기능을 제공합니다. iPhone에 뎁스 카메라와 ARKit 기능이 탑재된 경우 에픽게임즈에서 무료로 제공하는 라이브 링크 페이스 앱을 사용하여 복합적인 얼굴 애니메이션을 휴대폰과 엔진에서 실시간으로 녹화하며 언리얼 엔진에서 3D 캐릭터로 구현할 수 있습니다.

이 페이지에서는 라이브 링크 페이스 앱을 사용하여 라이브 퍼포먼스를 3D 캐릭터의 얼굴에 적용하는 방법과 이를 통해 얼굴 캡처 시스템이 전체적인 프로덕션 촬영의 맥락에서 작동하도록 하는 방법에 대해 설명합니다.

라이브 링크 페이스는 에픽게임즈 런처의 학습 탭에 있는 페이스 AR 샘플(Face AR Sample) 에서 사용되는 것과 동일한 ARKit 기능을 사용합니다. 하지만 페이스 AR 샘플은 iOS용으로 컴파일해야 하며 이 경우 Mac 및 Apple 개발자 계정이 필요합니다. 라이브 링크 페이스 앱을 사용하면 모든 언리얼 엔진 프로젝트에서 올바르게 설정된 캐릭터로 즉시 얼굴 애니메이션을 적용할 수 있습니다.

전제조건:

  • 이 페이지의 머티리얼은 언리얼 엔진의 여러 툴과 기능 영역을 지칭합니다. 다음과 같은 머티리얼이 이미 익숙하다면 최상의 결과를 얻을 수 있습니다.

  • 뎁스 카메라와 ARKit가 둘 다 탑재되어 있는 iPhone 모델이 필요합니다. 이러한 기능은 일반적으로 iPhone X 이상 모델에 포함됩니다.

시작하기

이 섹션의 안내에 따라 언리얼 엔진 프로젝트를 설정, 라이브 링크 페이스 앱을 연결하고 앱으로 녹화되고 있는 데이터를 3D 캐릭터에 적용하세요.

  1. 프로젝트에 아래의 플러그인을 활성화합니다.

    • 라이브 링크

    • ARKit

    • ARKit Face Support

  2. ARKit의 얼굴 인식에 의해 생성된 얼굴 블렌드셰이프와 일치하는 블렌드셰이프 세트로 캐릭터를 설정해야 합니다. 일반적으로는 Autodesk Maya와 같은 타사 리깅 및 애니메이션 툴로 이를 수행한 다음 캐릭터를 언리얼 엔진으로 가져와야 합니다.

    캐릭터가 지원해야 하는 블렌드셰이프 목록은 Apple ARKit 자료 를 참조하세요.

    자체 캐릭터가 준비되지 않은 경우에는 에픽게임즈 런처 학습 탭의 페이스 AR 샘플 에 있는 소년을 사용할 수 있습니다.

    캐릭터의 블렌드셰이프는 ARKit 블렌드셰이프와 동일한 이름을 사용하지 않아도 됩니다. LiveLinkRemap 에셋에서 커스텀 블루프린트 함수를 생성하여 ARKit 블렌드셰이프 이름을 캐릭터가 사용하는 이름으로 변환할 수 있습니다. 지침을 보려면

    [페이스 AR 샘플 문서](SharingAndReleasing/XRDevelopment/AR/HandheldAR/FaceARSample)
    를 참조하세요. 하지만 최상의 결과를 위해서는 캐릭터의 얼굴 블렌드셰이프가 ARKit 블렌드셰이프와 동일한 얼굴 영역을 커버하도록 해야 합니다.

  3. 언리얼 엔진에서 Live Link Pose 노드를 포함하는 애니메이션 블루프린트를 사용하여 캐릭터를 설정합니다. 페이스 AR 샘플에 있는 소년의 애니메이션 블루프린트 예시입니다:

    애니메이션 블루프린트의 Live Link Pose 노드

    나중에 이 노드를 사용해 휴대폰에서 전송되는 애니메이션 데이터를 캐릭터에 적용하게 됩니다.

  4. 컴퓨터의 IP 주소를 가져옵니다. 이 주소는 라이브 링크 페이스 앱에 연결하는 데 필요합니다.

    일반적으로 IP 주소는 컴퓨터의 제어판이나 설정에서 찾을 수 있습니다. 또는, 대부분의 Windows 플랫폼에서는 ipconfig 명령줄 유틸리티를 사용할 수 있습니다.

    • 컴퓨터가 인터넷에 연결되어 있는 경우 네트워크 내에서만 표시되는 로컬 IP 주소, 그리고 개방형 인터넷에서 본인을 식별해주는 공용 IP 주소가 둘 다 있을 수도 있습니다. 그런 경우에는 로컬 IP 주소를 선택합니다. 로컬 IP 주소는 일반적으로 '10.' 또는 '192.168.'로 시작됩니다.

    • 또한 컴퓨터에 여러 어댑터에 대한 복수의 IP 주소가 설정되어 있을 수도 있습니다. 예를 들어 각각의 주소가 있는 유선 이더넷 어댑터와 무선 어댑터가 있을 수 있습니다. 컴퓨터에서 사용 중인 어댑터 중 iPhone과 같은 네트워크에 연결되어 있는 어댑터의 IP 주소를 선택해야 합니다.

  5. Apple App Store에서 에픽게임즈의 무료 앱인 라이브 링크 페이스 를 찾아서 휴대폰에 설치합니다.

    라이브 링크 페이스 아이콘

  6. 휴대폰을 컴퓨터와 동일한 무선 네트워크에 연결하거나, 이더넷 케이블을 사용하여 휴대폰을 컴퓨터에 직접 연결하고 이때 라이트닝 이더넷 어댑터를 사용합니다.

    라이브 링크를 사용하려면 네트워크 데이터 소스가 필요하므로 USB로 휴대폰을 컴퓨터에 연결하는 것은 적합하지 않습니다.

  7. iPhone에서 라이브 링크 페이스 앱을 실행합니다. 새 녹화를 시작할 수 있는 홈 화면에서 시작됩니다.

    프리뷰 메시(Preview Mesh) 세팅을 꺼서 오버레이를 비활성화하면 됩니다. 아래의 라이브 링크 페이스 앱 컨트롤

  8. 왼쪽 상단의 아이콘을 탭하여 앱 세팅을 엽니다. 적어도 라이브 링크(Live Link) 세팅에 들어가야만 컴퓨터에 연결이 가능합니다.

    라이브 링크 세팅 페이지에서 타깃 추가(Add Target) 를 탭하고 컴퓨터의 IP 주소를 입력합니다.

    애니메이션을 여러 개의 언리얼 에디터 인스턴스에 브로드캐스팅해야 하는 경우 여기서 여러 개의 IP 주소를 입력할 수 있습니다. 아래의 여러 사용자와 작업 섹션도 참조하세요.

    라이브 링크 페이스 앱에서 사용 가능한 기타 모든 세팅에 대한 자세한 내용은 아래 섹션을 참조하세요.

  9. 언리얼 에디터의 메인 메뉴에서 창(Window) > 라이브 링크(Live Link) 를 선택하여 라이브 링크 패널을 엽니다. 그러면 이제 iPhone이 서브젝트로 나열되어 있어야 합니다.

    라이브 링크 서브젝트

  10. 캐릭터의 애니메이션 그래프에서 Live LinkPose 노드를 찾아 해당 서브젝트를 iPhone을 나타내는 서브젝트로 설정합니다.

    Live Link Pose 노드 및 서브젝트

  11. 애니메이션 블루프린트를 컴파일 하고 저장 합니다.

  12. 캐릭터를 선택합니다. 디테일 패널에서 스켈레탈 메시(Skeletal Mesh) 카테고리의 에디터에서 애니메이션 업데이트(Update Animation in Editor) 세팅이 활성화되어 있는지 확인합니다.

    에디터에서 애니메이션 업데이트

  13. 라이브 링크 페이스로 돌아와서 앱이 얼굴을 인식하고 얼굴 움직임 트래킹을 시작할 수 있도록 휴대폰의 카메라를 자신의 얼굴로 향합니다.

    이 시점에서 언리얼 에디터의 캐릭터가 사용자 얼굴과 움직임에 따라 실시간으로 움직이는 모습을 확인할 수 있어야 합니다.

  14. 퍼포먼스를 녹화할 준비가 되면 라이브 링크 페이스 앱에서 빨간색 녹화(Record) 버튼을 탭합니다. 그러면 iPhone에서 퍼포먼스가 녹화되기 시작하고 언리얼 에디터에서는 테이크 레코더도 실행되어 엔진의 캐릭터 애니메이션 데이터를 녹화하기 시작합니다.

    녹화 버튼을 다시 탭하면 테이크가 중지됩니다.

라이브 링크 페이스 앱 컨트롤

라이브 링크 페이스 앱의 홈 화면에서는 다음과 같은 컨트롤을 제공합니다.

1

세팅(Settings) 대화 상자를 엽니다.

2

모든 라이브링크(LiveLink) 타깃에 얼굴 애니메이션 데이터를 전송하는 것을 켜고 끕니다. 녹색으로 표시되고 있으면 앱에서 애니메이션을 전송하고 있다는 의미입니다.

라이브 상태에서는 앱 세팅에서 설정된 타임코드 소스로부터 현재 타임코드 값을 읽어 표시합니다.

3

비디오 디스플레이 및 얼굴 추적을 켜고 끕니다.

4

새로운 테이크의 녹화를 시작 및 정지합니다.

5

앱에서 이전에 녹화한 테이크 목록을 엽니다.

6

현재의 슬레이트 및 테이크, 그리고 라이브 링크 서브젝트 이름을 표시합니다. 탭하여 현재 슬레이트의 이름을 변경하거나 테이크 번호를 변경할 수 있습니다.

7

녹색으로 표시되고 있으면 ARKit 얼굴 캡처 시스템이 현재의 카메라 뷰에서 얼굴을 성공적으로 감지하였음을 의미합니다.

라이브 링크 페이스 앱 세팅

홈 화면 왼쪽 상단의 아이콘을 탭하여 세팅 페이지로 이동합니다. 여기서는 앱 동작을 설정할 수 있습니다.

세팅

설명

라이브링크(LiveLink)

언리얼 엔진을 실행 중인 컴퓨터에 연결되도록 앱을 설정합니다. 그러면 앱이 라이브 링크를 통해 애니메이션 데이터를 전송하고 녹화를 제어할 수 있습니다.

타임코드(Timecode)

라이브 링크 페이스 앱의 타임코드 소스를 설정합니다. 자세한 내용은 TODO:link를 참조하세요.

OSC

라이브 링크 페이스 앱과 외부 OSC 컨트롤러 및 디바이스 간의 연결을 설정합니다. 자세한 내용은 아래의 OSC를 통한 라이브 링크 페이스 제어 를 참조하세요.

머리 위치 전송(Stream Head Rotation)

앱이 라이브 링크 연결을 통해 ARKit에서 머리 회전(yaw/pitch/roll) 데이터를 전송하도록 할지 설정합니다.

이 옵션은 휴대폰을 고정된 삼각대에 설치하고 라이브 링크 페이스 앱을 사용하여 휴대폰에 보여지는 사용자 머리의 위아래 그리고 양옆 움직임을 따라 버추얼 캐릭터의 머리가 움직이도록 하려는 경우에 유용합니다.

라이브 링크 페이스 앱을 바디 모션 캡처 셋업과 함께 사용하는 경우에는 이 설정이 필요하지 않을 수 있습니다. 대신에, 일반적으로 iPhone이 항상 얼굴 정면에 위치하도록 커스텀 헬멧을 사용하여 iPhone을 머리에 장착하고 바디 모션 캡처 시스템이 머리의 위아래 및 양옆 움직임을 녹화하도록 합니다.

프리뷰 메시(Preview mesh)

홈 화면에서 ARKit 얼굴 인식 시스템에 의해 생성된 트라이앵글 메시로 카메라 사진을 오버레이할지 결정합니다.

녹화(Record) 버튼

홈 화면에 빨간색 녹화 버튼을 표시할지 결정합니다.

외부 OSC 디바이스에서 녹화를 제어하는 경우 액터가 실수로 휴대폰의 녹화 버튼을 누르는 상황을 방지하기 위해 이 옵션을 비활성화할 수 있습니다.

블렌드셰이프 데이터(Blendshape data)

모든 얼굴 블렌드셰이프에 대해 ARKit 얼굴 인식 시스템에 의해 생성되고 있는 데이터 값을 홈 화면에 표시할지 결정합니다. 이 정보는 보통 디버깅 용도에 관련된 경우에 유용합니다.

테이크 레코더(Take Recorder)

현재의 슬레이트 이름과 테이크 번호 또는 현재의 녹화에 사용할 파일 이름을 홈 화면에 표시할지 결정합니다.

오버레이(Overlay)

라이브 링크 페이스 앱의 기본 화면을 항상 표시할지, 아니면 터치스크린 상호작용이 있을 때까지 페이드아웃 처리할지 결정합니다.

오버레이를 페이드아웃 처리하면 액터가 캡처된 비디오에만 집중하여 퍼포먼스 중 더 몰입할 수 있게 합니다.

비디오 퀄리티(Video Quality)

레퍼런스 비디오를 인코딩하는 데 사용되는 JPEG 압축 퀄리티를 결정합니다. 퀄리티가 높을수록 이미지가 더 선명하지만 그만큼 iPhone에서 차지하는 저장 공간도 늘어나게 됩니다.

스토리지(Storage)

디바이스의 여유 공간, 그리고 라이브 링크 페이스에 의해 사용되고 있는 공간을 표시합니다. 이 화면을 통해 이전에 녹화한 테이크를 삭제할 수도 있습니다.

재설정(Reset)

라이브 링크 페이스 앱을 초기화하여 앱 설치 이후에 변경한 모든 세팅을 취소할 수 있습니다.

정보(About)

앱에 대한 법적 정보를 표시합니다.

원본 얼굴 녹화

라이브 링크 페이스 앱에서 새로 녹화를 시작할 때마다 캡처는 iPhone에서 두 개의 파일로 녹화됩니다.

  • '.mov' 파일에는 카메라에 의해 녹화된 레퍼런스 비디오가 포함됩니다.

    비디오 프레임은 JPEG 코덱을 사용하여 압축되지만 일시적 압축 없이 프레임이 정확합니다. 이 파일에는 오디오 및 타임코드가 포함되며 녹화 후에 애니메이션 퍼포먼스를 작업해야 할 수도 있는 애니메이터를 위한 레퍼런스 용도로 사용됩니다.

  • '.csv' 파일에는 녹화 도중 ARKit에 의해 캡처된 원본 애니메이션 데이터가 포함됩니다.

    이 데이터 파일은 현재 언리얼 엔진 또는 라이브 링크 페이스 앱에 의해 사용되지 않고 있습니다. 하지만 이 파일의 원본 데이터는 얼굴 캡처에 관한 추가 툴을 개발하고자 하는 개발자에게 유용할 수도 있습니다.

녹화 모드 및 결과

iPhone의 라이브 링크 페이스 앱에서 또는 라이브 링크 페이스 앱의 OSC 인터페이스를 통해 녹화를 시작할 때마다 이전 섹션에서 설명한 것처럼 퍼포먼스가 휴대폰에 녹화됩니다. 언리얼 엔진의 인스턴스에 연결되어 있지 않은 상태에서도 이러한 방식으로 녹화가 가능합니다.

라이브 링크 페이스 앱에서 또는 OSC 인터페이스를 통해 녹화를 시작하는 시점에 라이브 링크를 통해 언리얼 엔진의 인스턴스에 연결되어 있으면 언리얼 엔진의 모든 연결된 인스턴스에 대해 테이크 레코더 역시 실행됩니다. 애니메이션 퍼포먼스가 iPhone, 그리고 컴퓨터의 테이크 레코더 둘 다에서 녹화됩니다.

라이브 링크를 통해 언리얼 엔진의 인스턴스 하나 이상에 연결되어 있고 iPhone 또는 OSC 인터페이스에서 녹화를 시작하는 대신 언리얼 에디터 인터페이스의 테이크 레코더에서 녹화를 시작하는 경우에는 퍼포먼스가 iPhone에 저장되지 않습니다 . 컴퓨터의 테이크 레코더에만 퍼포먼스가 녹화됩니다.

여러 사용자와 작업

좀 더 복잡하고 현실적인 프로덕션 맥락에서는 여러 작업자가 언리얼 엔진에서 동시에 작업하며 멀티 유저 편집 을 사용하여 동일한 가상 환경에서 실시간으로 협업할 수 있습니다. 이러한 경우에는 모든 작업자가 실행하는 모든 언리얼 엔진 인스턴스에 연결되도록 라이브 링크 페이스 앱을 설정하는 것이 좋습니다. 그러면 앱이 퍼포먼스 캡처를 모든 엔진 인스턴스에 멀티캐스트합니다. 이 경우 모든 작업자가 지연시간이 최소화된 상태로 인입되는 애니메이션 데이터를 확인할 수 있습니다.

타임코드 소스

실제 프로덕션에서는 라이브 링크 페이스가 훨씬 더 큰 퍼포먼스 캡처 셋업의 일부일 가능성이 높습니다. 따라서 오디오, 라이브 비디오, 기타 바디 캡처 데이터, 카메라 트래킹 데이터 등과 같은 다른 요소를 동시에 녹화해야 할 가능성이 높습니다. 이러한 별개의 녹화를 완벽한 정확도로 동기화할 수 있으려면 모든 녹화에서 일관된 타임코드 값을 포함하도록 해야 합니다.

라이브 링크 페이스는 타임코드 소스를 위한 세 가지 옵션을 제공하며, 이러한 옵션은 세팅 패널에서 설정할 수 있습니다.

  • 시스템 타이머(System Timer)

    기본적으로 라이브 링크 페이스의 타임코드 값은 iPhone의 시스템 타이머를 기반으로 합니다. 이 타이머는 마지막 시스템 재부팅 이후 경과된 시간을 기준으로 합니다. 이는 자체적으로 정확한 기본 옵션을 제공하지만 이 타임코드를 다른 디바이스에서 이루어진 녹화에 연결하기는 쉽지 않을 수 있습니다.

  • NTP 서버(NTP Server)

    현재 시간에 따라 일관된 타임코드를 얻을 수 있는 한 가지 방법은 NTP(Network Time Protocol)를 통해 시간 값을 제공하는 서버에 의존하는 것입니다. 이 옵션을 선택했을 경우의 기본 서버는 time.apple.com 이며 이는 Apple이 iPhone의 현재 시간을 동기화하기 위해 사용하는 것과 동일한 서버입니다. 하지만 다수의 프로덕션에서 스테이징 디바이스의 타임코드 동기화를 위해 사용하는 커스텀 NTP 서버를 사용하면 서버 이름과 IP 주소를 입력할 수 있습니다.

  • Tentacle Sync

    Tentacle Sync는 블루투스를 통해 디바이스가 스테이징 마스터 클럭과 동기화할 수 있게 해주는 타사 하드웨어 디바이스입니다. 이는 가장 전문적인 타임코드 옵션이며 최첨단 프로덕션은 보통 촬영 중 타임코드 동기화를 위해 마스터 클럭을 사용합니다. 자세한 내용은 Tentacle Sync 를 참조하세요.

OSC를 통한 라이브 링크 페이스 제어

라이브 링크 페이스 앱은 Open Sound Control (OSC) 프로토콜을 통한 양방향 통신을 지원합니다.

  • OSC 디바이스를 사용하여 라이브 링크 페이스를 원격으로 제어할 수 있습니다. 예를 들면 외부 디바이스를 사용하여 앱 녹화를 원격으로 시작할 수 있습니다.

  • 또한 라이브 링크 페이스 활동에 관한 알림을 다른 OSC 디바이스로 전송하도록 설정할 수도 있습니다. 예를 들면 앱이 새로 녹화를 시작할 때마다 다른 디바이스에서 액션을 트리거할 수 있습니다.

OSC를 설정하려면 앱 세팅을 엽니다.

  • 리스너(Listener) 섹션에는 iPhone의 현재 IP 주소, 그리고 들어오는 OSC 메시지와 관련하여 라이브 링크 페이스 앱이 수신 중인 포트가 표시됩니다. OSC 원격 제어 디바이스가 이 IP 주소 및 포트로 명령을 전송하도록 해야 합니다.

  • 라이브 링크 페이스에서 OSC 명령을 전송하여 다른 디바이스를 제어하도록 하려면 타깃 섹션에서 해당 디바이스의 IP 주소와 포트를 입력하세요.

라이브 링크 페이스 앱은 다음 OSC 명령을 지원합니다.

명령

설명

/OSCSetSendTarget <IP:string> <port:int32>

OSC 전송 타깃을 지정한 IP 주소 및 포트로 설정합니다. 앱은 '/OSCSetSendTargetConfirm' 명령으로 새로운 OSC 전송 타깃에 회신합니다.

/AddLiveLinkAddress <IP:string> <port:int32>

앱이 블렌드셰이프 데이터를 브로드캐스트하도록 새 라이브 링크 타깃을 추가합니다.

/ClearAllLiveLinkAddresses

모든 라이브 링크 타깃을 제거합니다.

/LiveLinkSubject <name:string>

라이브 링크 서브젝트 이름을 설정합니다.

/LiveLinkStreamStart

모든 라이브 링크 타깃에 대한 데이터 스트리밍을 시작합니다.

/LiveLinkStreamStop

라이브 링크 타깃에 대한 데이터 스트리밍을 중지합니다.

/BatteryQuery

디바이스의 배터리 잔량을 요청합니다. 앱은 '/Battery '로 OSC 전송 타깃에 회신합니다.

/ThermalsQuery

디바이스의 온도 상태를 요청합니다. 앱은 '/Thermals '로 OSC 전송 타깃에 회신합니다.

/Slate <name:string>

슬레이트를 지정한 이름으로 설정합니다.

/Take <number:int32>

테이크 번호를 지정한 값으로 설정합니다.

/ARSessionStart

비디오 및 AR 트래킹을 켭니다. 앱은 '/ARSessionStartConfirm'으로 OSC 전송 타깃에 회신합니다.

/ARSessionStop

비디오 및 AR 트래킹을 끕니다. 앱은 '/ARSessionStopConfirm'으로 OSC 전송 타깃에 회신합니다.

/RecordStart <slate:string> <take:int32>

지정한 슬레이트 및 테이크 번호로 녹화를 시작합니다. 앱은 '/RecordStartConfirm '으로 OSC 전송 타깃에 회신합니다. 이 경우 타임코드는 항상 '00:00:00.000'입니다.

/RecordStop

녹화를 중지합니다. 앱은 '/RecordStopConfirm '으로 OSC 전송 타깃에 회신합니다. 아래의 '/Transport' 명령의의 두 개의 문자열을 사용하여 디바이스의 데이터를 복사할 수 있습니다.

/Transport <IP:port:string> <path:string>

위의 '/RecordStopConfirm' 명령에 의해 반환된 경로를 사용하여 앱이 파일의 콘텐츠를 지정한 IP 주소 및 포트로 전송하도록 요청합니다. 앱은 해당 주소 및 포트에 대한 TCP 연결을 엽니다. 먼저 빅 엔디언 형식으로 파일의 총 크기가 포함된 'int32'를 전송한 다음 파일의 콘텐츠를 전송합니다.

/VideoDisplayOn

비디오 디스플레이를 켭니다.

/VideoDisplayOff

비디오 디스플레이를 끕니다. 트래킹 및 녹화는 계속 진행될 수 있습니다.

/AppActivated

휴대폰에서 앱이 활성화되면 앱에서 이를 OSC 전송 타깃으로 전송합니다. 즉, 처음에 시작되었을 때, 포그라운드로 가져왔을 때 등입니다.

/AppDeactivated

휴대폰에서 앱이 비활성화되면 앱에서 이를 OSC 전송 타깃으로 전송합니다. 즉, 종료되었을 때, 백그라운드로 보내졌을 때 등입니다.

언리얼 엔진 문서의 미래를 함께 만들어주세요! 더 나은 서비스를 제공할 수 있도록 문서 사용에 대한 피드백을 주세요.
설문조사에 참여해 주세요
취소