TWA Houdini1/Rigidbody

TWA 후디니 1 RIGIDBODY_18_08 : RENDER & 치핑보다 작은 모래 조각

yiss09 2023. 5. 18. 15:34

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

 

HOUDINI1_ RIGIDBODY

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

www.twahoudini.com

 

Rigidbody18_part8에서는 지난 시간 만들어둔 Simulation 자료들을 랜더해볼 예정이다.

랜더해줘야할 자료들이 복잡해진만큼 랜더에 들어가기 전 몇 가지를 부분을 수정해줄 예정이다.

 

목차

1. 기본 출력 준비

2. 면 정리

3. 모래에 부피감 주기

 

 


1. 기본 출력 준비

 

우리가 랜더할 Frame 범위 안에 모든 자료들이 있어야 랜더 과정에서 오류가 발생하지 않는다.

이에 Switch node로 Simulation이 시작하기 전과 끝난 후의 내용을 Null로 교체시켜주는 작업을 해주겠다.

 

Frac의 경우에는 Simulation 이전에도 벽이나 기둥이 살아있었으면 한다.

TimeShift로 Simulation이 시작할 부분을 고정시켜준 뒤 시작 Frame 이전의 내용을 TimeShift로 고정된 결과로 두겠다.

 

그 다음 Car와 Brute 각각 따로 Mantra 세팅을 해주겠다. 동시에 둘을 출력하는 것이 아니라 따로 출력해줄 것이기 때문이다.

이에 카메라 및 조명도 각각 따로 잡아준다.

 

이제 Material 세팅을 해줄 차례이다. 먼저 car_main부터 작업하겠다.

car의 경우에는 18_03에서 만들어둔 메터리얼 세팅을 Simulation에 치환시켜줄 예정이다.

Transform Pieces를 이용하려하는데 이를 위해선 @name이 같아야 한다.

Group Expression를 이용해 메터리얼 자료에 Group을 가지게 해준 후 Pack해준 뒤, 해당 그룹의 파츠에 Simulation에서와 동일한 이름을 입력해주겠다.

결과를 보면 잘 치환되어 Simulation이 작동하는 것을 볼 수 있다.

마지막으로 치환된 물체를 Unpack해주어 다시 Material 정보가 이용될 수 있는 상태로 만들어주겠다.

 

Smoke의 경우에는 이전에 복잡하게 작업했던 것과는 달리 Material Palette에서 Basic Smoke를 꺼내와 간단하게 작업해주도록 하겠다.

 

Frac과 Particle은 각각의 Material Network를 생성해 그 안에 쉐이더를 만들어 Material을 주었다.

 

 


2. 면 정리

 

Render한 결과를 보면 car_frac의 벽에 Voronoi의 결에 따라 갈라져 있는 것이 보인다.

충돌에 의해 부서지지 않는 조각들을 하나의 큰 조각으로 만들어줄 예정이다.

 

먼저 어떤것이 움직이는 조각인지 움직이지 않는 조각인지를 구별해주겠다.

Timeshift로 충격이 발생되기 전의 구간과 충돌이 발생된 직후의 구간을 고정시켜주겠다.

그리고 두 정보의 Point와 Primitive 갯수가 같기에 두 구간에서 위치 정보가 다른 부분의 point들을 제거시켜주도록 하겠다. 충격에 의해 움직이지 않은 조각들만 남은 것을 확인할 수 있다.

방금 조건에서 위치가 다른 것이 아니라 같다고 바꿔준다면 날라간 조각들의 정보만을 얻을 수 있다.

 

방금 얻은 움직이지 않는 조각들의 정보를 Bound로 하나의 Box로 만들어주겠다.

그리고 Boolean(Subtract)을 이용해 Bound에서 날아가는 조각들의 정보를 빼주겠다.

이때 예상외로 변화가 일어나지 않을 것인데, 이는 충돌이 일어날 조각들의 면이 닫혀있지 않기 때문에 발생하는 문제이다.

Remesh to Grid로 여러 조각들을 하나의 닫힌 조각으로 만들어주겠다.

 

하지만 아직 이 상태만으로는 Boolean이 작동하지 않는다. Bound의 크기보다 방금 만든 조각의 좌우 폭이 작기 때문에 Boolean이 빼주어야할 물체로 인식하지 않는 것이다.

이에 각각의 조각들의 사이즈를 키워주겠다.

그대로 Transform node를 이용하면 조각들의 Centroid가 조각의 중심이 아니기에 원했던 결과가 나오지 않는다.

조각들을 Add로 점만을 남겨 얻은 위치 정보를 Copy to Point로 조각에 Instancing 해줌으로써 Centroid를 맞춰주겠다.

