본문 바로가기

IT_플밍

[UE4] 언리얼 엔진4를 이용하여 360 ° 동영상 만드는 법



시작하기

일본 쪽에서 찾은 정보인 언리얼 엔진4를 이용하여 360 ° 동영상 만드는 법을 공유합니다.


일본 글은 4.11버전을 기준으로 설명하지만 제 글에서는 언리얼 4.18.2 버전을 기준으로 합니다.


원본 링크


대략적인 흐름도

SceneCaptureCube를 사용하여 화면을 캡쳐하고 Matinee / Sequqncer에서 연속 이미지로 출력을 하는 방식입니다.

그리고 출력 결과물인 연속 이미지를 동영상 파일로 변환하여 Youtube 나 Facebook 에 업로드합니다.


SceneCaptureCube 설치

360 ° 의 Texture을 캡처하는 BluePrint(BP_360_Scene_Capture)을 작성하고 그 구성 요소로 SceneCaptureComponentCube을 추가합니다.














다음으로 캡처 이미지 렌더링을 위해 CubeRenderTarget이라는 Asset이 필요합니다.

아래 사진을 참고하여 콘텐츠 브라우저에서 작성하십시오.




















생성된 CubeRenderTarget 해상도 설정은 화면 비율 [2:1]로 고정 되고, Size X 값은 세로 길이입니다.
아래와 같이 2048로 설정 한 경우 렌더링 해상도는 4096 x 2048px 입니다.



















처음에 생성 한 BluePrint BP_360_Scene_Capture로 돌아갑니다. SceneCaptureComponentCube를 선택한 상태에서 Texture Target에 아까 생성한 CubeRenderTarget을 설정합니다.


* 연속 촬영을 하고자 하면...

위 SceneCaptureComponentCube의 Scene Capture 메뉴에 있는 "Capture Every Frame" 을 체크 합시다.















또한 연속 출력에 직접 사용하지 않지만 미리보기에 Camera 구성 요소를 추가합니다.



360 ° 연속 이미지 출력 설정

그럼, 다음에 캡처 된 결과를 연속 이미지로 출력하고 싶습니다. 하지만 몇 가지 문제가 있습니다.

- SceneCaptureCube에서 캡처 한 CubeRenderTarget 그대로는 연속 출력 할 수 없다.
- CubeRenderTarget은 HDR 때문에 톤 매핑 등 사후 처리가 비활성화 된 상태로 출력된다.
- SceneCaptureCube에서 Rotation 변경 못해 CubeRenderTarget는 월드 좌표로 -Y 방향에 정면으로 이미지가 렌더링된다.


이러한 문제를 해결하기 위해 새로운 이미지 렌더링 용 BluePrint를 만듭니다.












내용은 간단하고, 캡처 이미지를 Materials로 평면 Static Mesh에 붙여 버려, 렌더링 카메라의 표시 범위를 그 평면과 일치하도록 하는 것입니다.

그리고 Matinee / Sequencer에서 그 카메라 이미지를 렌더링 한다는 흐름입니다.



그럼 내용을 살펴 보자.

















먼저 CubeRenderTarget 화면 비율 [2:1]과 동일한 평면으로 전개 된 UV를 가진 StaticMesh Component를 추가합니다.

이 메쉬에 나중에 CubeRenderTarget을 텍스처로 사용 된 메테리얼을 할당합니다.















다음은 렌더링 용 Camera 구성 요소를 추가합니다.

Camera Setting 항목에서 "Projection Mode"를 "OrthoGraphic"로 변경하여 화각의 영향을 받지 않도록 합니다.
















또한 메테리얼에 CubeRenderTarget를 사용할 때의 주의점입니다.

아래 그림과 같이 메테리얼을 그대로 연결하면 오류가 발생합니다.
















그래서 Custom 노드를 사용하여 UV값을 가공합니다.


그리고 Custom 노드의 "Code"는

float2 Angles = float2(2 * PI * (UV.x + 0.5f), PI * UV.y);
float s = sin(Angles.y);
float3 Direction = float3(s * sin(Angles.x), cos(Angles.y), -s * cos(Angles.x));
return Direction.xzy;

입력합니다.




* 사용자 정의 노드의 코드와 워크 플로는 다음 포럼의 글을 참고 했습니다.

https://forums.unrealengine.com/development-discussion/rendering/40943-cuberendertarget-to-2d-texture?69824-cubeRenderTarget-to-2D-texture=


이제 "TextureCoordinate"노드에서 UV를 Custom 노드의 UV 입력에 연결하면 오류가 없습니다.


또한, Custom 노드에 연결 된 UV 값을 합산에서 "CubeRenderTarget"을 각 UV 방향으로 오프셋 할 수 있도록 "SceneCaptureCube"의 방향을 회전 시키는 방법으로 이용합니다.














그래서 처음에 만든 캡처 BluePrint의 Yaw 값과 연결하기 위하여 "TextureRotation"라는 Parameter를 만들었습니다.

이 Parameter를 캡처 용 BluePrint에서 Dynamic Material Instance를 만들고 업데이트하도록 하면 미리 결과를 쉽게 확인할 수 있습니다.














처음 캡처 BluePrint의 Event Graph에서 Tick 의해 취득한 Yaw 값을 저장하는 변수 "CaptureCameraYaw"를 제공합니다.













그리고 렌더링 용 BluePrint 개체 변수를 만들고 캡처용 BluePrint를 참조하십시오.















이제 준비는 끝났습니다.


렌더링 용 BluePrint에 있는 Camera를 사용하여 Matinee / Sequencer 에서 연속 이미지로 출력합니다.

이번에는 Matinee를 사용했습니다.
















설정이 끝난 Matinee를 종료한 후 다시 킵니다.

아래와 같은 다이얼로그가 뜨면 "Convert"를 클릭합니다.















잠시 기다리면 Sequencer 가 자동으로 열립니다.

인제 여러분의 360 동영상을 이 곳에서 뽑아내면 됩니다.














CubeRenderTarget에서 설정 한 해상도와 같은 4096x2048의 PNG 형식으로 연속 출력합니다.












그 후, 출력 된 연속 사진 편집 소프트웨어 나 컴포지트 소프트에서 동영상으로 변환합니다.


Youtube 업로드 관련은 https://support.google.com/youtube/answer/6178631?hl=ko 이 곳을 참조하세요.




결과물과 Tip


이렇게 간단하게 빠르게 360 ° 를 뽑을 수 있습니다.



* Tip

Matinee 의 "Play On Level Load" 를 체크시 설정 해둔 시간 동안의 360 ° 이미지를 빠르게 확인 할 수 있습니다.