TWA Houdini1/Volumes

TWA 후디니 1 Volume_12 : 전기에 따른 스파크(Particles)

yiss09 2023. 3. 11. 04:06

https://www.twahoudini.com/course/volumes1

 

HOUDINI1_ VOLUMES

2️⃣ 볼륨의 기초이론과 응용 그리고 SIMULATION까지 경험해보세요.

www.twahoudini.com

 

지난 강의에서 만들어둔 준비자료를 가지고 Volume12 강의를 진행하였다.

 

스파크를 만드는 순서이다.

1. 시작점과 끝점이 가지는 기본 방향이 각각의 point 위치에서의 Normal 방향이 되게 해준다.

2. @N 방향으로 결정된 Velocity에 Random한 값을 더해 불규칙하게 튀는 느낌을 준다.

3. 큰 스파크를 먼저 만든 후, 작은 스파크를 만들어준다.

 

 


 

스파크를 만들기 위해서 Source부터 준비해보겠다. 새로운 Geometry를 만들어 이름을 Spark라 하였다.

스파크를 만들기 위해선 Electric_line에서의 시작점과 끝점이 필요하다. Electric_line에서의 큰 전기와 작은 전기의 효과를 가져온다. 

확인을 위해서 Character도 가져온다. Unpack된 부분까지만 가져오도록한다.

 

먼저 big의 Node info를 보자.

big의 Node info에는 electric을 만들때 사용하였던 정보들이 그대로 남아 있는 것을 볼 수 있다. Particle로서 정보를 만들어주었고 점들을 선으로 묘사해주었기 때문에, Particle에서 얻을 만한 정보들이 남아있는 것을 볼 수 있다.

해당 big의 Geometry Spreadsheet을 보면 N의 정보의 값이 너무 작다. 이렇게 값이 작은 이유는 Electric을 작업하는 과정 중에서 어떠한 계산에 의해 값이 작아진 것이다. 이렇게 값이 너무 작으면 우리가 원하는 속도감이 나오지 않을 수도 있기에 다시 Normal을 구해줄 예정이다.

먼저 Clean node로 불필요한 정보(Attributes, Strema)를 전부 날려주겠다.

 

이제 시작점과 끝점만을 분리해줄 예정이다. 중간의 점은 쓰지 않을 것이다. 그리고 분리된 점에 대해 Character와 Grid에서 Normal 정보를 가져오겠다.

For-Each Connected Piece를 이용해 하나로 연결되어 있는 선들에 대해 각각 작업을 해주겠다.

먼저 연결되어 있는 것들만 각각 따로 보기위해서 Single Pass로 확인해보겠다. 

선의 point number를 확인해보면 0번의 시작점과 100번의 끝점을 확인할 수 있다.

Blast로 0번 점과 100번 점을 떼어내어준다.

이때 100번 점의 경우 그냥 100을 입력하여 떼어내어줄 수도 있지만, Sort를 이용해 point number를 reverse한 뒤 0번으로써 떼어내어주겠다. 이러한 방식의 이점은 Geometry에서 Frame마다 발생하는 point의 갯수가 다를 때 동일한 부분의 point를 이용할 수 있다는 점이다.

Single Pass를 꺼준 뒤 다른 점들도 같이 확인한다. 시작점과 끝점만 잘 분리된 것을 확인할 수 있다.

 

현재 point들에는 Normal 정보 없이 위치만 존재하고 있다. 이제 떼어낸 점들에 Normal 정보를 구해줘보겠다.

Character를 가져오고, Grid를 생성해준다(rows,columns : 100x100). 각각 Normal node를 달아 Points에 대한 Normal 정보를 구해준다. 이제 구해준 Normal 정보가 시작점과 끝점의 Reference가 될 것이다.

Attribute Transfer를 생성해, 시작점과 끝점을 Input 1에 Reference의 정보를 Input 2로 연결해준다.

Attribute Transfer에서 Reference로부터 Points에서의 Normal 정보만을 가져오도록 설정해준다. Condition에서 Distance Threshold 값을 낮춰준다.

시작점과 끝점에 기대했던 Normal 정보가 잘 들어온 것을 확인할 수 있다.

 

For-Each Connected Piece와 그 안의 정보를 복사해 Small에 붙여넣어준다.

Character에서의 Normal의 정보가 points에 잘 적용된 것을 볼 수 있다.

 

Particle을 만들어보기 전, 규칙을 정해보겠다.

큰 전기에서 발생하는 Particle은 크고 더 폭발적으로 나오게 만들 것이다.

작은 전기에서 발생하는 Particle은 그 사이즈가 작고, 덜 폭발적인 느낌으로 만들 예정이다.

먼저 Attribute Wrangle을 통해 가지고 있는 Normal 정보를 바탕으로 Initial Velocity를 만들어주겠다.

 

이제 Dop Network를 생성해 Particle 세팅을 잡아준다.

source로서 방금 만들어준 big과 small의 정보를 사용하겠다.

결과를 보면 예쁜 느낌은 아니지만 원했던 것처럼 Normal의 방향으로 Particle이 날아가는 것을 확인할 수 있다.

 

