블로그

VFX Graph Study (07-04) 본문

Unity/VFX Graph

VFX Graph Study (07-04)

confielder 2022. 7. 4. 19:36

Keijiro의 VFX 예제들을 보며 사용하기 좋은 몇 가지들을 가져왔다.

 

1. Random Walk

Openframeworks을 공부할 때 Random Walk라는 파트를 본 적이 있다. 랜덤한 값을 컨트롤하는 개념으로 어떠한 값이 얼마 더 혹은 덜 나올지, 어떠한 주기로 나올지 등등을 컨트롤 하는데, VFX Graph에도 이러한 Random Walk의 좋은 예시를 Keijiro가 간단하게 풀어냈다.

 

 

Delta Time은 프레임과 프레임 사이의 초를 나타내는데, 60FPS 일 때 Delta Time은 1 / 60 = 0.016ms 가 된다.

 

 

이를 Frequency와 곱해줘서 Delta Time이 증가하는 속도를 정해준다. Compare의 Right 값이 대략 0.048이라고 가정하면Random Number(0~1 사이의 소수들을 리턴) 가 0.048보다 작으면 True 크면 False를 리턴한다. 그래서 Frequency가 커지면 True를 반환할 확률이 높아져서 움직임이 많아지는 것이다. 

 

 

나머지 내용들은 Velocity 바꾸는 내용이니 그리 중요하지 않다. 여기서는 Velocity를 바꿨는데, 컬러나 각도 등을 바꾸면서 응용하면 자주 쓰일 것 같다 Sub Graph 도감에 등록!

 

 

2.Set Alive

파티클을 숨길 때 보통 alpha를 넣거나 Size를 조정하는데, Set Alive라는 블록을 통해서도 제어할 수 있다. 알파나 사이즈 같은 경우는 보이는 파티클이나 안보이는안 보이는 파티클 둘 다 공유하여 사용하는 값이지만, Alive는 안 보이는 물체는 Bool 연산을 통해 안 보이게 하는 역할이라 우리가 딱 원하는 용도로 사용되어 편할 것 같다.

 

이 그룹을 Alive에 넣어주면 Perlin Noise의 값이 0.4 이상인 부분만 보이게 할 수 있다. 이렇게 개별 파티클마다 Alive를 줄 수 있는 걸 인지하자. 참고로 저 Vector 3 Scroll은 SubGraph로, 계속 증가하는 Time이 Vector3 개별 값마다 있는 단순한

노드이다.

 

 

3.Particle ID 응용

파티클ID는 파티클마다 정해지는 Index이다. 이 값을 이용하면 Particle마다 각자의 값을 지니게 할 수 있는데, 예를 들어

노이즈의 좌표 쪽을 보면 Position과 ParticleId가 더해진 것을 볼 수 있다. 이렇게 하면 파티클마다 각자 다른 Noise 값을 가질 수 있으며, 노이즈의 정해진 패턴을 최소화할 수 있다. 그리고 한 가지 더 말하자면 Sample Curve는 굉장히 파워풀하기 때문에 사용할 일이 있으면 적극 활용하자.

 

 

4.Initialized Velocity & Updated Force

파티클을 움직일 때 보통 Update에서 Force나 Velocity 등을 추가하여 움직인다. 하지만 Initialize 콘텍스트에서 Velocity를 지정하고, Update에서 또 다른 Force를 주면 더욱 다양한 움직임을 줄 수 있다.

 

 

두 힘이 서로 더해져서 파도, 물 , 회오리 등등의 움직임을 줄 수 있고 물리학적인 지식이 많이 요구되지만 아래의 예시처럼 각도에 따른 힘을 지정한 뒤, 업데이트에서 Force를 주는 등의 간단한 효과 또한 만들 수 있다.

Rotate 3D는 각도를 기준으로 회전시키는데, 각 파라미터들이 어떤 역할을 하는지 헷갈릴 수 있다.

 

Rotation Center는 회전축을 의미한다. 이해하기 쉽게 바퀴를 상상해보면 바퀴의 회전축은 바퀴 중간이고, X축을 기준으로 

회전하니 Rotation Axis는 X이다. 

 

그리고 Position이 있는데 이는 회전축 사이의 거리로, 바퀴의 가장자리 부분이 회전축 부분보다 빠르게 회전하니, Position을 게 줄수록 더 빨리 회전한다.

위 그래프를 사용한 결과물

 

 

5. 소용돌이 움직임

소용돌이 움직임을 위해서는 총 3개의 Force가 필요하다. 

 

1.도는 힘

2.도는 방향

3.앞으로 가는 힘

 

1.도는 힘

 

(지금 설명하는 노드 구성은 모두 Force - Absolute에 연결함)

우선 Position의 Lenght를 구하고 Radius에서 빼준 값을 포지션과 곱해주면, 포지션이 일정 거리 이상 떨어지면 음수로, 그 반대는 양수로 표현하기 때문에 왕복운동을 하게 된다.

 

 

여기서 Lengh에 Reciprocal한 값을 곱해주면 Lengh가 큰 값은 작아지고 작은 값은 커져서 좀 더 균일한 움직임을 표현할 수 있다. 참고로 Reciprocal은 입력값을 1에 나눠주기 때문에 예를들어 3을 넣으면 0.3, 0.5를 넣으면 2 가 되기 때문에 균일한 움직임을 표현할 수 있는 것이다.

 

 

2.도는 방향

 

도는 방향은 간단하게 외적으로 나타낸다. 외적은 쉽게 말해 두 벡터의 수직인 벡터를 반환하는데, 포지션과 z 축에 수직인

벡터 즉 앞에서 봤을때 원모양이 생기도록 움직인다. 사실 외적에 대해 깊게 알고 싶지만 수학이 좀 약해서 간단히만 이해

하고 넘어감..

 

 

3.앞으로 가는 힘

이건 단순하게 z 축으로 랜덤한 값의 Force를 주면 된다.

 

 

결과물

 

 

'Unity > VFX Graph' 카테고리의 다른 글

[VFX Graph] Attribute "Current"와 "Source"의 차이  (0) 2022.07.04
VFX Graph Study (06-12)  (0) 2022.06.12