본문 바로가기

Houdini/Houdini1_Rigidbody

RIGID BODY_20 건물 붕괴 + 빌딩 에셋 제작 - Ep20_Part 06. 볼륨 소스 나이스하게 구하기 + 연기 시뮬 -> END


충돌체의 density가 각각 50, 500, 5000인 결과를 file cache로 구워서 작업을 진행하기로 한다.


smoke

  • 연기를 만들기 위해 가장 먼저 필요한 것은 source이다.
    • 어디에서 연기를 발생시킬 것인가
  • volume의 충돌 / 연기가 어떠한 물체와 상호작용할 것인지 정해줘야한다.
  • 연기의 기본 shape을 잡아줘야한다.
  • 연기의 detail 작업

source 만들기

source를 잘 만들면 연기는 70% 이상은 해결했다고 봐도 좋다.

 

고민해야할 것은, 어디에서 연기가 나야할까?

당연하게도 충돌이 발생하는 곳에서 연기가 나는 것이 맞는데, 이것을 houdini가 어떻게 판단하느냐? 를 고민해야하는 것이다.

 

핵심 포인트는 '속도의 변화-가속도' 이다.

 

충돌체가 10의 속도로 날아가고 있다면, 계속 10의 속도로 날아가고 있을 때 연기가 발생하지는 않을 것이다. 속도가 급격하고 치명적이게 바뀔 때, 연기가 난다고 보면 된다.

 

연기가 나는 모습을 확대해서 detail하게 보이도록 작업을 할지, 멀리서 연기가 발생하는 것을 건물 전체적으로 보여주도록 작업을 할지 정해줘야한다.

강의에서는 전반적으로 건물과 거리를 두고 건물의 벽이 무너지고 연기가 발생하는 모습을 전체적으로 담는 작업을 진행한다.

 

멀리서 건물을 바라보게 되면, 파편들이 마치 파티클처럼 작게 보이게 된다. 이 말은 곧, 파편들을 전부 사용할 필요는 없다는 뜻이 된다.

 

add 노드로 primitive를 날려주도록 한다.

작업 전에 필요한 정보와 불필요한 정보를 확인해서 정리하는 습관을 기르자.

뭐가 너무 많다.
불필요한 attribute와 group을 다 날렸다.

결국은 volume으로 source를 만들게 되겠지만, 일단 시작은 정보를 다루는 것이 우선이다.

속도가 변하는지 변하지 않는지에 대한 것은, 1frame 이전 frame(혹은 1frame 이후 frame)의 속도와 현재 frame의 속도의 차를 확인해보면 된다.

이제 두 프레임의 속도의 차이인 v@acc의 크기를 length로 구해준 뒤, 일정값보다 작으면 포인트를 지우도록 해줄 수 있을 것이다.

그리고 이제 저 포인트들이 그리는 궤적을 알기 위해 trail을 달아준다.

name이 같은 trail을 연결해주면 아래와 같은 궤적을 얻을 수 있다.

이 중에서도 충돌이 쌔고 명확한 결과가 필요한 것이므로 길이가 너무 짧은 primitive는 지워주도록 하자.

 

남아있는 primitive에 부피감을 주기 위해 polywire 노드를 연결해준다.

 

이제 volume으로 바꿔주도록 하자.

  • 주의할 점은 현재 사이즈가 굉장히 크다. 그렇기 때문에 voxel size를 0.1로만 해도 컴퓨터 및 houdini가 터질 수 있다. 조심해야한다.

vdb from polygons 로 얻은 density 정보를 가지고도 volume source로 활용이 가능하지만, 좀 더 확실하게 부피감 있는 것을 source로 사용하기 위해 convert VDB를 사용해서 다시 polygon으로 바꿔준다.

  • 상황에 따라서 사용하면 된다.

 

부피감을 확인하기 위해서는 연결된 조각들끼리의 면적을 구해주도록 한다.

packing해줬던 정보는 다시 unpacking해준다. 그리고 다시 volume으로 변환해준다.