그리고 @pscale을 조절하여 조각의 사이즈를 약간 키워주겠다.

 

이렇게 조각들의 사이즈를 조절해줄 수 있게 되었다면, 다시 Unpack해준 뒤 Remesh to Grid로 하나의 닫힌 조각으로 만들어주겠다.

그리고 Boolean을 작동시켜주면 Bound가 조각의 모양대로 잘려나게 된다.

움직이지 않는 조각들을 하나의 큰 조각으로 만들어주었다.

 

이번에는 충돌이 일어난 조각에 대해서 작업해주겠다.

아까 얻어낸 충돌이 일어난 부분의 조각 정보와 전체 Frac 정보를 가져오겠다.

이때 둘의 Point와 Primitve 갯수가 다르기에 방금과 같은 방식을 이용하지는 못한다.

둘이 동시에 가지고 있는 정보, 바로 @name을 이용해 Transform Pieces로 이름이 같은 부분만 움직일 수 있도록 해주겠다. 

이렇게 얻어낸 조각을 앞의 큰 조각과 합쳐주겠다.

공중에 떠 있는 조각은 Blast로 직접 선택해 제거해주겠다.

 

그리고 Switch로 충돌이 일어나기 전에는 bound가 이용되도록 해주다가 그 뒤에는 새롭게 얻어낸 조각들을 이용해주겠다.

 

랜더 결과를 보면 의도했던 대로 벽이 깔끔하게 출력된 것을 볼 수 있다.

 

brute_frac의 경우는 Voronoi Fracture로 인한 갈라짐이 크게 거슬리지 않기 때문에 수정해주지 않고 그대로 이용해주겠다.

 

 


3. 모래에 부피감 주기

 

이제 Particle을 작은 모래조각처럼 묘사해주려 한다.

Copy to Points로 Sphere를 이용해주는 방법도 있지만 좀 더 자연스러운 느낌을 위해 다른 방법을 이용해보겠다.

크기가 조금씩 다른 여러 조각들로 만들어준 다음 랜덤한 seed 값으로 그 양을 조절해줄 예정이다.

 

Platonic Solid를 꺼내 Voronoi Fracture로 조각낸 다음 Assemble로 조각들을 Pack해준다.

조각들의 사이즈 조절을 위해서 각각의 조각들의 중심을 {0,0,0}으로 잡아주겠다.

그리고 Unpack 해준 뒤 Transform을 달아 크기를 조절할 수 있도록 해주고 다시 Pack해주겠다.

모든 조각의 중심이 0으로 고정되어 모여진 것을 볼 수 있다.

 

그리고 Input2로 들어갈 정보에는 @id에 따른 seed 값으로 point의 갯수가 조절되도록 해주겠다.

그 다음엔 id를 Scatter로 나뉘어진 조각의 갯수로 %(modulo)하여 그 나머지에 따라 몇 번째 조각을 쓸지를 정해주도록 하겠다. 이때의 나머지를 @pid라 하겠다.

각각의 조각의 넘버가 방금 얻어낸 pid와 다를 경우 지워주도록 하겠다. 그렇게 되면 정보가 같은 조각만이 남게 되어 이용된다.

이렇게 얻어낸 조각을 Copy to Points의 Input1에 넣어주도록 하겠다.

 

방금 만들어낸 시스템을 가장 큰 모래조각으로 하고, 시스템을 복사하여 중간 정도의 사이즈의 모래조각으로 Tweak 해주겠다.

가장 작은 모래는 Sphere를 이용해주겠다.

 

작은 것의 양은 많이 그리고 크기가 커질수록 그 양은 적게하여 적당한 단계감을 가지도록 Tweak해주는 것이 중요하다.

Tweak이 완료되었다면 File Cache로 저장해 랜더 과정에서 불필요한 계산 과정을 줄여주도록 하겠다.

이렇게 모든 조각을 Voronoi로 해결하는 것이 아닌, Particle을 이용해 작은 조각들과 모래를 묘사해주는 과정이 있었다.

 

사양이 낮아 렌더링에 걸린 시간이 38시간이 넘었고, 결과물의 퀄리티도 그다지 좋지 않았다. 이후에 더 높은 퀄리티의 결과물을 뽑아내려면 확실히 컴퓨터 사양을 업그레이드 해야 할 필요가 있을 것 같다.

 

Brute의 경우에는 시간도 너무 오래걸릴뿐더러 렌더링 중 오류가 발생해 결과물을 뽑아내지 못하였다... 아쉽게나마 Viewport에서의 모습이라도 가져와보았다.