2016-9-21

Illusion Ray 스튜디오가 언리얼 엔진 4로 3D 영화와 가상현실을 만드는 비법

By Lucas Smaga와 Dominik Sojka,

안녕하세요, 제 이름은 루카스 스마가(Lucas Smaga)입니다. 저는 폴란드의 영상물 제작사 일루전 레이(Illusion Ray)의 창립자이며, 그 전에도 비슷한 회사 Platige Image나 Fuero Games에서도 일해본 경력이 있습니다. 저는 오늘 저희 개발사의 아트 디렉터 도미닉 소이카(Dominik Sojka)와 함께 저희가 언리얼 엔진 4를 활용해 3D 영화나 가상현실을 만드는 노하우를 여러분들과 나누게 되어 너무나 기쁩니다. 

도미닉과 저는 오랫동안 게임과 영화 업계에서 일해왔습니다. 저희 개발사가 처음으로 만든 가상현실 어드벤쳐 체험은 Dino Safari로, 이 프로젝트는 처음엔 오큘러스 리프트 DK1 플랫폼에 맞추어 UDK(Unreal Development Kit)으로 개발중이었습니다. 언리얼 엔진 4가 출시되자, 저희는 이 영화를 새 엔진으로 확장시키려는 생각을 가지고 가상현실 영화의 세계로 발을 뻗었습니다. 저희는 지금까지 5편의 가상현실 영화(Dino Safari, Motoride, Afterlife, The Colossus and SolarSystem)를 제작했으며, Pirates 3D라는 제목의 입체영화도 제작했습니다. 또한 현재는 사일런트 힐 PT의 분위기에서 아이디어를 얻어, 포토그라메트리(photogrammetry)를 응용한 새로운 게임을 만들고 있기도 합니다.

IllusionRay_Pipeline-770x433-73f0f1783ffa9bf1526f0bbe74a9e9af7d064983

파이프라인

프로젝트마다 세부사항이 조금씩 달라지기는 하지만, 전체적인 파이프라인은 대부분 아래에서 제시한 것과 크게 다르지 않습니다. 단 이 타임라인은 영화 전체의 제작 뿐만 아니라 씬 하나 하나의 촬영에도 적용할 수 있다는 사실을 명심하십시오. 저희는 아래에서 설명드릴 파이프라인을 통해 Solar System 프로젝트를 완성했습니다. 이 프로젝트는 지난 여름에 폴란드 7Dmax cinema에서 상영했으며, 각 장면과 행성들은 각각 따로 제작하였습니다.

스크립트와 작업방식

일단 제일 처음 할 일은 만들고 싶은 장르와 작품의 전체적인 분위기를 선택하는 일입니다. 그런 다음에 보다 구체적인 콘텐츠나 스크립트를 구상하여 각 씬의 순서나 내용, 그리고 시간은 얼마씩 분배할 것인지 등을 결정하죠. 저희들이 만드는 영화는 길어야 10분을 넘어가지 않기 때문에 각 씬에 들어가는 시간을 아주 신중하게 나눠주어야 합니다. 새로운 프로젝트를 시작할 때마다 저희는 핀터레스트(Pinterest) 앨범을 새로 만들어, 괜찮은 인상의 이미지나 머릿속에 떠오르는 아이디어들을 따로 모아놓습니다. 하지만 일을 좀 더 체계적으로 계획하기 위해서는 트렐로(Trello)를 활용해서 앞으로 어떤 작업을 해야 하는지, 또 어떤 작업을 언제까지 끝내야 하는지 보다 정확하게 결정해놓습니다. 프로젝트의 종류를 막론하고 어지간하면 마감시간을 설정해놓는 것이 좋습니다. 안그랬다간 시간은 흘러가는데 일은 전혀 끝나지 않거든요. 구체적인 스케줄을 세워놓는 것은 프로젝트를 완성시켜줄 뿐더러, 제작 과정을 끊임없이 분석해 프로젝트에 살을 붙여주는 데에도 도움이 됩니다. 당연한 얘기죠? 사실 게임이든 영화든 뭘 만들던 간에, 마감 시간은 반드시 필요합니다.

블록아웃

장면별 블록아웃은 3D 소프트웨어로 만든 다음, 언리얼 엔진으로 임포트합니다. 메시 콜리전은 “use complex collision as simple” 옵션을 체크합니다. 그런 다음 가상현실 내에서 크기와 비율이 잘 맞는지 확인하죠. 팁: 연결 통로(corridors and passageways)는 실제보다 살짝 크게 만드는 편이 좋습니다.

애니매틱