위의 영상에서는 잘 보이지 않지만 선생님 강의에서는 건물이 두동강나면서 위의 덩어리가 떨어질 때 충격을 받으면서 불필요한 volume을 생성하게 된다.


추가) 뚫어버리는 값을 찾아내고야 말았다!!!


생각을 해보면 건물이 부딪혔기 때문에 volume이 발생한다 해도 그럴싸 할 수 있다. 하지만, 충돌체가 건물을 뚫어버림에 따라 만들어지는 volume과는 결이 같은 방식은 아닐 것이다. 

그렇기에 위의 덩어리에 대해 volume을 만들고싶다면, 따로 무언가 조절을 해주는 것이 도움이 될 것이다.

  • 애초에 위의 덩어리는 volume을 생성하는 사이클에서 제외시킬수도 있을 것이다.

연기의 충돌조건 때문에라도 조절이 필요하다.

SDF를 구해주고, 어떤 모양으로 충돌이 발생할지 확인을 위해 convert VDB(Polygon)를 적용한 결과이다. 이것을 가지고 충돌조건으로 사용을 해도 가능하지만, 치명적인 단점이 존재한다.

  • 자료의 연속성이 부족하다.
    • 현재 frame에서는 존재하던 충돌조건이 불과 몇 frame 이후에는 사라지는 수가 있다.
    • 이로 인해서 volume 정보가 불필요하게 갇혀버리는 경우가 발생할 수 있다.
      • 이렇게 되면 volume이 씹히면서 소멸되어버리거나, volume 정보를 충돌조건이 뱉어내게 되면서 의도와는 다른 결과를 도출하게 된다.
  • 밀도가 씹혀서 사라지는 순간이 발생한다.

그리고, 건물이 두동강 날 때, 위의 덩어리가 아래 덩어리를 덮치게 되는 상황에서도 문제가 발생한다.

위의 덩어리와 아래 덩어리가 충돌하기 전까지 그 사이에 생성되어있던 volume 데이터는

이와같이 두 덩어리가 충돌하게 되는 순간, 충돌조건이 붙어버리고, 그 사이에 있던 volume 정보들은 씹혀서 사라지거나, 밖으로 튀어나가버리게 될 수 있다.

 

그래서, 선생님이 제시한 솔루션으로는

맨 윗 덩어리는 떼어내고, 충돌이 발생하는 중간 덩어리는 쓰지 않고, 맨 윗 덩어리를 더 간단한 조각으로 바꿔주고, 맨 아래 덩어리도 좀 더 간단한 조각으로 바꿔주도록 한다. 그리고 연속성을 유지할 수 있는 충돌조건을 만들어줄 예정이다.

 

찌그러진 박스가 보이는가...?

무너지지 않은 부분을 활용해서 box를 만들어주도록 한다.

위의 정보는 smoke 시뮬레이션에서 충돌조건으로 사용하게 될 정보이다.

  • 그리고 smoke가 생성되지 않도록 할 부분이기도 하다.
  • 큰 덩어리가 바닥에 부딪힐 때 작업자가 원치 않는 충격에 대한 volume이 생성될 수 있기 때문에, 애초에 건물 cache 에서 primitive를 지워서 point를 얻어낼 때, 위의 범위에 해당하는 포인트는 사용하지 않도록 해주면 될 것이다.

기둥을 기준으로 box를 만들어줬기 때문에 선택영역이 조금 모자란 상태이다.

for each connected piece 블럭으로 각 조각별로 스케일을 조절해주는데, 그냥 막바로 primitive 노드를 사용해서 스케일을 조절하면 원하는 모양에서 깨짐이 발생한다. 그렇기 때문에 packing 해준 뒤, 스케일을 조절해주고, 다시 unpacking 하는 과정을 거쳐서 조절해준다.


