실감 공통편 스켈레탈 이펙트
GCC 사관학교
안녕하세요 박현상입니다
스켈레탈 메시를 활용한
파티클 표현 기법에 대해서 실습하겠습니다
스켈레탈 메시라고 하면
걷거나 뛰는 등 애니메이션 된다고 하죠
스켈레탈이라는 단어 그대로
뼈대를 가진 오브젝트를 이야기합니다
이러한 스켈레탈 메시는 콘텐츠 안에서
항상 동적으로 움직이게 된
그리고 복잡한 움직임을 만들어 줄 수가 있는데요
또한 이 스켈레탈 메시를 활용하기 위해서는
애니메이션 블루프린트와 같은 기능들에서
파티클을 별도로 제어할 수 있습니다
특히 애니메이션 되는 타이밍을
정확하게 일치시키는 것은 힘들 것입니다
타이밍을 맞추는 요령과 함께
속도감을 더해 줄 수 있는 효과들
이런 것들에 대해서 학습해 보겠습니다
스켈레탈 메시를 활용한 파티클 기법
이번 시간에는 본격적인 예제 제작에 앞서서
같이 사용해야 할 스켈레탈 메시에 대해서
먼저 파악해 보고 진행해 보도록 하겠습니다
우선 여러분들 화면에서 보이는
이 스켈레탈 메시를 띄우고 싶으시다면
Starter Content에 Third Person이
들어가 있다는 전제예요
Content 폴더 Characters로 가시면
Mannequins라는 폴더가 있습니다
여기에 Meshes 폴더를 보게 되시면
이렇게 총 여러 개의 메시 타입들을 보실 수가 있는데
여기에서 SK_Mannequin이라고 되어 있는 이것을
더블 클릭해서 열어주시면
지금 제가 보는 것과 같은 화면을
보실 수 있게 될 겁니다
우측 상단에 보면 이런 식으로
아이콘들이 나열되어 있는 것들이 보이시죠
가장 왼쪽에 있는 스켈레톤 항목 이고요
이것을 보통 줄여서 SK라고 얘기를 합니다
그리고 두 번째로 있는 메시 항목
이것은 우리가 스켈레탈 메시라고, SKM이라고
보통 파일에, 애셋의 이름 앞에다가 접두어로 붙여 두죠
언리얼 같은 경우에는 이 뼈대를 기본으로 해서
뼈대와 붙어있는 메시들
그리고 그 메시들과 뼈대들이 연계돼서
애니메이션 되는 것들
이 애니메이션들을 연결한 애니메이션 블루프린트라고 하는
이러한 구조로 되어 있습니다
정리해 보면 스켈레탈이 있고요
여기에 다수의 스켈레탈 메시들이 붙고
이 스켈레탈과 연계되어 있는
애니메이션 시퀀스라고 보통 얘기를 합니다
이 애니메이션 시퀀스들은 달린다든가
점프를 한다든가 걸어간다든가 하는 것들이죠
이런 것들이 쪼로록 붙어있고
이러한 애니메이션 시퀀스들이
나중에 애님 블루프린트라는 것을 통해서
어떠한 상황에 달릴 거며 점프할 것인지
이런 것들을 제어하게 되고요
이것이 나중에는 블루프린트 캐릭터라는 것을 통해서
스켈레탈 메시와 연결되게 됩니다
실제로 Third Person 같은 경우에는
Third Person 폴더의 Blueprints 항목에
BP_ThirdPersonCharacter가 있죠
이것을 보게 되면 스켈레탈 메시와 애니메이션 블루프린트가
이렇게 각각 연결되어 있는 것을
여러분들이 확인하실 수가 있습니다
우선은 간단하게 별도의 블루프린트라든가
어떤 제어 없이 사용할 수 있는
나이아가라와 연계되는 것들을 위해서
애니메이션 시퀀스 볼 수 있는 창에서
MF_Run_Fwd를 선택을 해줍니다
여기에서 우리가 나이아가라를 바로
불러들일 수 있는 기능이 있는데요
여기 보면 Notifies 항목이 있는데
여기에 Track을 추가해 보겠습니다
여기 보면 레프트 라이트
뭔가 이런 마커 같은 게 찍혀 있는 부분 보이시죠
Track 누르고 Add Notify Track이라고
하나 더 추가해 주겠습니다
여기에 Track 이름을 넘버가 아니라
step이라고 지어줄게요
이게 지금 달리는 속도가 너무 빨라서
정확한 위치를 찍기가 조금 힘드니까
속도를 0.1로 줄여 가지고 재생하면서도
나중에 발이 땅에 닿는 타이밍을 알기 쉽게
이렇게 속도를 좀 늦춰 놨습니다
여러분들이 만약에 걸어가는 스텝에 맞춰 가지고
땅에 닿는 이 딱 부위에 정확하게 이펙트를 탁 하고
먼지 같은 것들을 뿌린다든가 하고 싶다면
언제 이 프레임 하나하나를 다 세 가지고
블루프린트 같은 걸로 명령을 줄 수 있을까요
물론 불가능하진 않습니다
미리 재생되는 거 애니메이터한테 전달받아서
이를테면 7프레임에서 오른발 내딛고
17프레임에서 왼발 내딛고
다시 대략 26프레임에서 내딛는다고
이렇게 발을 땅에 내딛는 프레임 정보들을
애니메이터들이 제작을 해주면서 우리에게 전달해 주면
이 프레임에 맞춰 가지고 이펙트를 탕탕탕탕 터뜨려 달라고
코드로 작성하는 것도 가능할 겁니다
근데 그렇게 되면 두 사람이 좀 번거로운 작업을 해야겠죠
애니메이터라는 사람도 이 프레임에 대한 정보들을
다 하나하나 기록해 놨다가 전달을 해 줘야 되고
프로그래머 입장에서도 그런 정보들을 바탕으로
전부 다 이걸 어딘가에 데이터로 쭉쭉쭉쭉 저장해 놨다가
불러와서 써야 되고
이런 것들이 굉장히 번거롭겠죠
그리고 만약에 수정이 일어나서 프레임에 변화가
앞뒤로 약간씩의 간격 변화 같은 것들이 생겼다면
매번 바뀐 프레임에 대한 정보를 또다시 알려 줘야 되고
수정해 줘야 되고 업데이트해 줘야 되는 불편함이 있겠죠
그러다 보니까 이 애니메이션 트랙에다가
아예 외부에다가 그런 걸 저장하지 말고
바로 나이아가라를 내가
캐릭터가 발을 딱 내딛는 이 타이밍
이 타이밍에 Add Notify에서 나이아가라를 실행시켜라
라고 하는 이러한 기능을 언리얼에서 만들어 놨습니다
오른발 쪽이고요
당연히 왼발도 이렇게 가서
이 인디케이터라고 하는
현재 위치를 알려주는 마커가 위치한 곳에서
오른쪽 클릭 - Add Notify -
Play Niagara Particle Effect
이거를 이렇게 추가를 해 줍니다
그러면 해당하는 프레임에 이렇게
내가 원하는 이펙트를 터트려라
라고 지정해 줄 수가 있겠죠
한번 여기에 들어갈 만한 이펙트를
짧게 만들어 보겠습니다
우선 SkeletalFX라는 폴더를 만들어 놨고요
오른쪽 클릭해서 Niagara System이라고 추가를 합니다
그리고 Fountain
분수 같은 형태의 기본 이미터를 하나 설정해 주겠습니다
여기에 사는 디테일보다는 어떻게 작동이 된다
이 정도에만 좀 포커스를 맞추겠습니다
그래서 만들어진 이펙트의 이름을
FX_FootStep이라고 정해주고 열어 놓겠습니다
여기에서 Shape 항목은 끄도록 하고요
Gravity도 끄도록 하겠습니다
Initialize Particle에서 1.4초는 한 발자국 내딛는데
1. 몇 초 동안 이펙트가 계속 나오고 있으면
우리가 저벅 저벅 저벅 이런 식으로
1초에도 여러 발자국 걷는데
이미 몇 발자국 지나가서까지 계속
이펙트가 발생하면 이상하겠죠
그러니까 이거는 0.2초에서 3초 정도로
아주 짧은 순간만 작동하게끔 해 놓고요
그리고 루프도 한 번만 실행하게끔 이렇게 바꿔 놨습니다
실행 시간도 당연히 0.2초 정도로
아주 짧게 폭 폭 폭 하고 튀게끔
이펙트는 굉장히 심플하죠
이것을 NiagaraEffect에서
FX_FootStep이라고 검색을 한 다음에
지정만 해주시면 됩니다
FX_FootStep
재생을 해보면 이런 식으로
이펙트가 잠깐 동안 이렇게 땅에 닿을 때마다 작동을 하죠
근데 지금 보시면 작동을 할 때
여기는 타이밍이 맞는데 약간 프레임이 지나가면서
발이 지나갔는데도 허공에 이렇게 있죠
이 발 끝에 맞춰 가지고 작동이 되게끔
스켈레탈에서 이 발끝에 해당하는 Bone을
선택하는 걸 보여드리겠습니다
Character의 Bones - All Hierarchy를 체크하시면
현재 캐릭터가 갖고 있는 모든 뼈대 정보가
이렇게 시각적으로 표현이 되는데
이 발끝에 ball_l 혹은 ball_r이라고 나와 있죠
이것을 그대로 오른발을 내딛을 때는
이 Socket Name에 ball_r 지정을 해주고요
왼쪽에는 FootStep에서 ball_l로 이렇게 서로 다르게
첫번째 거에는 ball_r, 엔터 눌러 주시고
두번째 거에서는 ball_l로 되게끔
이렇게 체크를 해 주시면
이제는 이펙트가 발을 따라서 움직이는 게 보이시죠
그러면 나머지 오른쪽 발 여기에 맞춰서
R이라고 되어있는 위치에 맞춰서
여기 있는 FootStep 노티피를 카피하셔서
페이스트 해주시면 되고
L에 맞춰서, 레프트 값이죠
카피하셔서 L를 오른쪽 클릭해서 페이스트
마찬가지로 페이스트 해주시면 됩니다
만약에 이렇게 정확하게 위치를 맞추는 게 어려우시면
조금 이렇게 스크롤바를 이용해서 확대 축소를 해서
이거를 드래그해서 맞추시는 방법도 있습니다
이런 식으로요
이렇게 해서 저장을 해 놓고 실제로 플레이를 해보면
걸어갈 때마다 옆으로 지금 나오고 있죠
이런 식으로
이것은 여기 있는 FX_FootStep에서
Velocity의 콘의 모양은 Z축으로
FX는 이 Z축을 기준으로 해서 올라가게끔
세팅이 되어 있습니다
반면에 여기 있는 볼
우리가 선택했던 이 ball의 방향을 보면
여러분들이 방향을 정확하게 파악하실 거면
여기 있는 월드와 로컬 좌표계가 표현하는 방식을
로컬 좌표계 상태로 두신 다음에
큐브 모양이죠
지구본 모양은 월드 좌표
로컬 좌표는 큐브 모양
큐브 모양을 보시면 Z축이 지금 보시는 것처럼
오른쪽으로 향해 있죠
이 이유 때문입니다
그래서 이렇게 Z축이 잡혀 있다 보니까
위로 뻗어나게끔 우리가 세팅이 됐던 게
Z축 방향으로 뻗어나게 돼 있는 파티클이
그대로 이렇게 뻗어 나온 것이죠
이게 왼쪽은 이렇고요
오른쪽을 보시면 마찬가지로
Z축이 바깥을 향해 있는 건 똑같은데
약간 다른 점이라면
이 두 발이 가까이 있게끔 위치해서 보여드리겠습니다
Y축의 방향을 잘 보세요
왼쪽의 ball 같은 경우에는 Y축이 아래로 향해 있고요
ball_r 같은 경우에는 Y축이 위를 향해 있습니다
그래서 만약 이걸 Z축으로 맞춰라
내지는 Y축으로 맞춰라
이렇게 어느 한 축으로 맞추라고
명령을 내리기 되게 애매한 상황입니다
이런 경우에는 이렇게 옆으로 빠져나가는
이런 것들을 여기에 있는
이 Rotation Offset 값을 이용해서
조절할 수가 있는데요
여기에서 보면 ball_r 같은 경우에
Z축이 Y축처럼 올라오려면
X축을 이렇게 90도로 돌리면
Y축은 이쪽으로 가고 Z축이 이렇게 올라오겠죠
그러니까 X축에다가 플러스 Rotation Offset을
90으로 입력을 해 주시고요
그러면 발이 닿는 순간에 위로 올라오게끔 바뀝니다
여기 있는 왼발도 마찬가지인데요
이번에 왼발 같은 경우에는 아래를 향해 있기 때문에
왼발은 여기 있는 Rotation Offset 값을
90이 아닌 -90으로 맞춰 주셔야
오른발도 위를 향해서 파티클이 발생을 하고
왼발도 위를 향해서 발등 방향을 향해서
파티클이 발생을 하게 됩니다
만약에 이 뒤에 있는 것들
지금 제가 일부러 예시 삼아서 안 바꿔놨는데
이 뒤에 아직 수정이 안 된 애들하고 비교를 해보시면
바깥쪽으로 흘러나가죠
오른발 수정하기 전
마찬가지로 바깥쪽으로 나가죠
그래서 여기 있는 것들을 모두 다 라이트는 90도
레프트는 -90도로 바꿔주시게 되면
이제 우리가 의도한 대로 발걸음을 내딛을 때마다
먼지들이 하늘을 향해서 솟구치는 형태로
이펙트가 발현이 될 겁니다
한번 뒤쫓아 가면서
서드 퍼슨 상태에서 확인해 보시죠
걸어가 보겠습니다
이제는 위를 향해서
이렇게 탁탁 튀어 오르듯이 되고 있죠
이렇게 잠깐 잠깐 튀는 이펙트들 말고요
이제 플레이어가 달려가는 방향에 맞춰서
궤적을 남기듯이 따라오는
이러한 이펙트들도 마찬가지
여기 있는 노티피를 이용해서 제어를 할 수가 있습니다
보통 이러한 이펙트를 트레일 이펙트라고 얘기를 하고요
나이아가라 기준으로는 리본 이펙트라고도 얘기를 합니다
리본체조 선수가 띠를 들고 리본을 들고
이렇게 아름답게 연기하면
그 손짓에 맞춰서
자연스럽게 띠가 모양을 이루면서 나오는
그러한 효과 같은 것들인데
우선 나이아가라에서 이 Dynamic Beam이라고 하는
템플릿을 하나 만들도록 하겠습니다
그리고 FX_Ribbon이라고 이름 지어 주고요
여기에서 이제 사용하지 않을
몇 가지 모듈들은 꺼 주도록 하겠습니다
우선 Update Beam 꺼 주고요
원래는 이렇게 빔 이라고 해서
이렇게 일정한 직선 모양이 나오는데
우리가 할 것은 이게 아니고
움직임에 맞춰서 자연스러운 곡선이
나오는 걸 만들려고 하는 거니까
Spawn Beam, Beam Width, Update Beam
그리고 Emitter Update에 있는 Beam Emitter Setup도
마찬가지로 빔과 관련된 총 4가지 모듈들은
여러분들이 꺼 주시고 혹은 삭제 하셔도 상관없습니다
Spawn Burst도 꺼 주도록 하겠습니다
이렇게 총 5개가 되겠네요
그리고 나서 업데이트 항목에서
Spawn Rate를 추가를 해줍니다
모듈은 이렇게만 세팅이 되면 작동을 하고요
Spawn Rate 값은 우선은 10으로 두겠습니다
Spawn Rate 값을 추가해서 10으로
파티클의 사이즈를 Ribbon Attributes라는 항목에서
Ribbon Width 항목을 Direct Set으로
일단 5로 두겠습니다
그럼 현재는 아무런 이펙트가
발생을 하고 있지 않기 때문에
어쩔 수 없이 안 쓸 거지만
이 리본의 간단한 예시를 위해서
Add Velocity로 Linear가 아니라
From Point 이용해서 이렇게 보여드리면
이런 식으로 파티클이 생성돼서
이동되는 경로에 맞춰 가지고
이런 식의 띠 형태로 모양이 남게 됩니다
여기에서 Lifetime을 줄이면
당연히 띠에 남는 궤적이 짧게 되겠죠
Spawn Rate가 3이 되면
띠가 굉장히 간격이 각지게 되면서
원래는 점 점 점 이렇게 스프라이트로 생성돼야 될 게
첫 번째, 두 번째, 세 번째 생겼다고 하면
이런 식으로 띠의 형태로 이렇게 궤적이 만들어지는 겁니다
그래서 Spawn Rate 값이 커지면 커질수록
훨씬 부드러운 형태의 이런 식으로
다이내믹한 방향들을 만들어줄 수 있게 되는 겁니다
이렇게 되면 준비가 끝났고요
다시 Run_Fwd로 가서
달릴 때만 속도감을 좀 느낄 수 있도록
Notify Track을 하나 추가해서
Ribbon이라고 입력을 하고요
달리기 시작하면서부터 나와야 되니까
0 프레임에서부터 Particle Effect 노티피를 추가해 줍니다
그리고 여기에는 FX_Ribbon이 추가가 되겠죠
만약에 지금 재생이 된다면
이 스켈레탈이 가지고 있는 가장 기본 루트가 되는
이 루트를 향해서 여기에 이펙트가 발생이 될 건데
그러면 이상하니까 Socket Name에다가 head라고
머리에다가 마치 띠처럼 남을 수 있게 만들어 주고요
시작하기 전에 이 미리 보기를 위해서 켜놨던
Velocity는 꺼 주도록 하겠습니다
그래서 이 Ribbon은 머리를 쫓아가게끔
세팅이 되어 있는 상태고요
저장한 다음에 플레이를 해 보면
평소에는 발생하지 않다가 달리면
이게 느릴 때는 걸어간다고 해서
걷는 애니메이션이 되느라고 잘 작동을 안 하는 거고요
뛰어갈 때는 이렇게 머리를 통해서
이런 식으로 궤적이 남죠
저는 일부러 여러분들께 좀 더 잘 보여드리기 위해서
1초로 줄여놨던 Ribbon을 다시 3초로 늘리긴 했는데
너무 길죠, 멈춰 있을 때도 작동을 하니까
그래서 이걸 줄여놓고, 1초로 다시
이런 식으로 짧게 궤적이 남는 것을
확인하실 수가 있습니다
노티피를 이용해서 풋스텝을 만들거나
트레일을 만들거나 하는 건
단순히 달리는 거 말고도
검을 이렇게 내려 칠 때 검의 궤적에 맞춰서
이러한 트레일 이펙트를 남기는 것도 동일하고요
어떤 타격을 입힐 때 특정한 타격 지점에서
꽝 하고 내려치는 타격 지점에서 이펙트를 터뜨릴 때
풋스텝의 원리를 이용하는 것도 동일합니다
스켈레탈 메시를 이용한 3D 표면 데이터 활용
지금까지는 스켈레탈 메시의 본의 정보를 이용해서
파티클을 스폰하고 애니메이션 되는 시간 타이밍에 맞춰서
재생하는 방법들을 알아봤는데
이번에는 스켈레탈 메시라고 하는
3D 표면의 데이터를
활용하는 방법들에 대해서 다뤄볼 겁니다
우선은 나이아가라 이펙트를 먼저
하나 생성을 해 주겠습니다
가장 기본이 될 수 있는
Fountain 템플릿을 선택해서 생성해 주겠습니다
FX_SKM
이렇게 SKM이라고만 이름을 지어줄게요
우리가 일반적으로 파티클을
스폰할 장소 혹은 범위에 대해서
이런 Shape Location 같은 것들을 이용하거나
혹은 Static Mesh와 같이
특정한 3D 오브젝트를 대상으로
파티클이 어느 위치에 생성되는지
이런 것들을 실습을 해봤었는데
마찬가지로 스켈레탈 메시도 이러한
파티클을 스폰하기 위한 정보들
위치 정보를 제공하는 데 사용할 수가 있습니다
그래서 Skeletal Mesh Location이라고
이렇게 지정을 해놓고요
여기에서 프리뷰가 되는 기본 메시는
SKM_Quinn을 사용하도록 하겠습니다
지금은 이 이펙트 자체가
속도값에 따라서 움직이고 있으니까
이런 속도와 관련되어 있는 Velocity라든가
Gravity Force라든가
Drag 같은 것들은 꺼준 상태에서 확인해 보겠습니다
보시면 이런식으로 파티클의 입자가
마치 뼈대의 형상을 지는 것처럼
이렇게 보이고 있죠
여기에서 Skeletal Mesh Location의
Mesh Sampling Type 이라는 것이 있습니다
Mesh Sampling Type을 Skeleton(Bone)이라고 기본 값이 되어 있는데
이것을 Surface의 Triangle이나
버텍스와 같이 메시 데이터를 활용하게 되면
지금 보시는 것처럼 약간의 형태가 바뀌었죠
이 Initialize의 사이즈를 6이 아니라
조금 작게 1이나 2 정도로 작게 바꿔서
이 Spawn Rate의 값을 한 1500 정도로 높여 보면
우리가 프리뷰 메시에서 선택한 이런 형식의
메시의 대략적인 실루엣 같은 것들이 드러나게 됩니다
그리고 여기에서 Skeletal Mesh의 CPU Access라는 기능이
비활성화 되어있기 때문에 Fix Now를 눌러서
경고창을 없애 주도록 하고요
이 Skeletal Mesh Location을 그대로 Ctrl+C
그리고 업데이트 부분에도
Ctrl+V로 붙여 주도록 하겠습니다
이렇게 똑같은 Skeletal Mesh 항목이
업데이트에도 추가된 것을 보실 수가 있는데요
이제 이것을 어떻게 활용하는지
한번 블루프린트를 만들어서
기본적인 이 작동 조건에 대해서 알아볼 겁니다
우선은 오른쪽 클릭 하셔가지고
블루프린트 클래스에서 일반적으로 Skeletal Mesh가
가장 많이 사용되는 것은 캐릭터 클래스라고 하는 건데
캐릭터 클래스를 선택한 상태에서
BP_SKMfx라고 이름 지어 주고요
더블 클릭해서 열겠습니다
원래 캐릭터를 만들 땐 이러한 캡슐에다가
여기 보면은 메시 항목 있죠
스켈레톤 모양의 아이콘을 가진
여기에 우리가 사용할 Skeletal Mesh
이를테면 퀸이면 이런식으로 퀸 애셋을 집어 넣고
위치를 좀 맞춰 줄게요
회전을 시켜 가지고요
이렇게 세팅해 놓고
일반적으로는 이제 애니메이션 블루프린트 라고 하는 것을
이렇게 지정해 줘서
우리가 블루프린트에서
키보드 입력을 받는다든가 하는 식으로
사용자 정보를 전달받아서
여기에서 구현한 기능을
애니메이션 블루프린트에 전해 주게끔
일반적으로 설계를 합니다
다만 지금은 블루프린트 교육이 아닌
FX 교육이니까 실제로 애니메이션이 되고 있다고
전제를 하기 위해서
이 애니메이션 모드를 블루프린트가 아닌
애니메이션 애셋이라고 이렇게 지정을 해 놓고요
Anim to Play에다가
MF_Run이라고 검색하시면
MF_Run_Fwd라고 하는 항목이 검색이 되죠
이 애니메이션 시퀀스를 등록을 해 줍니다
그렇게 되면 우리가 지정한
애니메이션 시퀀스가 재생이 되고 있죠
여기에다가 나이아가라를 붙여 볼 건데요
+Add 버튼을 눌러서 Niagara
이렇게 Particle System을
Mesh에 자식으로 추가를 해 줍니다
그리고 나서 FX_SKM 지정을 해 주면요
지금 보시는 것처럼
이렇게 메시 표면에 파티클이 생성이 되고요
그리고 캐릭터가 애니메이션 동작을 하는 것에 맞춰서
파티클이 같이 따라서 움직이는 것을
확인하실 수가 있습니다
여기서 만약에 메시에 보이는 기능을
쭉 아래쪽으로 내려가서
렌더링에서 Visible 기능을 꺼보면
지금 보시는 것처럼 이렇게 메시가 그대로
애니메이션 되는 것에 맞춰서
그대로 움직이고 있죠
다시 한번 나이아가라 화면으로 이동해 보겠습니다
이 나이아가라 화면에서
Particle Update에 있는
Skeletal Mesh Location을 비활성화 해 주게 되면
지금 보시는 것처럼
미리보기 창에서는 크게 차이가 없는데요
만약에 블루프린트 화면으로 가보면
이런 식으로 메시의 동작에 맞춰 가지고
잠깐 잠깐 잠깐 생성이 되기 때문에
그 형태가 정확하게 모션을 쫓아오지 못하고 있어서
물론 이제 이 파티클 자체에
Lifetime을 0.1과 같이
아주 짧은 시간을 만들게 되면
어느 정도 보이긴 하죠
어느 정도 보이지만
정확하게 알아보기는 좀 힘들죠
그래서 이 파티클 이펙트가
메시를 따라서 움직이게 하고 싶으시면
반드시 업데이트 항목에도
Location 항목이 들어가 있어야
메시의 정보들을 지속적으로 업데이트를 받으면서
이렇게 이펙트가 따라오는 것을 확인하실 수 있을 겁니다
여기에서 파티클의 위치라든가
이런 것들이 내 마음에 들지 않아서
약간씩 변형하고 싶으실 수도 있습니다
그래서 간단하게 스크래치 패드라고 하는
나이아가라에서 제공하지 않는
확장된 기능을 만드는 방법을 보여드리도록 하겠습니다
우선 여기에 있는 업데이트 항목에서
Scratch Pad라고
새로운 모듈을 추가하는 방법을 선택해 줍니다
그러면 지금 보시는 것처럼
비주얼 스크립트 방식의 새로운 기능을
우리가 구현해서 짜넣을 수 있는
스크래치 패드라는 것이 보이는데요
위쪽에 있는 System Overview 탭을 누르면
다시 원래 항목으로 돌아옵니다
우리가 사용하는 Particle State
Skeletal Location 이런 것들도
더블 클릭을 해 보면
지금 보시는 것처럼 아주 복잡한 노드를 이용해서
기능이 구현되어 있는 것을 확인하실 수가 있습니다
보이시죠? 노드가 아주 복잡하죠
물론 우리가 이번 시간에 해 볼 건
이 정도로 복잡한 노드를 할 건 아니고
대략 5개에서 6개 정도의 노드를 이용해서
표현을 해 볼 건데요
나이아가라의 ScratchModule을 이름을 바꿔서
Rename으로 VoxelModule이라고
이름 지어 주도록 하겠습니다
VoxelModule, 더블 클릭하고 다시
이 스크래치 패드는 기본적으로
InputMap이라는 항목과 Map Get 그리고 Map Set
마지막으로 아웃풋 이렇게 네 가지 구성으로 되어 있습니다
보면 이 흰색의 화살표처럼 보이는 것들은
실행하는 순서를 의미합니다
그래서 Map Get에서 어떠한 정보를 받아오는 겁니다
이를테면 메시에 대한 정보 혹은 컬러에 대한 정보
그 외 기타 등등 나이아가라에서
수집할 수 있는 정보들을 가지고 와서
우리가 가공을 해서, 새로 기존의 파티클 정보에다가
덧입혀주는 Map Set을 통해서
커스터마이징을 할 수 있는 것이죠
그래서 InputMap하고 Output Module은
일단 크게 여러분들이 신경 쓰실 필요는 없고
우리는 어느 정보를 가지고 와서
여기에다가 집어 넣을 거냐
이것만 먼저 생각하시면 됩니다
우선은 Voxel의 형식을 만들기 위해서
Voxel이라고 하는 건 기본적으로
이렇게 굉장히 큐브의 형태로
마치 모자이크처럼 이렇게 각진 형태의
이런 3D 공간을 일정한 크기로 나눈 것들을
흔히 Voxel이라고 얘기하는데
그걸 위해서는 기존의 파티클의
위치값이 표현이 돼야 됩니다
그래서 여기 있는 Map Get에 +를 눌러서
Particle Position이라고 검색을 하고요
이 Particle Position에다가
일정한 간격으로 배치를 해야 되니까
간격을 의미하는 + 눌러서 Float 생성해 주시고
이 Float의 이름은 grid라고 gridsize라고 정해 놓겠습니다
이 두 가지 정보를 이용해서
우리는 파티클을 일정한 간격으로 배치할 수 있게끔
지정을 할 겁니다
우선 포지션 정보를 받아 오셨다면
이것을 연산하기 편하게 벡터의 형태로
Transform Vector 노드를 이용해서
변환을 해 줘야 됩니다
Transform Vector만 선택을 하더라도
포지션 정보를 XYZ에 이런 식으로
벡터의 형식으로 바꿔주는 노드까지 함께 생성이 되고요
기본 스페이스는 World와 Simulate
Source는 World, Destination은 Simulation
이걸 그대로 두겠습니다
그대로 두고 이것을
아웃 벡터를 그대로 이렇게 핀을 뽑아내서
슬래시 혹은 디바이드라고 나누기죠
나누기를 하는 겁니다
그래서 gridsize로 나누기를 해 주시게 되면
지금 보시는 것처럼 조금만 창을 정리하겠습니다
이렇게 현재 위치 값을 gridsize로 나눠주고
이것을 반올림을 해 줍니다
Round라는 반올림 기능을 이용하고요
마지막으로 이것을 다시 한번
Round된 결과를 Multiply를 통해서
gridsize로 한 번 더 이렇게 곱해 줍니다
이렇게 곱해진 결과를 Map Set에다가 + 눌러서
Particle Position이라고 다시 한번 검색을 해 보시면
이렇게 Particle Position을 추가해 주고
이 Particle Position에다가 곱하기까지 완료된 결과물을
이렇게 연결을 해 주시면 기본적인 준비가 끝났습니다
Apply를 눌러 주시고요
현재는 여기에 점으로 기존의 메시 형태가 아닌
점의 형태로 나와 있죠
이거는 현재 gridsize의 기본 값이
0으로 잡혀 있기 때문에 그런 겁니다
그래서 System Overview로 가서 VoxelModule이라고
이 모듈에 gridsize 항목이 있죠
이것을 8이라고 입력을 하시고
이 Initial Particle에 가서
Lifetime을 1초로 좀 오래 나올 수 있게끔 바꿔 보면
지금 보시는 것처럼 Particle의 입자들의 위치가
일정해진 것을 확인하실 수가 있습니다
원리를 간단하게 설명 드리면요
이 한 칸을 0, 1, 2 이런 식으로 좀 두겠습니다
현재 여러분 화면에 보이는 이런 그리드를
이런 식으로 1, 2, 3
그럼 만약에 이렇게 소수점 위치에
대략 0.6 이라고 하죠
0.6 에다가 나누기 3을 하고
다시 곱하기 gridsize를 3 이라고 가정을 하는 거예요
Round된 결과에다가 곱하기 3을 해 준 거죠
식으로 따지면 이렇게 표현이 됩니다
포지션의 위치에다가 나누기 3, Round하고 곱하기 3
이런 식으로 하면은 0.6을 3으로 나누면
대략 0.2 정도가 되겠죠
0.2를 라운딩하면 0이 될 거고요
반올림을 하면 0.2에다 3을 곱해도 그대로 0이겠죠
그럼 원래는 0.6에 위치해 있어야 될 점이
이렇게 0에 위치하게끔 바뀌게 될 겁니다
마찬가지 맥락으로 1.8에 있는 점의 위치를
나누기 3을 하면 몇이 되겠어요?
0.6이 되고 라운딩을 하면 Round를 하면
반올림을 하게 되면
이것이 1이 된 다음에 ×3을 하니까
3에 위치하게 되겠죠
그럼 여기 있어야 될 점이
이렇게 정수의 위치에 딱 가게 됩니다
이런 식으로 일정한 정수 위치에다가
점들을 옮길 수 있게 되는 거죠
그래서 여기에다가 스프라이트로 하면
그 형태를 조금 더
Voxel의 느낌을 알 수가 없으니까
Sprite Renderer는 꺼 주도록 하고
렌더에 + 버튼을 눌러서
Mesh Renderer를 추가해 줍니다
그리고 이 Mesh Renderer의 Meshes 항목을
기본 큐브 항목으로 넣어 주도록 하겠습니다
보면 첫 번째로 검색되는 게
이 노란색 테두리를 가진 VR 에디터에 있는
베이직 메시, Cube_01 이라고 되어 있는데요
이걸 이렇게 넣어 보면 컴파일이 좀 끝나면
이런 식으로 큐브가 생기죠
사이즈는 나중에 수정해 주도록 하고요
이 메시의 방향이 지금 제각각으로
이렇게 랜덤하게끔 생성되고 있으니까
이것의 축을 Lock Axis Enable를 활성화해서
Lock Axis를 X축으로 1, Z축으로 0
Y축도 0이 되게끔 해 놓겠습니다
방향을 Axis를 고정해 놓고
Skeletal Mesh의 아래쪽에 보시면
Orientation Sampling이라고 Apply 되어 있습니다
이것이 사실 눈으로 보기엔 랜덤하게끔 보이는데
실제로는 3D 표면에 맞춰 가지고
만약에 3D 표면이 이렇게 되어 있으면
Skeletal Mesh의 표면이 되어 있으면
이 표면이 바라보는 방향에 맞춰서
이렇게 정렬이 되는 거거든요
이런 식으로, 이것을 3D 표면을 기준으로 하지 않고
우리가 Lock을 지정해 둔 방향대로 작동하게끔
Orientation Sampling 부분을 Output으로 바꿔 주게 되면
업데이트도 마찬가지로
Orientation Sampling을 Output으로 바꿔 놓게 되면
이제 그리드하게 일정하게
크기가 정해진 걸 보실 수가 있고요
지금은 이제 빽빽하게 크기가 워낙에 커서
겹쳐져 있는 상태인데
Initialize Particle에 가셔서
Mesh Scale 모드를 Uniform으로
그리고 사이즈를 드래그해서 줄여 보시면
이런 식으로 일정한 형태로
일정한 간격과 형태로
큐브가 배치된 걸 보실 수가 있습니다
이것을 실제로 블루프린트에서 확인을 해 보면
이렇게 보입니다
마치 큐브가 애니메이션 되듯이
이런 식으로 보이는 것이죠
그런데 그리드 사이즈에 맞춰서
만약에 우리가 그리드의 간격이나
이런 것들이 마음에 들지 않아서
VoxelModule에서 gridsize를
이를테면 5로 바꾸게 되면
또다시 겹치게 되고
10으로 바꾸게 되면은
간격이 더 벌어지게 되고
큐브의 사이즈가 일정하다 보니까
gridsize를 바꾸는 것에 맞춰 가지고
계속해서 사이즈 바꿔 주고
크기 바꿔 주고 이런 식으로 번잡하죠
그래서 User Parameters에다가
파라미터 항목을 하나 추가를 해 주겠습니다
Make New에 Common에 있는 float
여기를 그리드 이름을
UserGrid라고 이름을 지어 주도록 하고요
gridsize에 있는 항목을
아래쪽의 화살표를 눌러서
UserGrid라고 검색해 보시면
User Parameters에 만들었던 항목을 그대로
사용하실 수가 있게 됩니다
그럼 여기에 우리가 UserGrid를
5로 입력하거나 10으로 입력하거나 하면
자연스럽게 연결이 되어 있으니까
바뀌게 되겠죠
이것을 Initialize Particle에다가도
동일하게 연동해 주게끔
한번 추가적인 작업을 해 볼 겁니다
자 우리가 Initialize Particle에서
Mesh Scale Mode를 이용해서 바꿔 줬죠
여기에는 0.12 이런 식으로 값을 넣어 줬는데
여기에다가 Uniform Scale에서도
아래쪽 화살표를 눌러서
New Expression이라고 하는
이것은 쉽게 얘기해서 스크래치 패드처럼
복잡한 노드가 아니라
이런 명령어를 직접 타이핑 하는 방식으로 쓰는 건데요
사용하는 방법은 이런 겁니다
직접 타이핑을 해서
여기에서 얘기하는 유저는 이 유저입니다
User Parameters에 유저라고 써 있죠
유저가 가지고 있는 파라미터들 중에
UserGrid를 받아올 것이다
라고 하는 겁니다
이렇게만 한다면 엔터를 치면 그대로 작동을 합니다
UserGrid라고 그 값을 그대로 가져오면
여기에 10이라고 입력하면
원래 사이즈의 10배가 되는 겁니다
원래 큐브가 가지고 있는 사이즈의 10배가 된 거예요
그럼 큐브의 사이즈가 중요하겠죠
여기 Mesh Renderer에서 보시면
이 큐브를 더블 클릭해 보시면
이 큐브의 사이즈, Approx Size가
대략 49×49 이렇게 되어있는데
대략 50cm 정도라고 가정하겠습니다
그러면 50cm의 10배가 되니까
5m짜리 큐브가 배치가 된 거고요
그래서 Initialize Particle에 가서
원래 큐브가 가지고 있는 사이즈에
나누기 50을 해주시면
이런 식으로 빈틈 없이
메꿔진 형태의 Voxel를 보실 수가 있고요
실제로 사이즈를 줄여도
여전히 빈틈 없이 작동하는 것을 확인하실 수가 있죠
실제로 스켈레탈 메시 쪽에서 보셔도
이런 식으로 우리가 지정한 사이즈에 맞춰서
캐릭터가 애니메이션 되는 것을 확인하실 수 있습니다
지금은 제가 Run 이미지를 넣어 놔서 그런데
Run 뿐만 아니라
스켈레탈 메시에다가 애니메이션 클립을
Idle을 집어 넣어도 그대로 위치하게 되고요
Walk를 집어 넣어도 그대로 걷는 모션에 맞춰 가지고
Voxel 동작이 그대로
메시의 표면을 따라서 작동하게 됩니다
이런 식으로 나이아가라 같은 경우에는
단순히 기본 제공되는 모듈에서 벗어나서
스크래치 패드와 혹은 익스프레션과 같은 형태로
우리가 임의로 조작해서
사용할 수 있는 기능들이 있습니다
마무리하기에 앞서서
여러분들이 지금 보시는 것처럼
이 큐브가 Voxel이 계속해서 깜빡깜빡 거리면서
왔다갔다 이렇게 이동하는 게 눈에 좀 거슬리시죠
이거는 파티클이 계속 사라졌다가 생겼다 하면서
위치들이 랜덤하게 잡히다 보니까
이런 일이 생기는 건데
이때는 Emitter State를 한 번만
Emitter가 한 번만 작동되게 해 주시고요
그러면 시간이 지나면 서서히 사라질 겁니다 이런 식으로
근데 Rate 값이 아닌 Burst를 추가해서
한 번에 이를테면 1000개가 생성되라든가
이런 식으로 세팅 값을 바꿔 주시고
그러면 한 번에 생성됐다 한 번에 사라지죠
다만 사라지지 않게끔 파티클의 스테이트
이것을 Particle Kill 되는 기능을 해제해 주시면
계속해서 파티클이 유지가 됩니다
Initialize Particle 항목에서 Lifetime이 몇이 되건
Particle State가 Kill되는 항목을 비활성화해 주시면
생성된 파티클이 사라지지 않고 계속 유지가 되기 때문에
이런 식으로 파티클의 입자수를
어느 정도 여러분들이 일정하게 유지할 수 있게 되고요
그렇게 되면 가만히 있는다고 했을 때
깜빡거리는 증상을 완화시켜 줄 수 있습니다
여러분들이 보기 좋다고 생각하는 밀도를
지금 UserGrid 5에 맞춰 가지고
1,000개를 생성하거나 혹은 2,000개를 생성하게끔
이 상태가 마음에 든다 라고 하시면
이것도 New Expression을 이용해서
대문자 U로 시작하는 User.UserGrid
UserGrid를 아까는 UserGrid 나누기
큐브의 사이즈만큼 해줬는데
이번에는 나누기를 앞에다 하겠습니다
10000/UserGrid 이런 형태가 되게끔
10000은 그냥 임의의 숫자입니다
엔터를 해주시면 10000 나누기 5가 되면서
2,000개가 생기게 되죠
당연히 그리드 사이즈가 많아지면, 커지게 되면
파티클의 개수는 자연스럽게 줄게 되고요
그리드 사이즈가 작아지게 되면
파티클의 생성 개수가 늘어나게 되겠죠
이걸 꼭 10000을 안하시고
이걸 20000, 30000 이런 식으로
임의의 숫자를 주시면 됩니다
그러면 자연스럽게 이렇게 파티클들이
밀도들을 이렇게 제어를, 그리드 사이즈에 맞춰서
사용해 줄 수가 있게 되고요
이런 식으로 그래서 지금 연계된 것들이
스폰 개수도 유저의 그리드 수에 맞춰서
그리고 Voxel의 간격도 UserGrid에 맞춰서
파티클의 사이즈도 UserGrid에 맞춰서
이런 식으로 차곡차곡 연계를 해 두신다면
조금 더 단일한 값 한두 개만 가지고도
제어하기가 쉬워지겠죠
이상으로 스켈레탈 메시와 연계된
나이아가라 이펙트 마무리 하겠습니다
이번 시간에는 스켈레탈 메시를 활용한
파티클 기법에 대해서 알아봤습니다
단순히 정적인 위치에서 제어되는
기존의 파티클들과는 다르게
메시를 기본 베이스로 두고 활용하다 보니
고려해야 될 사항이 많았습니다
나이아가라 구성뿐만 아니라 블루프린트 상에서
컴포넌트의 구성까지 고려해야 하는 만큼
스켈레탈 메시를 활용한 파티클 제작은
사전에 고려해야 될 사항이 많습니다
하지만 제대로 활용할 수 있게 된다면
나이아가라만을 이용해서 제작하는 파티클들과는 다르게
굉장히 다이내믹한 효과를 제작할 수 있으니
다양하게 활용해 보시면 좋을 것 같습니다
이상으로 언리얼 이펙트에 대한 강의를
마치도록 하겠습니다
감사합니다
스켈레탈 메시를 활용한 파티클 기법 스켈레톤 애셋 Content > Characters > Mannequins > Meshes에서 SK_Mannequin 애셋 선택
뷰포트에서 Character > Bones > All Hierarchy 선택 FX_FootStep 제작
나이아가라 시스템에서 Fountain 템플릿 선택 후 FX_FootStep으로 이름 설정 ShapeLocation, Gravity Force 비활성화
Emitter State의 Loop Behavior: Once, Loop Duration 0.2 설정
Initialize Particle의 Lifetime min 0.2, Lifetime max 0.3 설정
애니메이션 시퀀스 애셋 뷰포트 우측 상단 애니메이션 시퀀스 아이콘 선택 애셋 브라우저창에서 MF_Run_Fwd 더블 클릭 타임라인창 Notifies 항목 Track 클릭 후
Add Notify Track 선택하고 step로 트랙 이름 설정 발이 닿는 시간대에 마우스 우클릭 후 Add Notify > Play Niagara Particle
Niagara System: FX_FootStep 연결 왼쪽 발이 땅에 닿을 때 Rotation Offset : x -90, SocketName: ball_l 오른쪽 발이
땅에 닿을 때 Rotation Offset : x 90, SocketName: ball_r FX_Ribbon 생성 나이아가라 시스템에서 Dynamic Beam 템플릿 선택 후
FX_Ribbon으로 이름 설정 Beam Emitter Setup, Spawn Burst, Spawn Beam, Beam Width, Update Beam 비활성화
Spawn Rate 모듈 추가 후 Spawn rate 10 Initialize Particle에서 Lifetime 3, Ribbon Width Mode: Direct Set,
Ribbon Width: 5 타임라인창 Notifies 항목 Track 클릭 후 Add Notify Track 선택하고 Ribbon으로 이름 설정 발이 닿는 시간대에
마우스 우클릭 후 Add Notify > Play Niagara Particle Socket Name: head
스켈레탈 메시를 이용한 3D 표면 데이터 활용 FX_SKM 생성 나이아가라 시스템에서 Fountain 템플릿 선택 후 FX_SKM으로 이름 설정
Skeletal Mesh Location 추가 Cpu Access error: Fix Now 클릭 Preview: SKM_Quinn Mesh Sampling Type:
Surface(Triangles), Spawn Rate: 1500 Skeletal Mesh Location 복사 > Particle Update에 붙여넣기
FX_FootStep 제작 블루프린트 클래스에서 Character 클래스 선택 후 BP_SKMfx으로 이름 설정 Mesh 컴포넌트의 Animation Mode:
Use Animations Asset, Anim to Play: MF_Run_Fwd Skeletal Mesh Asset: SKM_Quinn Visible: 비활성화
[+] Add Niagara 컴포넌트 생성 후 Niagara System Asset에 FX_SKM 연결
FX_SKM 모듈 제작 Particle Update에 New Scratch Pad Module 추가 후 이름을 VoxelModule로 변경 Map Get 노드 [+] 클릭 후
Particle Position 추가, Float 추가 후 gridsize로 이름 설정 Particle Position 아웃풋 핀에서 Transform Vector 추가
Map Set 노드 [+] 클릭 후 Particle Position 추가 Round(Transform Vector / gridsize) * gridsize 계산 결과를
Map Set Particle Position에 연결 Sprite Renderer 모듈 비활성화 Mesh Renderer 모듈 추가 후 Meshes [0]에 SM_Cube_01
설정 Lock Axis Enable 활성화 후 Lock Axis 값은 (1, 0, 0) 두 Skeletal Mesh Location 모듈의 Orientation Sampling을
Output으로 설정 UserParameter [+] 클릭 후 Make New > Common > float 선택해 UserGrid로 이름 설정 Mesh Uniform Scale
아래 화살표 클릭해 New Expression 선택 후 (User.UserGrid/50) 입력 Particle State의 Kill Particles When Lifetime
항목, Spawn Rate 비활성화 Spawn Burst 추가 Spawn Count 아래 화살표 클릭해 New Expression 선택 후
(10000/User.UserGrid) 입력