POP Force를 달아 중력을 주어 스파크의 느낌을 가지도록 해준다.

Spark가 튀어오를 Ground Plane도 달아준다.

너무 오래 Particle이 살아있는 느낌이 들어 Life 값을 낮춰주도록 한다.

 

이제 POP Source에서 Initial Velocity를 이용하되 다른 값들을 추가해주도록 하겠다.

정직하게 나오던 Particle이 사방으로 퍼지면서 스파크와 같은 느낌을 가지게 해주었다.

Birth rate를 조절해 Points의 갯수를 줄여준다.

 

이제 Particle에서 Character에 대한 충돌 세팅을 만들어줄 예정이다.

Brute의 Unpack 까지의 정보를 col, Brute의 SDF까지의 정보를 col_sdf라 하겠다.

 Dopnet Work 안에서 Static Object node를 생성해 col_sdf를 충돌에 대한 Volume Sample로서 활용해준다. 이때 Brute Animation을 Static Object에서 작동시키기 위해서 Use Deforming Geometry를 체크해준다.

 

Dop import로 Dop Network에서의 정보를 Geometry 단계로 불러온다.

Dop import 아래에 Trail과 Add를 연결해 Particle을 선으로 만들어준다.

일단 큰 스파크의 형태가 완성된 것을 볼 수 있다. 이제 디테일을 변경해보겠다.

 

스파크를 Smoke, Electric line과 같이 켜주어 그 타이밍을 맞춰보겠다.

마지막에 스파크가 너무 늦게까지 살아있는 느낌이 아쉽다.

POP Source에서 Birth Rate에 Animation을 주어 어느 시점부터 스파크가 덜 나오도록 설정해준다.

 

이제 작은 스파크를 만들어볼 예정이다.

앞선 큰 스파크에서는 크기가 큰 만큼 무게가 있다고 가정하고, Character의 움직임에 따른 Velocity에 영향을 받지 않는 것처럼 묘사해주었다. 하지만 이번에 만들 작은 스파크는 그 사이즈가 작기 때문에 팔을 휘두름에 있어 그 바람에 영향을 받도록 만들어주겠다.

먼저 Smoke에서의 Volume Visualization의 Density Scale을 낮춰 작은 사이즈의 Particle이 더 잘 보이도록 해주었다.

그 다음 s_big에서 해주었던 것과 같이 Attribute Wrangle에서 Initial Velocity 값을 Normal로서 정의해주겠다. 이때 전기의 사이즈가 작기 때문에 너무 빠르기보다는 소숫값을 곱해 그 속도를 늦춰주겠다. 이를 s_small로 두겠다.

 

Dop Network를 새로 생성해 Particle 세팅을 해주었다.

Birth rate에서의 값을 처음부터 적게 주어 그 값을 조절할 수도 있지만 다른 방법을 사용해보겠다.

Birth rate에서의 값을 매우 크게 둔다. 그 다음 Dop Import 아래에 Attribute Wrangle을 달아 확률로서 그 갯수를 줄여주도록 하겠다.

 

이제 Character의 움직임에 따른 Velocity를 이용해줄 차례이다.

가볍게 작업하기위해서 Smoke에서 낮은 해상도의 File Cache를 가져온다.

Blast를 활용해 가져온 정보에서 필요한 velocity 정보만을 떼어낸다.

Convert VDB로 velocity를 VDB 정보로 변환해준다. VDB Vector from Scalar로 Scalar 정보를 하나의 Vector로 묶어준다.

이제 해당 정보를 Smoke_vel이라 하겠다.

 

Dop Network 안에서 POP Advect by Volumes를 생성해 앞서 만든 Smoke_vel의 정보를 활용해주겠다.

Advection Type을 Update Position으로 변경해준다.

이대로 끝나면 좋겠지만 Simulation을 돌려보면 아쉬운 부분을 확인할 수 있다.

우리가 앞서 만든 Smoke에서 온도에 의해 위쪽으로 올라가는 Velocity가 발생했었다. 이 부분을 POP Advect by Volumes의 Velocity Scale에 Animation을 줌으로써 해결해줄 수 있었다. 위쪽으로 올라가는 Velocity가 생길때쯤 Veloctiy Scale 값을 0으로 만들어주었다.

결과를 보면 위

로 올라가는 느낌 없이 Particle이 뒤쪽으로 잘 날라가는 모습을 볼 수 있다.

 

뭔가 아쉬운 점이 있다면, 뒤쪽으로 날라가는 녀석이 바람에 의해 영향을 받아 뒤쪽과 아래쪽으로 땡겨지는 듯한 느낌이 있었으면 한다.

POP  Wind를 달아 y축과 z축에 마이너스 값을 주었다.

완성된 Particle을 Dop Import, Trail, Add, Carve로 선으로 만들고 그 길이를 큰 스파크보다 짧게 만들어주었다.

 

File Cache로 오늘 만든 결과를 따로 저장해주었다.

Brute, Smoke, Electric_line, Spark를 함께 본 결과이다.