내일배움캠프 124일차 - 최종프로젝트 13~14일차: 초상화(Portrait)를 구현하는 방법

초상화(Portrait)를 구현하는 방법

스타크래프트의 Marine의 초상화

RTS장르를 해봤다면 유닛을 선택하면 인터페이스 내에 해당 유닛의 얼굴이 출력되는 모습을 보았을 것이다. 이것을 초상화(포트레이트)라고 하는데, 언리얼 엔진에서 포트레이트를 구현하기 위해서는 몇 가지 기술이 필요하다.

보다 자연스러운 포트레이트 애니메이션을 만들기 위한 과정을 소개하도록 한다.

① SceneCapture2D 캡쳐를 위한 세트장 구현

현재 위치에서 동떨어진 장소를 실시간으로 표현할 수 있는 방법으로 포트레이트 구현에 안성맞춤이다. 이를 구현하기 위해 렌더타겟에 대해 어느정도 알아둬야 하지만 언리얼엔진에서는 렌더타겟을 구현하기 위한 과정을 간소화했으므로 방법은 한번 익혀두면 어렵지 않다.

1-1) 액터 블루프린트 구성

블루프린트 액터의 뷰포트 내부

포트레이트 영상으로 사용될 블루프린트 액터를 생성하고 그곳에 캐릭터와 배경역할을 하는 Skybox(※)와 바닥을 생성한다. 그리고 화면을 비쳐줄 카메라로는 SceneCaptureComponent2D를 사용한다. 이 카메라가 화면속 모습을 찍어 렌더타겟에 저장해줄 것이다.

※ Skybox : 월드를 감싸는 하늘을 담은 액터. [관련 링크: SkyBox를 제작하는 방법]

1-2) 액터 내 컴포넌트 설정

컴포넌트들 배치한 후에는 오류를 최소화하기 위해 다음과 같은 설정을 따르도록 한다.

1 - 씬 캡쳐에서만 표시

초상화 액터는 월드 상에 표시되질 원치 않으므로 메시, Skybox(※), 장식물 등 실체가 있는 컴포넌트들에게 bVisibleInSceneCaptureOnly = true 옵션을 붙여준다. 블루프린트에서 설정해도 된다.



2 - 콜리전 비활성화

마찬가지로 초상화 액터는 월드에 영향을 미치지 않아야 하므로 콜리전을 꺼둔다. 특히, SpringArm을 채용하고 있다면 bDoCollisionTest = false 옵션을 붙인다. 마찬가지로 블루프린트에서도 설정할 수 있다.



3 - 씬 캡쳐에서 해당 액터만 표시

씬 캡쳐는 기본적으로 월드상에 표시되는 모든 액터를 촬영한다. 본 액터만 촬영하기 위해서는 씬 캡쳐 컴포넌트의 PrimitiveRenderMode를 PRM_UseShowOnlyList로 전환하고, ShowOnlyActors에 자기자신을 등록해줘야 한다.

블루프린트에서는 다음과 같이 캡쳐대상을 설정해줄 수 있다.

4 - 씬 캡쳐 대상 필터링

UseShowOnlyList를 적용시켰다면 액터만 등장하지만, 그럼에도 월드의 배경이 되는 SkyAtmosphere등 환경요소는 사라지지 않는다.

SkyBox를 사용하고 있다면 월드 환경요소는 씬 캡쳐 렌더링에 낭비가 되므로 씬 캡쳐 컴포넌트의 ShowFlag등에서 체크를 해제하도록 하자. 하지만 SkyBox를 사용하지 않는다면 월드 환경요소를 체크한다.

(좌) SkyBox를 사용한 씬 캡쳐
(우) SkyBox를 사용하지 않은 씬 캡쳐

두 개의 씬 캡쳐를 배치한 모습이다. 별도의 하늘을 담은 SkyBox를 넣은 좌측 씬 캡쳐는 현재 월드와 다른 배경을 보여준다. 반면에 현재 월드의 하늘을 담은 우측 씬 캡쳐는 월드의 날씨를 실시간으로 반영한다.

씬 캡쳐 컴포넌트의 ShowFlag는 그 외에도 여러가지가 존재한다. 필요한 플래그와 그렇지 않은 플래그를 구분하면서 플래그를 설정해주자.

1-3) 액터 내 Skybox 머티리얼 구성