파이프라인에서 가장 중요한 부분이라고 할 수 있습니다. 바로 영화를 애니매틱으로 구성하는 것이죠. 이 단계에서는 카메라와 캐릭터, 오브젝트 애니메이션의 기본적인 움직임을 만들어야 합니다. 또한 블록아웃도 어느 정도 조정해야죠. 대부분의 경우 카메라의 움직임은 언리얼 엔진이 아닌 툴로 만드는데, 이는 저희가 카메라의 애니메이션이 스플라인을 따라가도록 만들기 때문입니다(“Camera Rig Rail” 기능은 시퀀서(Sequencer)에서 처음 나오긴 했지만, 저희는 주로 마티네(Matinee)를 사용합니다). 이 단계에서는 카메라의 타이밍이 가장 중요합니다.

준비가 끝난 뒤에는, 애니매틱을 카메라와 함께 언리얼 엔진 4로 옮겨 가상현실 속에서 테스트해봅니다. 이 부분에서 굉장히 중요한 점은 바로 “카메라의 느낌”인데, 시점의 속도가 적절한지, 또 시청자에게 멀미나 어지러움을 유발하지는 않는지 등을 확인하는 것입니다. 이 단계에서는 정말 많은 수정이 이루어집니다. 일단 테스트해보고, 고치고, 다시 돌아가서 테스트해보고, 고치는 방식으로 말이죠.

애니매틱에는 실제 씬 속에 얼마나 많은 정보를 더 담아내어야 하는지 분명하게 기록해두어야 합니다. 가령 이 부분에서는 카메라가 잠시 멈춰 특정한 오브젝트를 더 가까운 거리에서 보여주어야 한다, 하는 식으로 말이죠. 궁극적으로 이는 모델에도 영향을 주게 됩니다. 애니매틱은 이후의 제작 과정에서 어떤 모델을 더 자세히 묘사해야 하고,  또 어떤 모델을 좀 덜 묘사해도 되는지 구별하는 기준이 되어줍니다.

IllusionRay_MainModelsAndBasicLights-770x415-53e2dc656165e7393afa8c0a46d3a8967d66c889

메인 모델과 기본 라이팅

이제 본격적으로 재미있는 과정입니다. 이번 단계에서는 기본적인 3D 오브젝트들을 모델링하기 시작해요. 요약하자면 이제 블록아웃 전체를 벽, 인테리어, 빌딩, 아이템이나 기타 3D 모델로 채운다는 의미죠.

IllusionRay_Pic3-770x722-e73202f547455ccc8fb07321766d529f29981c0e

다음은 이 모든 요소들을 언리얼 엔진에 집어넣고 기본 라이팅과 페어런트 셰이더를 적용해줍니다. 캐릭터와 애니메이션은 기본적인 애니매틱스와 미리 논의된 스크립트 및 가이드라인에 맞추어 만들어줍니다.

IllusionRay_Lighting-770x722-dd4193217cdaae505d9da0ba02685507ffea24ac  

라이팅

저희는 최적화를 생각해서 일반적으로 베이크드 라이트를 사용합니다. 저희같은 경우에는 주로 “다이내믹 섀도우”를 비활성화한 상태(물론 필요가 없을 때만 끕니다만)로 스테이셔너리 라이트를 사용합니다. 이러면 스태틱 라이팅에 비해 훨씬 괜찮은 반사 효과가 나오거든요. 주의: “스테이셔너리 라이트”는 머티리얼의 4 RGBA 채널때문에 한 공간 내에 최대 4개까지만 사용할 수 있습니다. 그렇기 때문에 이걸 사용하려면 조명을 어디에 배치해야 할지 아주 신중하게 생각해야 합니다. 또 저희는 스태틱 라이팅도 아주 미약한 강도로 설정해놓고 사용하는 경우가 많은데요, roughness option은 1로 맞춰놓아야 완벽한 GI(글로벌 일루미네이션) 시뮬레이션이 나오게 됩니다(이래야 라이트가 오브젝트에 반사되어 아무렇게나 퍼지지 않습니다). 또한 대부분의 라이트들은 라이트 프로파일을 따로 사용해, 보기도 좋고 실감도 나는 페이드 효과를 냅니다. 저희는 지금까지 Koola가 사용하는 방법(흰색 평면에 스포트라이트로 비춘 라이트를 굽는 방법입니다)을 썼습니다. 4.11 이전 버전 엔진에서 만들었던 영화들에는 포탈 라이트를 전혀 사용하지 않았어요.

분위기와 마무리 작업:

기본 환경을 준비해 놓은 다음에는 소품을 배치합니다. 소품들은 카메라의 움직임에 맞춰서 만들기 때문에, 각 비디오 프레임은 적절한 비중을 갖도록 구성됩니다. 이 과정은 기본적인 효과 부가나 LUT를 포함한 전체적인 포스트 프로세스 작업 후에 따라오는 과정입니다. 그리고 각 씬과 룸의 상황에 맞춰서 씬의 분위기를 조금씩 바꾸는 등의 포스트 프로세스 작업을 더합니다. 이 단계에서 우리는 각 씬에서 사용할 파티클도 제작합니다.

IllusionRay_MatineeSoundsandCamera-770x415-952c77750a15b16dd536abaa1f84060f687c23fd  

마티네, 음향, 카메라:

영화 제작의 마지막 과정에 있어서 아주 중요한 부분입니다. 이 과정에서 오브젝트 전부(문, 창문, 파티클, 스켈레탈 메시 애니메이션, 라이트 변화, 포스트 프로세스 애니메이션 등등.)에 애니메이션을 부여할 겁니다. 여기서는 메인 카메라에 두번째 카메라까지 플러그인해서 사용합니다. 두번째 카메라에는 오브젝트의 진동처럼 다른 미세한 움직임들에 대한 정보를 기록할 겁니다. 씬이나 시퀀스의 연결, 타이밍처럼 큰 규모의 변화가 아닌 카메라 미세 조정 작업은 모두 이 단계에서 이루어집니다.

음향은 이 단계 마지막에 추가됩니다. 일부 효과는 (블루 프린트를 통해) 트리거로 작동되거나 (배경음악의 경우)마티니로 작동하며, 다른 음향의 경우에는 애니메이션의 스켈레탈 메시에 연결해 놓습니다.(명심해 둘 것).

IllusionRay_Optimization-770x415-1089027b3e4623c00d3644729868aa4f138cc443

저희는 벌써 몇 년동안이나 마티니를 활용해서 이 작업을 수행해왔고, 여러분도 새 시퀀서 영상 편집기를 사용한다면 이 작업을 굉장히 간단하게 끝낼 수 있습니다.

최적화:

일단 최적화 목표는 GTX 970 수준입니다. 단 1초라도 프레임이 90 이하로 떨어지면 안됩니다. 그랬다간 잔상이나 지연 효과로 인해 시청자에게 불쾌감을 끼칠 수 있습니다(90프레임과 89프레임의 차이도 충분히 느껴집니다).

모델에서 필요없는 머티리얼들을 최대한 제거하는 것도 최적화 작업에 큰 도움이 됩니다. 하지만 어지간하면 이미지의 퀄리티를 최대한 떨어뜨리지 않는 방향으로 작업을 해야 합니다. 여기에 “Cull Distance Volumes”까지 추가합니다. 하지만 기준은 GPU와 CPU 프로파일러를 사용해야 합니다. 그래야 어디서 병목 현상이 발생하는지 찾기가 쉽거든요.

저희 프로젝트는 최대한 많은 레벨들로 나누어 놓았습니다. 이 레벨들은 실행이 시작되자마자 로딩을 시작해, 출력이 필요해질 때까지는 숨겨져 있는 상태입니다. 또한 가까운 거리에 올 경우에는 자동으로 오브젝트의 가시성을 제한하여 투명화하도록 설정하기도 합니다. (“Camera Distance Fade” 기능을 사용하면 됩니다). 가장 중요한 점은 “스켈레탈 메시”의 다이내믹 섀도우를 줄이는 것인데, 이 부분이 프레임 드랍에 가장 큰 영향을 주기 때문입니다.

물론 모델 뿐만 아니라 파티클에도 Level of detail 옵션을 사용하시는 것이 좋습니다. 

만약 최적화가 끝난 다음에도 프레임이 남아돈다면, “화면 비율”를 100 이상으로 맞춰 볼 수도 있습니다. 이 경우 Temporary AA를 이미지 해상도에 한정시키기 때문에, 전체 이미지를 훨씬 또렷하게 만들어줍니다.


팁과 꼼수

이제 (거의) 끝났으니, 실전에서 유용하게 쓸만한 팁들을 좀 소개해드리죠.

APEX CLOTH 기능

Apex는 옷 뿐만 아니라 털이나 날아다니는 쓰레기, 커튼 등에도 유용하게 쓸 수 있습니다.

시뮬레이션을 언리얼 엔진으로 이식

시뮬레이션을 다른 3D 소프트웨어로 옮기려면, 제일 먼저 트랜스포메이션을 굽고 애니메이션을 부여한 오브젝트들을 전부 bones/null/dummy에 페어런트한 다음, 이걸 스켈레탈 메시로 다시 내보내야 합니다. 아주 구체적인 파티클을 만들고 이걸 planes으로 대체한 다음, 애니메이션 전부를 똑같은 방법으로 내보내는 것만으로도 굉장히 흥미로운 효과를 만들어낼 수 있다는 점을 명심하십시오.

