TWA Houdini1/Rigidbody

TWA 후디니 1 RIGIDBODY_18_07 : 모래와 먼지는 어디서 나올까

yiss09 2023. 5. 9. 22:16

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

 

HOUDINI1_ RIGIDBODY

3️⃣ 출동 SIMULATION 기초 이론부터 심화된 내용을 공부합니다. 또한 자동차를 이용한 리깅 시뮬레이션 BASIC을 훈련합니다.

www.twahoudini.com

 

Rigidbody18_07에서는 벽을 부술 때 모래와 먼지가 나오는 것과 같은 효과를 주도록 하겠다.

 

목차

1. POP Speed Limit

2. 모래(Particle)

3. 먼지(Smoke)

 

 


1. POP Speed Limit

 

먼저 차가 벽에 충돌했을 때 파편이 너무 세게 튀는 감이 있어, 그 세기를 조절해주려 한다.

이를 위해서 Frac에 대한 SOP Network 세팅을 해주고, Enable Solver 위에 새롭게 POP Speed Limit을 연결해주겠다.

POP Speed Limit은 충돌에 의해 날아가는 조각의 속도와 회전량에 제한을 둘 때 사용하는 node이다.

Maximum Speed와 Maximum Spin 값을 올려주면 그만큼 조각에 가해지는 힘에 제한이 풀리게 된다.

 

이제 트윅이 완료된 자료들을 좀 더 빠르게 이용해주기 위해서 File Cache에 저장해주겠다.

자동차의 Proxy Simulation의 내용과 Frac Simulation의 내용을 각각 저장해준다.

그리고 Rigidbody18_04의 자료에서 File Cache로 저장된 내용을 불러와 작업을 시작해주겠다.

 

 


2. 모래(Particle)

 

충돌에 의해 파편이 튀었을 때 모래가 튀어나오게 해줄 예정이다.

이때 쉽게 해결해줄 수 있는 node가 있는데, 바로 Debris Source이다.

Debris Source는 Simulation 결과를 토대로 필요하다고 판단되는 곳에 Particle을 생성할 수 있는 Source를 만들어주는 기능을 한다.

하지만 우리는 이 기능을 사용하지 않을 것이다.

1. Debris Source가 작동될 조건에 따로 맞춰서 Simulation을 진행해야하는 구간이 존재한다.

2. Debris Source 없이 작업을 해봐야 얻어갈 수 있는 idea가 있다. 

3. Debris Source 없이도 모래를 구현하는 것은 어렵지 않다.

 

충돌이 일어났을 때 모래가 충돌지점에서 발생되게 해주기 위해서 Interior Group 정보를 이용해주겠다.

그리고 이제 @v를 이용해 충돌지점을 알아내려 한다.

바로 이전 Frame의 속도와 현재 Frame의 속도의 차이를 이용해주려 한다.

이때 이 속도의 차이가 크게 일어나는 부분이 바로 방향의 전환이 인위적으로 일어나는 부분이다.

전환이 일어나는 부분의 세기는 다른 순간에 비해 강할 것이다.

이를 이용해 속도의 차이가 정해준 Limit 값보다 크다면 충돌이라고 인식하게 하여 붉은색으로 표시되게 해주겠다.

 

Trail로 속도를 구해주고 Point에 만들어진 속도 정보를 Primitive로 옮겨주겠다. 그리고 한 Frame 전의 정보도 속도를 구해주고 똑같이 Primitive로 정보를 넘겨준다.

이제 한 Frame 전의 속도 정보를 가져와 지금의 Frame의 속도 정보에서 빼주도록 하겠다.

이때 얻은 속도 정보를 length function으로 float 정보로 얻어준 뒤, 이 float 값이 Limit보다 클 경우 붉은색으로 표시되도록 해준다.

 

붉은색이 과하다면 Solver 안에서 이전 Frame의 정보에 색이 계속 빠지도록 해주겠다.

이때 색에 대한 정보만이 영향을 받도록 Attribute Copy로 Cd의 정보만을 빼내어 Output으로 출력시켜주겠다.

 