액터 내에 별도의 Skybox를 사용하고 있다면, 모든 포트레이트가 같은 Skybox 머티리얼을 돌려쓰는 것이 아니라면 별도의 작업이 필요하다.

Skybox제작방법에서 설명하였듯이, 해당 TIL에서는 Skybox 머티리얼을 엔진 내부의 M_Sky를 복제해와서 사용하고 있다. 해당 머티리얼은 [엔진]-[컨텐츠] 폴더 내에서 해당 이름을 검색하면 찾을 수 있다.

수정된 Skybox 머티리얼 구조

나는 기존 Skybox 머티리얼 구조를 따르되, 이대로 사용하기에는 불편한 부분이 존재해 약간의 수정을 거쳐 사용하고 있다.

위 사진처럼 수정을 거치고, 아래 생성자 구성에서 머티리얼에 필요한 값을 파라미터로 전달해준다.

1-4) 생성자 구성

생성자에서는 앞서 설명한 것처럼 씬 캡쳐에 보여질 대상(액터 자신)을 지정해준다.

추가적으로, Skybox는 MID(Material Instance Dynamic)을 만들어주지 않으면 파라미터값이 수정되지 않기 때문에 만들어준다.

1-3번에서 만들어진 Skybox 머티리얼에서는 다음 파라미터가 존재해 설정이 가능하다.

 - Skybox (타입: Texture): 하늘 텍스처를 설정한다. 노드에서는 큐브맵을 텍스처로 받고 있으므로 텍스처 큐브를 선택한다.

 - OffsetPos (타입: Vector): 이동 오프셋을 설정한다. Skybox 머티리얼에서는 원점을 드로잉 기준으로 보는 절대 월드좌표 노드를 사용하고 있으므로 포트레이트 액터가 원점에서 벗어나면 Skybox의 하늘위치가 이상해진다. 하늘이 액터 좌표를 따라갈 수 있게끔 Skybox의 월드 좌표를 전달해준다.

 - CubemapRotation(타입: Scalar): Yaw회전을 설정한다. Skybox 머티리얼의 절대 월드좌표 노드에 의해 회전값이 고정되어있으므로 Skybox 구를 회전시켜도 하늘이 돌지 않는다. 회전값을 반영하기 위해 Skybox의 월드Yaw값을 파라미터로 전달해준다.

여기까지 했으면 포트레이트 촬영을 위한 세트장이 완성된 것이다.

② 촬영된 화면을 TV처럼 투영해보기 (RenderTarget)

이제 TV처럼 사용될 메시나 위젯을 가져와서 특정 부분에 촬영화면을 가져와보도록 하자.

촬영을 위해서는 먼저 세트장을 가져올 필요가 있다. 준비한 세트장(액터), 필름(RenderTarget2D)을 가져와 세트장의 카메라 촬영화면을 필름의 텍스처 타깃으로 지정해 인화해준다.

필름을 붙일 모니터의 머티리얼을 만들어준다.

정말 TV처럼 활용될 액터라면 Surface 도메인을 유지하되, 광원의 영향을 받을지에 따라 Default Lit, Unlit을 골라준다.

UI에 사용될 액터라면 User Interface 도메인으로 지정해준다.

그리고 씬 캡쳐 필름이 들어갈 텍스처(Param2D)의 파라미터명을 지정해준다.

마지막으로 모니터가 될 메시의 머티리얼을 MID화 하고, 텍스처 파라미터에 필름을 넣어주면 끝이다.

③ 결과물


마치며

포트레이트 구현방법에는 렌더타겟 외에도 무비 렌더 큐를 이용한 렌더링 촬영을 통한 동영상을 제작 후 동영상째로 미디어 소스 파일로 만드는 방법도 있다. 렌더 타겟에 비해 비용이 적게 들지만 실시간 영상이 아닌 관계로 장면 전환 시 화면이 끊기는 부자연스러운 현상이 발생할 수 있다. 하지만 문서 최상단의 스타크래프트1 초상화처럼 고전적인 느낌을 살리고자 한다면 동영상 소스째로 포트레이트를 적용하는 법도 하나의 방법이 될 수 있겠다.

댓글

이 블로그의 인기 게시물

내일배움캠프 사전캠프 - 사전캠프설 연휴 커피 파밍 이벤트 작품 [ EXTREMITY ]

내일배움캠프 29일차 - 커리어데이 2일차 : 클라이언트 프로그래머로서 포트폴리오, 입사준비팁