언리얼 엔진은 사용자들에게 animated blendshapes (morphs)를 불러와 쓸 수 있는 기능을 제공합니다. 꼭 기억하세요.

 

 

머티리얼에 애니메이션 넣기
언리얼 엔진이 마티네나 시퀀서로 머티리얼 오브젝트에 애니메이션 효과를 부가할 수 있다는 점도 짚고 넘어가야겠군요. 이런 방법을 통해 여러분은 “World Position Offset”을 사용하거나 Dissolve를 새로 만들어 아주 흥미로운 효과를 넣을 수 있습니다.

IllusionRay_AnimatingMaterials-770x415-3f08aa1bd49e4b23d24843b78e6dcd00db48fc03

근육 시스템
근육 시스템을 언리얼 엔진에 익스포트 하려면, 먼저 만들어둔 근육 시스템의 버텍스에 "constrains"를 써서 스킨을 씌운 뼈대를 추가할 수 있습니다. 그 다음은 이 뼈들을 모든 프레임에 맞춰 일일이 구운 다음에 언리얼 엔진 4로 익스포트하면 됩니다.

어지간하면 텍스처 타일링은 피할 것
타일링은 종종 의도보다 넓은 범위에 걸쳐 나타날 수가 있습니다. “Detail textures”를 추가해 다른 종류의 머티리얼로 일부를 칠하는 것이 일반적인 방법이지만, 디스턴스(PixelDepth)에 비례하여 타일링을 조금씩 수정하는 것도 실용적인 방법이 될 수 있습니다. 텍스처를 복제한 다음, 타일링을 줄이면서 회전시키십시오. 그런 다음 이걸 Perlin 노이즈를 마스크로 사용해 메인 텍스처와 연결하십시오. 또한 이 방법 외에도 다른 머티리얼을 가파른 터레인(업워드 벡터나 버텍스 벡터 등)의 dot product에 추가하는 것도 좋은 방법입니다. (VertexNormalWS dot 0.0.1)

 

텍스처의 다양성

여러분은 게임 속에서 기본적인 오브젝트가 반복해서 나타나는 모습을 자주 보실 수 있을 겁니다. 잔디라든지, 수풀이라든지 심지어 소품도 똑같은게 또 나타날 때가 많아요. 그렇기 때문에 이 오브젝트의 텍스처들의 색을 살짝 바꾼다거나 하면 게임의 개성을 부여하기가 아주 좋아져요. 예를 들면 UV의 “노이즈” 옵션을 “Absolute World Position”으로 사용해(머티리얼 오프셋은 제외) 채도 / 색상 / 명도를 조절한다거나 먼지나 흙을 묻히는 등등의 추가적인 효과를 입힐 수도 있죠.

마지막 한 마디

이렇게 저희만의 노하우를 나눌 수 있도록 기회를 제공해준 에픽게임즈에 고맙다고 말하고 싶습니다. 이제 일하러 가보겠습니다. 저희는 현재 출시를 준비중인 스릴러 게임인 “The Beast Inside&rdquo의 데모를 개발중입니다. 주인공 아담(Adam)이 다른 사람의 어두운 기억과 과거에 벌어졌던 끔찍한 사건들을 여행하며 벌어지는 이야기를 그린 스릴러 게임입니다. 물론 업계 분들을 비롯한 여러분의 코멘트와 비평은 언제든지 환영이므로, The Beast Inside의 페이스북 페이지도 한번 둘러보시기 바랍니다. 또한 저희 개발사의 공식 웹사이트페이스북 페이지를 통해서도 저희와 이야기를 나누어보시기 바랍니다.

Recent Posts

리얼타임 기술의 잠재력을 선보인 Theia Interactive의 Harley Davidson AR

증강 현실은 리얼타임 프로젝트 샘플을 통해 비즈니스 고객들을 설득하는 중요한 도구로 자리잡았습니다. Theia Interactive가 ...

2018년 4월 NVIDIA Edge 프로그램 수상자

4월에도 NVIDIA Edge 프로그램에 멋진 작품들이 많이 제출되었으며, 그 중에서 세 개의 작품을 뽑아 수상작으로 선정하였습니다. ...

언리얼 엔진으로 BMW 차량 디자인에 혼합 현실 구현

리얼타임 기술과 VR이 자동차 제조의 새로운 시대를 열고 있는 가운데, 자동차 디자인 분야는 빠르게 변화하고 있습니다. BMW와 MIN...