void PostList()

Flying Antique Shark


< Intro >



해당 프로젝트에 손을 대기 시작한것은 3월쯤인것 같은데 다른 프로젝트에 손을 대다보니 계속 미뤄졌습니다. 이대로라면 기껏 만들어놓고 방치될 것 같아 글로써 남깁니다.

이 프로젝트를 시작하게 된 계기는 언리얼 엔진 Scene을 위한 모델을 모델링하고, 리깅과 애니메이션을 넣고, 언리얼엔진에 모델을 Import 한 다음 하나의 장면을 만들어 보는것을 목표로 잡았습니다. 이에 더해 언리얼 엔진에서 제공하는 Volumetric Material 을 이번 기회에 활용해보고 싶었습니다.

< Concept >

이번 프로젝트에서 주 쟁점은 3가지 사항이었습니다.

1. Blender에서 만든 모델을 Unreal 에 Import한 후 애니메이션 재생
2. 바닥면을 무작위 느낌으로 배치해보기
3. 언리얼 엔진에서 제공하는 Volumetric Material 사용해보기

따라서 이번 Scene은 학부시절 만들었던 상어 모델을 개조해 크림빛 하늘, 군도 위를 활공하는 스팀펑크 느낌의 상어를 만들어 보기로 했습니다.

< Shark >




상어 모델은 귀상어 + 프리깃함을 기반으로 합성한 후 로터와 연료통, 그리고 꼬리를 제트 엔진으로 대체해 기계적 느낌을 주었습니다. 

모델링 자체는 3ds MAX에서 작업을 진행했으며, 애니메이션 리깅작업은 블랜더에서 작업을 진행했습니다.

그리고 Substance Painter 에서 전체적으로 황동, 갈색톤으로 채색하여 스팀펑크 특유의 구리빛 느낌을 주었습니다.


이 상어 모델의 움직임의 중점은 날개 움직임과 로터의 회전, 그리고 마치 하늘 위를 헤엄치는 느낌을 주기 위해 바디부분의 뼈를 앞 뒤로 두개를 심었고, 각 날개와 윗 날개에 뼈를 심은 후 각 로터 회전을 위해 로터에도 뼈를 심은 후 리깅을 작업했습니다.



그 다음 애니메이션 작업을 진행하였는데 cycle modifier 를 넣었는데도 불구하고 로터가 한번만 회전한 후 멈춰버리는 현상이 있었습니다.

이 경우 아래 링크의 F-curve modifier 를 활용해 해결했습니다.



다음 제트 엔진의 불꽃 사출로 인해 발생하는 꼬리의 떨림을 표현하기 위해 꼬리 뼈에 Noise Modifier를 추가로 적용하였습니다.




< VFX >

1. Cloud


이번 언리얼 Scene의 배경은 창공, 그러니까 씬에 전체적으로 구름이 배치되어 있어야 한다고 생각했습니다. 그래서 구름에 사용하기 위한 텍스쳐를 만들기 위해 mebiusbox 님의 EffectTextureMaker 를 사용해 8x8 의 구름 타일셋 텍스쳐를 제작했습니다.


그 다음 구름의 경우 Cascade Particle System 을 이용해 대량의 구름 텍스쳐를 뿌렸는데 
여기에 더해 구름이 부드럽게 모양이 변하게 만들어야겠다고 생각했습니다.



그래서 Klemen lozar 님의 모션벡터를 활용한 프레임 블랜딩 기법을 활용하였습니다.


이때 motion vector텍스쳐는 SideFX 사의 slate editor 를 활용하여 제작하였습니다.

< 구름 마테리얼 >

volumetric 한 구름을 표현하기 위해 Material Domain은 Volume, Blend Mode는 Additive, Shading Model은 Default lit, Translucency 탭에서 Lighting Mode 는 Volumetric NonDirectional 로 설정하였습니다.

 



우선 자연스러운 구름을 만들기 위해 Houdini 에서 구름 데이터를 만든 후 추출한 다음 Blender 에서 분리하여 개별 구름 Mesh 를 만들었습니다.

Houdini에서 구름을 제작하는 방법은 아래 링크를 참조하였습니다.



그 다음 Houdini 에서 만든 Cloud Mesh를 Blender 에서 각각을 분리하여 Unreal Cascade Particle System 에서 구름 파티클의 출력 위치로 사용할 Skeletal Mesh를 만든 다음, Skel Vert/Surf Location 모듈을 사용해 파티클에 구름 형태에 맞게 생성되도록 만들었습니다.


구름 Mesh를 여러 종류를 만든 다음, 구름 오브젝트에 위와 같은 블루프린트를 추가하였는데, Set Actor Parameter 노드를 이용하여 각 구름 Particle Cascade 가 랜덤한 구름 Mesh 를 참조하도록 하였습니다.


