[Unreal]언리얼 나이아가라 몰프 / Niagara Morph Effect(Fake)

2022. 2. 10. 14:16unreal/Unreal Niagara

두 스켈레탈 메쉬 간 몰프 이펙트를 제작합니다.

프로젝트 특성상 블루프린트로 제작된 부분은 추후 c++ 코드로 옮기게됩니다.

또한 프로그램팀에서 보고 c++로 제작 할수 있도록 가이드 성으로 만든 내용이므로 블프 및 머터리얼 설정 부분에서 

최적화 및 불필요한 부분이 존재 할 수 있습니다.

예를들면 현재는 존재 하는 메시들을 전체적으로 취합하여 각각 바운드를 계산하고 있지만 실제 게임코드상에

전체메쉬의 바운드를 이미 갖고 있다던지 컬리전의 크기로 대체한다든지 하는 부분입니다.

 

 

참고영상

https://www.youtube.com/watch?v=1ufialSOqzE&t=186s 

모든걸 다해보는 cg how 형님 블로그

 

스켈레탈간 기본적인 나이아가라 몰프 기능 튜토리얼

https://www.youtube.com/watch?v=eVpsmC3PNQQ&t=256s 

 

모듈 및 기본연출 가이드 완료목표

 

이렇게 하단부터 순차적으로 사라졋다 나타나는 나이아가라 모듈을 작성하고 실제 오브젝트에 사용 가능하도록 합니다.

 

나이아가라에 기본적으로 스켈레탈 및 스태틱 메쉬 버텍스 기반 스폰 모듈이 있기에 

기능자체구현은 어렵지 않습니다.

 

단지 프로젝트에서 원한것은 몰프간 이펙트생성이 전체 바디에서 되는것이 아닌 디졸브 느낌 혹은 점차적으로 변하는 것을 원했기에 추가작업을 진행하게 되었습니다.(제작된 방식은 하단부터 점차적으로 파티클이 생성되도록 보이게 연출함)

 

초반엔 텍스쳐 기반 마스킹으로 진행했으나 점차적으로 파티클이 생성되는 느낌이 잘 나지 않아 하단에서 상단으로 생성되는 방식으로 변경처리했습니다.

 

하단에서 상단으로 변경처리 하는부분은 쉽게는 케릭터 자체 uv2번채널을 사용해 전체 uv를 상하로 펼쳐 진행하는 방법이 있고(cghow에서 사용한 방법) 두번째로는 오브젝트 바운드를 사용하는 방법이 있습니다.

 

이미 케릭터에 2번채널을 사용중이었고 또 채널을 추가해서 작업하기 번거로운 상황이어서

오브젝트 바운드를 기반으로 상하 uv를 생성하기로 결정했고

머터리얼에서는 기본적인 바운드 기능이 제공되지만 메쉬가 단일 메쉬가 아닌 머리와 몸이 분리되있고 무기 메쉬가 존재할수도 있는 상황이기에 외부에서 머리와 바디의 바운드를 합산해 계산해 다시 머터리얼로 보내줍니다.

 

실제 작업

나이아가라 시스템 작성

나이아가라 사용자 파라메터