그 다음 충돌에 일어날 때 변하는 부분인 @Cd.x 값을 density로 이용해주겠다.

이 density 값에 따라 Scatter로 점을 구해준다면, 충돌이 일어나는 부분에만 점을 뿌려줄 수 있게 된다.

 

이제 Dop Network 안에서 Particle Simulation 세팅을 해줌으로써 Scatter로 뿌린 점들에서 파티클들이 쏟아져 나올 수 있도록 해주겠다. 모래와 같은 느낌이 들도록 friction 값을 높여주고 bounce 값을 낮춰주겠다.

 

그리고 파티클들이 벽에 충돌할 수 있도록 Static Object에 Frac의 정보를 불러와 충돌 조건으로써 이용하겠다.

이때 Static Object의 Bullet의 방식을 Convex Hull이 아닌 가장 비효율적이라고 했던 Concave로 이용하겠다.

그 이유는 각각의 조각이 이미 계산되어 있어 단순히 충돌조건으로써 이용되는 것이기에 큰 부하를 받지 않는다.

여기서 좀 더 자연스러운 느낌을 원한다면 POP Wind로 파티클의 움직임에 Noise를 주면 된다.

 

멀리 떨어져 나간 조각에서도 같은 양의 파티클이 생성되는게 아쉬워 수정해주겠다.

Add로 충돌이 일어나는 지점의 위치정보를 구해주고, 그 정보를 이용해 충돌이 일어난 지점으로부터 모든 점의 위치의 거리를 구해주겠다.

그리고 @density 값을 거리 값으로 나누어주면 거리가 멀면 멀수록 density 값이 줄어들어들게 된다. 만약 훨씬 더 급격하게 값이 줄어들기를 원한다면 거리 값을 제곱하면 된다.

또한 점들에게 제공된 속도 값에 Attribute Random으로 랜덤하게 날아가게 하여 조금 더 자연스러운 느낌을 줄 수 있다.

트윅이 완료되었다면 File Cache로 Simulation을 저장해주겠다.

 

 


3. 먼지(Smoke)

 

이번에는 충돌이 일어났을 때 충돌지점에서 먼지가 발생하도록 해주려한다.

방금 만들었던 시스템을 복사해서 연기 발생에 이용해주도록 하겠다.

이번에는 Interior Group이 아닌 충돌지점 전체에서 연기가 발생되도록 해주겠다.

Scatter로 뿌려준 점을 VDB from Particles를 이용해 Fog VDB로 만든 뒤 사이즈를 조절해준다.

 

그 다음 Dop Network를 하나 더 만들어 Smoke 세팅을 해준다.

그리고 Frac으로부터 Trail로 @v 값을 구해주겠다. 이때 Unpack에서 바로 속도 값을 가져오는 방법도 있다. 이 방법을 사용하면 Trail에 비해 조금 빠르지만 정교하지 않은 결과를 얻을 수 있으니 상황에 맞게 잘 이용하자.

그리고 Add로 점만을 남겨준 뒤 VDB from Particles로 Point Attribute에 있는 @v 정보를 Volume에 이용될 Velocity 정보로 변환해주겠다. 이때 얻은 정보의 이름은 velfrac으로 해주겠다.

 

방금은 조각에 대한 vel 정보를 구해주었다. 이번에는 파티클에 대한 vel 정보를 구해주려 한다.

파티클 Simulation에 VDB from Particles을 달아 똑같은 방식으로 vel 정보를 구해준다. 이름은 차이를 두기 위해서 velpop으로 하겠다.

그리고 속도에 영향을 주고 싶다면 vector 값을 곱해주거나, Volume Source에서 Scale 값을 조절해주면 된다.

 

연기가 위로 가는 효과를 주기해서 @density 값을 temperature 그릇에 담아주겠다.

어느정도 올라가다가 멈추게 해주기 위해서 Animation을 주겠다.

 

마지막 트윅으로 Gas Turbulence, Gas Shred, Gas Disturb로 좀 더 자연스럽게 연기를 만들어준 뒤, Volume Visualization으로 연기에 먼지같은 색을 입혀주겠다.

 

Brute로 작업한 결과이다.