여기에 Dynamic 모듈을 추가하여 각 파티클이 랜덤한 SubUVIndex와 AnimationSpeed 파라메터 값을 가지도록 만든 후


파티클의 Material 에서 이 파라메터 값을 가져와 각 파티클이 랜덤한 index 의 구름 스프라이트를 참조하며 서로 다른 애니메이션 재생 속도를 가지도록 만들었습니다.

2. Booster


상어의 꼬리에서 나오는 제트엔진의 경우 Cascade Particle 과 메시를 조합해서 만들었습니다.


상어 모델 꼬리 끝자락에 소켓을 추가한 후, Particle과 위 이미지의 Mesh를 붙여 꼬리부분에서 부스터가 사출되는 이미지를 만들었습니다.


그리고 부스터가 사출되는 부분에 heat haze 효과를 만들었습니다.


열기로 인해 일렁이는 효과를 만들기 위해 구름 모양 Normal Image를 패닝시킨 이미지 픽셀 값을 읽은 다음 Screen Position과 더한 후 이를 Screen Color 를 참조하는 UV로 사용해 읽어낸 픽셀을 Base Color 에 넣었습니다. 이때 Fresnel 노드를 활용하여 카메라와 노멀의 각도가 좁을수록 더 많이 일렁이도록 조절하였습니다.

BlendMode 는 Translucent 가 아닌 Additive로 설정하였습니다. Translucent로 설정할 경우 기존 스크린 색상을 대체해버리는데다 해당 위치에 투명도를 사용하는 마테리얼이 있을 경우 그려지지 않고 덮여버리는 문제가 발생하기 때문입니다.

< Environment>

1. Floating Building

상어가 날아가고 있는데 목적지 없이 날아가기만 하면 허전해서 구조물을 하나 추가해주기로 했습니다. 이 구조물은 실제로 모델링 된것은 아니며, 적절한 이미지들을 긁어와 포토샵으로 콜라주해 실루엣을 만든 후 Bill Board 로 세워두었습니다.


실제로는 이렇게 생겼습니다.


회전하는 풍차의 경우 Mesh 가 아닌 단일 Quad 입니다. 이 풍차는 실제 Transform 을 회전시키진 않고, Material Editor 에서 Custom Rotater 노드를 사용하여 텍스쳐 이미지를 회전시키는 방법을 사용하였습니다

2. Terrain


군도 지형은 Substance Designer 에서 Material 을 만든 후 텍스쳐를 추출하는 방법을 사용했습니다.  BnW Spots 패턴과 Shape 노드를 블랜딩한후 여러 노이즈를 적절하게 조합하여 최종 지형을 만들어 낸후 BnW Spots 패턴의 시드값을 조정하여 다양한 형태의 지형맵을 추출하였습니다.




처음엔 텍스쳐 이미지를 추출하지 않고 런타임으로 텍스쳐를 생성하면 어떨까 생각했었지만 한 이미지를 생성하는데 걸리는 시간을 보고 바로 포기했습니다!
이 교훈은 언제나 유효합니다 " 미리 할 수 있는건 미리 하자! " 따라서 언리얼 엔진상에서 재질을 실시간으로 계산하는것보단 미리 만들 수 있는 텍스쳐 이미지는 미리 외부에서 생성해오는게 성능면에서 좋습니다.




임의의 Random 한 변수를 생성하는데 사용할 수 있는 보편적인 방법은 Sin 함수에 아주 커다란 실수를 곱한 다음 Frac 함수로 0과 1 사이의 무작위한 실수를 생성한 다음, 원하는 범위에 해당하는 값을 곱하는 방법입니다.

이 씬에서 군도 지형을 표현하는데 있어 x좌표와 y좌표를 변수로 받아 위 함수의 입력값으로 사용할 것입니다. 그러기 위해선 x와 y값을 하나의 실수로 만들어겠지요. 그래서 하나의 스칼라 값으로 만들기 위해 vector(x,y) 와 임의의 벡터값을 내적하여 하나의 스칼라 값으로 만들어주었습니다.




이렇게 일정 Grid를 간격으로 둔 Postion 에 기반한 index를 위와 같이 랜덤으로 생성한 후 해당 index에 해당하는 텍스쳐를 읽도록 하면 아래와 같은 형태로 흘러가는 군도를 만들어낼 수 있습니다.


< Result >



Volumetric 재질의 구름을 Particle 로 처리하는것은 예상대로 무거운데다 만족스러운 정도로 밀도 있게 구름을 깔기에는 너무 무거웠습니다.

이후 만약 시간이 난다면 아래의 Ryan Brucks님의 볼류메트릭 레이마칭 기법을 시도해보고 싶습니다.


댓글

이 블로그의 인기 게시물

Array Modifier 로 오브젝트를 원형으로 나열하기

회전 루프 애니메이션 만들기 ( Graph Editor F-Curve Modifiers )

원형으로 뚫려있는 구멍을 토폴로지 흐름에 맞게 채우기.