외부(블푸 및 c++에서 출발할 메쉬(바디 / 헤드 두종류)와 도착할 메쉬를 받아옵니다.

ObjectMinMax - 오브젝트의 미니멈과 맥시멈을 받아와 오브젝트 바운드를 계산할 수 있도록 합니다.

RollUpAmopunt - 현재 하단에서 상단의uv 지점을 외부에서 설정해서 받아옵니다 이 지점을 기반으로 파티클 이동을 진행하거나 보여주기 시작합니다.

 

튜토리얼에서 다루는 부분이 대부분이므로 간략히 설명만 하고 지나갑니다.

 

현재 나이아가라 모듈은 간단히

두 스켈레탈 메쉬위 버텍스위치를 샘플링해 스폰지점과 도착하는지점으로 설정하고

그 사이를 커스텀한 라이브에따라 이동하게 되는것입니다.

 

가장 이상적인 방법은

 

메쉬의 하단부터 상단으로 파티클을 스폰하고 노멀라이즈된 파티클라이프를 사용해 자연스럽게 이동하는게 되겠지만.

메쉬의 랜덤한 위치가 아닌 특정 위치에서 스폰하는방법을 찾지못하였고 내부 노드를 살펴보니 지정된 위치를 설정할 수 없는것 같았습니다(만약에 존재한다면 그냥 그렇게 하면됩니다 ..ㅠㅠ - 아시는분은 알려주세요 ^^)

 

cghow 영상에서 보듯이 현재 특정지역부터 점차적으로 생성되게 보이는 방법은

전체 스폰을 진행하고 특정지역에서 스폰되는 파티클의 알파처리를 함으로써 

순차적으로 생성되는것처럼 보이게 하는방법이었습니다.

 

무한이 연기가되는방식의 이펙트는 전체적으로 스폰을 rate로 잡은뒤 계속 생성되게하고

이후 모션만 제작하면 멋진 이펙트를 얻어낼 수 있습니다.

 

우리가 해야할 모션은 특정 지역에서 특정 지역으로 1회 가게되는 이펙트이므로 무한이 생성되는 rate를 사용시 의도한 이미지가 생성되지 않습니다.

 

위 이미지 처럼 하단부터 이동이 시작되야 합니다.

 

도착지점은 생성위치와 마찬가지로 특정역영으로 보내는 방법은 찾지 못했으며 (예를들면 발에서스폰된 파티클은 발로 보낸다던지 등등)

약간의 꼼수와 대량의 퍼포먼스를 사용하게되면 가능은 합니다.

하지만 실제 프로젝트에서 사용하기에는 퍼포먼스 낭비가 매우 심하기에 적용하지 않았습니다.

방법은 이러합니다

대량의 파티클을 생성합니다.

이미 생성할때 도착할 지점에대한 정보가 있으니 도착할 지점이 내가 원하지 않는 파티클일 경우에는 킬을 하거나 알파로 보이지 않도록 합니다.

충분히 많은 양의 파티클을 생성할시 발로 가는 파티클만 보존해도 풍부한 느낌을 줄수 있지만.

불필요한 스폰작업이 상당히 많아 적용하기는 어렵습니다.

연출목적의 장면등에는 고려해볼만 합니다.

 

다시 돌아가서 제가 해결하려고 한것은 동시 스폰된 파티클이 제자리에 있다가 본인 위치에따라 지정된 시간이 되면 이동하는 부분이었습니다 아래 이미지처럼 스폰은 동시에 이루어지고 아래에 위치한 파티클부터 이동하기 시작합니다.

 

각 파티클이 일정시간 이후 흐르는 각자의 파이클 라이프가 필요하다고 생각했고

특정조건(위치 등등)에 맞추어 일정시간 이후 흐르는 라이프 타임 모듈을 추가하면되겠다고 생각했습니다.

 

나이아가라시스템의 이미지에 녹색 동그라미 부분이 새로 생성한 라이프타임 모듈이며

particleafterlife 는 일정시간 이후 시작되는 파티클의 duration입니다. 이 시간이 끝난다고 실제 파티클의 라이프가 종료되는것이 아니고 저시간동안 0-1의 normalizedage가 출력되게 됩니다.

spawnedposition은 초기 파티클의 생성위치를 링크 해줍니다.

하단에 spawnedpositionoffset은 실제 정해진 위치보다 더 먼저 혹은 뒤에 계산을 할때 사용합니다.

 

이 모듈에서 출력되는 값은 실제작으로 정규화된 라이프타임으로 맨위 노드 사진에서 보듯이 각 연출용 모듈의 커브에 주로 사용됩니다.

1차적으로 스폰된 위치의 z값(필요시 오프셋 추가)을 전체 바운드의 최고값으로 나누어 현재 파티클 위치가 세로 좌표로 어떤위치에 있는지 확인합니다(그림 a값)

1에서 현재 기준이 되는위치보다 작으면 라이프타임에 2000(크다고 생각하는수)만큼 빼줍니다. 또한 아래 현재 롤업(제가 그냥 붙인 명칭으로 아래부터 위로 올라가기 시작하는것 의미합니다)상태에 따라 대기값(1에서와 같이 큰수)을 빼줍니다.

롤업이 시작되거나 현재 나의 위치값이 롤업값(0-1)보다 크면 위에 주었던 딜레이(-2000값)을 제거하며 동시에 파티클의 커스텀 라이프가 시작하게됩니다

 

별표에 보면 실제 라이프를 원래 나이아가라 시스템에서 제공하는 파티클라이프를 사용했었는데 잘 계산이 되지 않아 새로 작성하였습니다(왜인지 아시는분 알려주세요)

 

최종적으로 스폰이후 흐른 시간(B)에서 내위치에따른 시간(A*totalduration)을 빼면 내위치에따라 시작되는 커스텀 라이프타임을 갖을 수 있고 조건등의 딜레이를 추가해 라이프의 시작점을 제어할 수 있습니다.

 

*totalduration 은 오브젝트 바운드 uv 0 -1까지 갈 시간입니다.

 

이렇게 작성하면 나이아가라 시스템 부분은 마무리 됩니다.

 

 

블루프린트

블루프린트에는 실제로 불필요한 내용이 대부분입니다 특히 애니매이션을 실행한다던지 변수값을 넘기는 등의 내용은 추후 프로그램팀에서 코드로 작성할 것을 염두해 두고 제작했기 때문에 대부분 불필요한 것들입니다.

 

크게 a 이미지의 사이클을 반복하면서 돌게 됩니다.

1. 케릭터 사라지는 애니매이션을 실행하고 나이아가라의 변수를 설정 후 활성화 시켜줍니다.

- 사라지는 애니매이션에 머터리얼 연출 및 롤업데이터 송신부분이 포함되어 있습니다.

2. 나이아가라 연출만큼의 시간을 지연한뒤 생성될 메시의 생성 애니매이션을 실행해줍니다 이후 나이아가라 비활성화

다시 타겟과 오리진메시 및 바운드 등등을다시 계산한뒤 1번과 2번을 반복해주면

a >b메시의 몰프 이후 다시 b>a 메시로의 몰프가 무한히 반복되게 됩니다.

 

*바운드 계산

갖고 있는 메쉬들의 배열의 바운드중 최대값과 최소값을 찾아 그 액터의 바운드로 설정해줍니다.

현재는 스왑되는 애니매이션이 존재하므로 매번 계산해줄 필요는 없지만 애니매이션과 별도로 몰프를 진행하게 될경우 나이아가라 활성전에 필수적으로 갱신해주어야 합니다.(현재는 불필요하지만 애니매이션 재생전에 갱신해줍니다)

 

마지막에 설정된 값들을 머터리얼파라메터 컬렉션으로 보내줍니다.

 

이 데이터는 나이아가라에서 사용합니다(피씨 등 에서 독립된 머터리얼 부모를 갖는 경우 머터리얼도 이 데이터를 바로 사용해도 됩니다)

나이아가라 변수 설정이 아닌 머터리얼 파라메터 컬렉션을 통해 데이터를 전달하는 이유는 

블루프린트로 애니매이션 노티파이 및 스테이트를 제작할 경우 변수 설정이 되지 않습니다.

 

롤 업데이터 송신을 애니매이션 안에서 하지 않고 블루프린트등의 외부에서 진행할 경우 머터리얼 컬렉션을 사용하지 않고 직접적으로 나이아가라의 변수를 설정해도 됩니다.

 

인터랙션 시작 애니매이션

머터리얼 연출과 롤업데이터 송신을 하고 있습니다.

롤업의 시간을 시각적으로 보고 제작할 수 있도록 스테이트로 제작하였으나 애니매이션에 종속되지 않은경우라면 이방법이 아닌 외부에서 데이터를 제작 및 송신할 수 있고 그경우 머터리얼 파라메터 컬렉션을 통하지 않고 직접 설정으로 제작하면 더욱 깔끔한 연출 방식이 될 것입니다.

 

롤업 데이터 제작및 송신

스테이트 길이만큼으로 정규화한 롤업데이터를 내보냅니다. 이 데이터로 현재 케릭터 바운드상 어느위치까지 보여줄 것인지 등에 사용됩니다.

 

머터리얼

머터리얼은 기존에 사용하던 머터리얼과 스왑시 보여줄 머터리얼(스왑시 딱히 머터리얼 연출이 없다면 그냥 롤업만 진행하시면됩니다)을 변경해줍니다 어트리뷰트를 사용해서 진행하는것이 스위치달기도 편하고 여러모로 편리합니다.

하단 이미지부분은 롤업에서 온데이터를 특정 범위만큼 페이드 아웃하며 사라지는 부분입니다.

 

 

이렇게 블프 나이아가라 머터리얼 작업이 끝나게되면 준비는 다 끝나며 각자 프로젝트 상황에 맞도록 변수 설정등의 디테일한 부분은 변경해서 적용하게 되면 두메시를 무한이 반복하며 몰프(처럼 보이는) 이펙트를 제작 할 수 있습니다.

 

대부분 간단한 내용이고 튜토리얼도 많은 부분이지만

오브젝트 바운드를 이용한 하단에서 상단 우측에서 좌측등 지연 스폰(처럼 보이는)이펙트를 제작하는 부분을 공유하고자 이 문서를 제작하게 되었습니다