들어가며


이전에 언리얼로 드론을 구현해본 적이 있습니다. 아래와 같은 영상을 송출할 수 있는 드론이었죠.



그런데 단순히 scenecapturecomponent를 이용해서 영상만 송출하다보니 빛이 없는 밤에는 아무것도 볼 수 없었습니다. 실제 군에서 운용되는 것을 보면 적외선 카메라같은 것을 이용해서 밤에도 적을 식별하는데 말입니다.

그래서 저는 Thermal vision을 드론에 추가하기로 하였습니다. 최종적인 모습은 다음과 같이 어두운 환경 속에서도 플레이어를 볼 수 있는 모습이 될 것입니다.



1. 블루프린트 설정


우선 thermal view를 사용할 액터의 블루프린트 안에 다음과 같이 키를 누름에 따라 카메라의 Post Process 설정이 바뀔 수 있도록 노드를 설정해줍니다.



이후 thermalvisionPP에서 material을 사용하여 렌더링하도록 설정해줍니다.



2. Matarial 설정


이제 사용할 Material을 만들어주어야합니다. 우선 Material을 만들기 위해 세가지 작업을 할 것입니다.

2.1 열이 없는 색상 만들기

아래 그림과 같이 열이 없는 색을 만들기 위해서 Lerp 노드를 사용할 것입니다. 기본적으로 어두운 색 두가지를 이용한 후 Alpha값을 주어 물체들에 색을 표현할 것입니다.

이 Alpah값은 WorldNormal에 Fresnel을 적용시켜서 산출합니다. Fresnel노드는 빛이 물체의 표면에 닿을 때 빛과 표면의 법선 벡터의 각도에 따라 반사하는 빛의 양이 달라지는 효과를 표현합니다. 그래서 아래와 같이 표현했을 때 물체의 어떤 부분이냐에 따라 조금씩 다른 색을 나타내게할 수 있는 것이죠.



2.2 열 색상 만들기

열 색상을 만드는 것은 1번과 완전히 똑같습니다. 다만 색을 밝은 색으로 표현해주었습니다.



2.3 열이 발생하는 물체에 열 색상 적용하기

최종적으로 1번과 2번 과정에서 만든 색을 이용하여 적외선 카메라를 만들 것입니다. 그러려면 이제 아래 사진에서 보시듯 적당한 Alpha값을 주어야합니다. 그래야 열이 있는 물체는 B의 색이 나오고 열이 없는 물체는 A의 색이 나오도록 할 수 있을 테니까요.



그렇게 하기 위해서 아래와 같이 Alpah값을 결정하는 부분을 만들었습니다.

캐릭터같이 열이 발생하는 액터에 ‘Render Custom Depth Pass’ 옵션을 체크해주게되면 CustomDepth가 계산이 되게됩니다. 그 외의 물체는 CustomDepth가 0이 되죠.

이 차이를 이용하여 열이 발생하는 액터와 아닌 액터 사이에 다른 값을 발생시킬 수 있고 이를 이용하면 앞서말한 우리가 원하는 적당한 Alpha값을 얻을 수 있는 것입니다.



3. 마무리

여기에 기호에 따라 noise를 넣거나 할 수 있습니다. 그렇게되면 최종적으로 이미지는 아래와 같이 나오게됩니다. 여기서 조금씩 색을 조정하고 렌더링 옵션을 조정하게되면 게임에서 원하는 느낌을 내는 적외선 카메라를 만들 수 있게 됩니다.