연기를 내기 위한 준비물

  • 밀도정보
  • 온도정보
    • 뜨거운 연기가 위로 올라가는것처럼 묘사되어서 자연스러운 연기가 발생하게 된다.
  • 조각이 발생시키는 바람(velocity field)
    • 조각들이 만들어내는 속도정보를 활용해서 velocity field를 만들어낼 수 있다.
  • 연기와 충돌정보를 직접적으로 계산할 조각정보

 

source 세팅을 진행한다.

 

선생님은 volume noise fog 노드를 사용하는 것에 대해 말씀해주셨다.

(하지만 18버전은 저 노드가 없다... 퀄리티의 아쉬운 부분은 volume vop으로 충당해야한다.)

 

temperature를 사용해서 연기가 올라가도록 해보자.

 

smoke solver의 buoyancy lift(온도에 따라 올라가는 힘)을 조절해보자.

buoyancy lift 10

 

현재 충돌체 sphere가 연기를 누르고 들어가는 느낌은 들지 않는다. 충돌조건을 넣어주지 않았기 때문이다.

static object로 충돌조건 col을 넣어준다.

 

이제 vector field를 만들어주자.

속도가 너무 과하다.

  • velocity에 대해서는 scale 값을 굉장히 낮춰서 사용하는 것이 도움이 된다.

velocity scale 0

 

buoyancy lift의 값을 조금 낮추고 temperature의 scale 값을 올리면 어떻게 될까?

온도와 관련된 두 parameter를 줄여보자.
위의 두 parameter가 0인 경우
temperature scale을 좀 더 낮춘 경우

연기의 shape을 잡기 위한 노드는 아직 사용한 것이 없다.

gas turbulence 적용

gas turbulence를 적용할 경우(다른 것도 마찬가지이지만) 현재 건물의 크기와 연기의 규모가 매우 큰 편이기 때문에, 이전에 작업했던  swirl size 혹은 scale을 생각하면 티가 안날 것이다.

 

scale 4 / swirl size 1
gas shred 적용


해상도를 조금 더 높여주고, 불을 표현해보도록 하자.

불을 표현하기에 앞서 확인해봐야할 부분이 있다. 현재 연기의 밀도정보 density가 0~1사이의 값으로 존재하는가? 이다.

 

현재 min / max 가 각각 0 / 1 일 때, 

이와 같이 색을 넣어줄 경우,
이런 결과를 얻을 수 있다.
min / max 를 0 / 2로 바꿨지만, 아직 파란 부분이 존재한다.

이 말은 곧, 현재 연기가 가지는 밀도정보 density는 0 ~ 2 이상의 값을 취급하고 있다는 말이다.

파란색이 약간 보일만큼 min / max를 조절해주도록 하자

그리고 이제 emission을 조절해준다.

굉장히 밝게 타고 있다. 이 이유로는 현재 min / max 에 대해서 emit range가 0 ~ 1로 적용되어있기 때문에, density가 1 이상인 부분은 전부 하얗게 타고 있는 것이다.

적절한 수치로 emit range를 맞춰주자.

그리고 연기의 퀄리티를 극적으로 높이는 방법으로, temvel에 변화를 주는 방법이었다. (기억이 안나면 손에 익을때까지 복습이다.)

 


건물이 두동강나는 것은 어찌 된 것인지, 창문이 충격 흡수를 많이 해서 그런건가 제대로 쪼개지질 않아서...

일단 쪼개는 상황에서의 작업을 확인하기 위해서 창문 숫자를 많이 낮췄었다(가장 많은 조각인 style4를 20조각으로...)

 

후반작업을 해보면서 volume에 대해서 많이 잊고 있었구나 싶은 생각이 들어서 또 다시 경각심이 번쩍!!

 

 

역시 안하면 잊는다... 하루라도 놓치면 3일은 멀어진다...

 

선생님의 강의 말미에 하신 말씀이 매우 와닿는다.

 

'이제 진짜 여러분들의 시간입니다.'

 

 

 

 

 

 

이제는 포트폴리오를 위해, 그리고 나의 발전을 위해 작업을 해봐야할 때이다!!!

화이팅!

https://youtu.be/fYbbxzLGpbI