본문 바로가기

Houdini/Houdini1_Rigidbody

RIGID BODY_06 SIMULATION 데이터 부르기 + 총알 만들기 - Ep06. DOPNET DATA 이해하고 불러오기 + 총알 모델링

 


수업 진행 순서

  1. Object 자료 준비(모델링)
  2. Simulation Setup
  3. 결과 분석 & Instancing
  4. 출력(RENDER)

 

핵심 스킬들

  1. Object Merge로 시뮬레이션 결과 부르기 & Geometry Spreadsheet 이해하기
    1. 시뮬레이션 결과를 geometry spreadsheet와 함께 대조하면서 보고 이해하고 추가적인 후작업을 할 줄 알아야한다.
      • 처음에는 익숙치 않고 어렵다. 그 이유는 하나의 시뮬레이션 결과에서 제공받는 정보가 굉장히 다양하기 때문이다.
      • 시뮬레이션 결과 중에서 원하는 내용을 임의로 꺼내서 사용할 수 있어야한다.
  2. Sourcing in Dop Network(SOP Solver & SOP Network)
    • 첫번째 스킬을 다룰줄 알아야 올바르게 할 수 있는 내용
    • dop network 안에서 '그릇'만 꺼내두고 그릇에 올리고싶은 물체를 우리가 원하는 규칙에 따라 커스텀하게 올릴 줄 알아야 한다.
      • 파티클에서 pop source를 사용했던 것처럼 물체를 그릇에 불러올 줄 알아야한다.
    • 모션그래픽으로써 후디니를 사용할 것이라면 반드시 마스터해야할 부분
  3. Transform Pieces
    • 쉬운 물체로 빠르게 시뮬레이션을 마치고 해상도가 높은 자료로 전환하는데 사용될 노드
    • 사용자가 원하는, 마음에 드는 장면을 찾기 위해 시간 절약을 위해서라도 반드시 transform pieces 노드를 이용하게 될 것이다.

시뮬레이션에 사용할 총알을 모델링하자.

 

세가지 버전(Proxy, Easy, Hard)을 만들 것이다.

  • Proxy : 시뮬레이션의 빠른 계산에 사용할 버전
  • Easy : 기본 디테일을 가진 버전
  • Hard : RENDER에 사용할 높은 디테일을 가진 버전

총알의 기본 골격을 만들어주자.

이 데이터는 시뮬레이션에서 사용할 충돌데이터(Proxy)이다. 


기본적인 디테일을 가진 버전을 위해 디테일을 추가해보자.


RENDER를 위한 hard 버전을 제작해주자.

  • subdivide 노드를 연결해주면 된다.


데이터 정리를 진행해준다.

  • 불필요한 그룹은 clean 노드로 날려주고, 시뮬레이션에서 불러올 수 있도록 세가지 버전을 merge로 묶어준다.
  • 필요한 버전을 blast로 떼어서 사용하면 된다.


시뮬레이션 세팅을 잡아보자.


(일단 강의는 멈추고 기본 세팅을 잡아봤다.)


(다시 강의 시작)

RBD Packed Object를 이용하고, bullet engine을 이용할 것이기 때문에 그릇에 올릴 오브젝트는 packing해준다.

시뮬레이션에 필요한 initial 정보를 제공해주자.

정보를 제공해주는 방법으로는

  • 지금까지 해온 것처럼 포인트를 만들고 initial 정보를 달아준 뒤 copy to points 노드로 packing된 물체의 point attribute로 달아줄 수도 있다.
  • 또 한가지 방법은 그냥 pack 노드 아래쪽으로 initial 정보를 달아주는 방법이다.

포인트를 생성한 뒤 initial 정보를 만들고 copy to points로 packing된 물체에 정보를 달아주는 방법


pack 노드 아래에 attribute wrangle을 사용해서 initial 정보를 만들어주는 방법


두가지 방법 중 차이가 발생할 수 있는 부분은 copy to points를 사용할 때 오브젝트가 포인트에 복사되면서 방향이 바뀔 수있다는 것이다.

copy to points 사용한 방법
copy to points 사용하지 않은 방법

현재 @N, @up, @orient 등의 어트리뷰트가 없는데도 방향이 바뀌었다. 왜그럴까?

그 이유는 위와 같이 방향에 영향을 주는 어트리뷰트가 없을 때는, 속도(@v)가 방향에 영향을 주기도 한다.

그래서 저렇게 방향에 차이가 발생한다.

 

만약 copy to points를 사용해서 방향변화 없이 위치만 바꾸고 속도를 주고 싶을 때는 방향의 기본값으로 @N 정보를 제공해주는 것이 도움이 된다.

  • 여기에서 말하는 @N의 기본값은 (0, 0, 1), z축 방향이 @N의 기본값이 된다.
    • 이 부분은 약간 특이사항이라 외워두는 것이 좋다.

instancing될 때 @N 값이 들어오지는 않는다.

  • 방향을 정해주고 사라진다.


 

 

여기까지는 큰 힘들이지 않고 직접 뚝딱뚝딱 세팅해서 결과를 만들어낼 수 있어야한다.

여기까지 스스로 세팅을 잡지 못했다면, 반성하자.

 

 


지금부터가 본격적인 부분이다.

오늘 이후로 우리는 몇몇 스킬들을 동시에 활용할 줄 알아야한다.

  1. dop network의 geometry spreadsheet를 이해하고, object merge로 원하는 결과를 불러오기
  2. transform pieces로 물체를 대체해주기.
  3. 원하는 타이밍에 물체 등장시키기

 


먼저 geometry spreadsheet를 이야기해보자.

 

시뮬레이션이 시작되는 시작프레임(강의에서는 11프레임)이 되면, spreadsheet에 변화가 발생한다.

10 프레임의 spreadsheet
11 프레임의 spreadsheet, ground와 proxy_bullet 항목이 더 생겼다. relationships 옆에 + 모양이 생긴것으로 보아 저곳에도 무슨 변화가 생긴듯 하다.

11프레임이 되면, dop network가 작동되면서 우리가 시뮬레이션에 이용할 '그릇'이 생성되는 것이다.

생성되는 그릇이 이름은 우리가 직접 기입해줬던 object name이다.

 

dop network 안에서는 각각의 노드의 결과를 spreadsheet에 따로따로 보여주지 않는다. 그 이유는 dop net 안에서 쓰이는 모든 물체와 관계에 필요한 solver등의 모든 내용들이 한번에 동시에 작동하고 있기 때문이다.

그렇기 때문에 dop net 내부의 어느 중간까지의 결과를 보겠다는 것은 말이 안되는 것이다.

오직 output, 혹은 flag가 켜진 노드를 기준으로 전체의 결과를 한번에 받는 방법밖에 없다.


dop import로 시뮬레이션 결과를 확인해보자.

DOP Network : 시뮬레이션이 진행되는 dop network의 경로를 기입해준다.(혹은 dop network 노드를 drag & drop으로 올려주면 위의 이미지와 같이 경로가 들어간다.)

Import Style

Fetch Geometry from DOP Network : dop net이 제공해줄 수 있는 geometry의 결과를 있는 그대로 보기 위해 설정한다.

 

 

DOP Import의 geometry spreadsheet 결과

 

DOP Import로 총알만 불러와보자.

  • Object Mask에 우리가 확인하고 싶은 물체를 기입한다.

dop network에 제공했던 상태와 마찬가지로 packing된 상태로 들어왓다.

 

ground도 확인해보자.

ground는 packing 과정이 따로 없었기 때문에 있는 그대로 정보를 불러오니 point 100개, polygon 81개의 어떤 정보가 들어온 것을 확인할 수 있다.

 

ground는 움직이지 않았다. 그렇기 때문에 시간이 변하더라도 spreadsheet의 내용이 변하지 않는다.

총알에 대한 정보는 시간이 변함에 따라 계속 값이 바뀌고 있는 것을 확인할 수 있다.

 

이제 초기의 dop import를 확인해보자.

ground와 총알의 구분 없이 있는 그대로 불러온 dop import의 node info이다. 항목이 나뉘어서 polygon 81개, packed geos 1개로 나타나는 것을 볼 수 있다.

point가 101개인 이유는 ground의 포인트 100개에 packing된 물체의 포인트 1개가 더해져서 101개인 것이다.


이제 import style을 비교해보자.

Fetch Geometry from DOP Network 의 경우는 dop network에서 packing 데이터로 사용된 경우는 packing 상태로 import 되고, dop network에서 packing 되지 않았던 지오메트리는 packing 되지 않은채로 import 된다.

 

만약 import style을 Fetch Packed Geometry from DOP Network 로 설정해준다면 결과가 달라진다.

이런 느낌이다.

결과로 두개의 포인트와 두개의 packing된 지오메트리가 import 된 것을 확인할 수 있다.

즉 각각의 '그릇'별로 packing해서 자료를 반환해준 것이다.

이미 packing 되어있던 총알은 별도의 packing 과정이 일어나지 않지만, ground에 대해서는 packing 과정이 발생한다.

 

Fetch Unpacked Geometry from DOP Network는 그럼 무엇일까?

위의 결과와 반대로 모든 그릇의 자료를 unpack해서 import 할 것이다.

이런 느낌이다.


정리

Dop Import를 볼 때, Import Style이 각각

  • Fetch Geometry from DOP Network
    • 시뮬레이션 작업에서 packing된 물체는 packing된 상태로 나오고, packing하지 않고 사용한 물체는 packing되지 않은 상태로 보여주게 된다.
  • Fetch Packed Geometry from DOP Network
    • 시뮬레이션 작업에서 packing된 물체는 packing된 상태로 나오고, packing하지 않고 사용한 물체가 나올 때 packing을 해서 보여주게 된다.
      • 모든 물체의 결과가 packing된 것으로 보여준다.
  • Fetch Unpacked Geometry from DOP Network
    • 시뮬레이션 작업에서 모든 결과물들이 packing이 해제되어서 나오는 것이다.

이제 자료를 읽고 불러오는 것을 해보자.

 

dop network의 spreadsheet를 확인해보자.

현재 위에 보이는 것은 지면에 대한 필요한 결과들이 모두 준비되어있는 것이다.

우리가 현재 관심있는 geometry의 결과는 gr이라는 '그릇'에 geometry 항목에 들어가있다.

 

그렇다면 총알에 대한 하나의 packing된 데이터는 어디에서 확인할 수 있을까?

 

dop network의 결과가 우리를 힘들게 하는 것은 막상 우리가 관심이 있는 정보 말고도 제공되는 정보들이 많다는 점이다.

또한 제공된 다른 정보들이 당장에 우리가 쓰기에 좋은 정보가 아닌 것이 많다.

그렇기 때문에, 지금은 '그릇'geometry 정보에 집중하기로 한다.

 


이제 dop network가 줄 수 있는 geometry 결과를 object merge 노드로 불러보자.

만약 총알을 object merge로 dop network에서 불러온다면, z라는 그릇의 geometry를 불러오면 된다.

 

경로가 잘못되었다고 한다.

dop network 안의 자료를 처음 부를 때는 dop net 뒤에 '/'가 아니고 ':'을 기입해줘야한다.

만약 총알이 아닌, 지면에 대한 정보를 dop network에서 부르고 싶다면?

  • /obj/a01/dopnet1:gr/Geometry 를 기입해주면 된다.

이렇게 불러오는 기술은 dop network 안에서 sourcing하는데 반드시 필요한 기술이다.


이번에는 proxy bullet을 hard bullet으로 바꾸는 작업을 해보자.

 

고화질의 hard bullet을 불러오자.

 

현재 시뮬레이션은 proxy 버전으로 계산을 진행했다.

proxy bullet을 hard bullet으로 교체해보자.

 

Transform Pieces Node

proxy 데이터를 transform pieces 노드의 가운데 input에 연결해주고, hard 데이터를 첫번째 input에 연결해준다.

hard bullet은 packing해줬다.

 

그렇다면, transform pieces 노드는 어떻게, 무슨 기준으로 proxy 정보를 고화질 정보로 치환해주는 것일까?

치환할 고화질 정보를 첫번째 인풋에 연결하고, 시뮬레이션 결과를 두번재 인풋에 연결한다고 해서 올바르게 치환이 이뤄지는 것은 아니다.(위의 경우는 운이 좋은 경우였다.)

구체적으로 어떠한 기준에 맞춰서 치환을 해줄 것인지 정해줘야한다.

 

기본 세팅으로는 s@name, 이름이 같은 물체끼리 치환이 이뤄지도록 설정되어있다.

 

proxy 데이터와 치환하려는 데이터가 준비되어 있을 때, 치환하려는 데이터 중, 이름이 같은 proxy 데이터의 움직임을 따르도록 한다는 것이다.


연습을 해보자.

현재 s@name의 값으로 "a01"을 가지는 수평운동을 하고 있는 box와 s@name의 값으로 "a02"를 가지는 수직운동을 하고 있는 box가 있다.

  • 이 두 box는 proxy로 사용된다고 가정한다.

proxy 정보와 치환을 해주기 위한 여러가지 지오메트리들을 만들어줬다. 그리고 각각 s@name을 각기 다르게 입력해줬다.

(box : a01 / platonic : a02 / rubber toy : a03 / pighead : a04)

 

이제 transform pieces 노드를 사용하여 proxy 와 치환하려는 지오메트리를 연결해보자.

 

proxy로 사용된 box의 s@name 어트리뷰트와 같은 어트리뷰트를 가진 지오메트리가 box의 움직임을 따라서 움직이고 있는 것을 확인할 수 있다.

 

수평이동을 하던 proxy box의 s@name을 a04로 바꾼 결과이다. 같은 s@name을 가지고 있는 pighead가 수평이동을 하는 box의 움직임을 따라서 움직이고 있고, 기존에 따라서 움직이던 s@name = "a01" 의 주황색 박스는 움직임이 없는 것을 확인할 수 있다.

 

 

그런데 만약, proxy 정보도 고화질 정보도 s@name이 없다면?

merge에 연결된 순서대로 움직임을 따르게 된다.

일단 proxy 쪽의 merge에 연결된 순서대로 수평이동이 1, 수직이동이 2로 순서가 매겨지고, 치환하려는 정보쪽의 merge에 연결된 순서대로 1~4번이 매겨지는데, transform pieces를 해줄 경우,

  • 치환데이터 1번은 proxy 1번 움직임을 따르고,
  • 치환데이터 2번은 proxy 2번을 따르며,
  • 치환데이터 3번은 다시 proxy 1번을 따르고,
  • 치환데이터 4번은 proxy 2번을 따르게 된다.

이것은 굉장히 무책임한 방법이다.(이건 선생님이 하신 말씀)

이런식으로 데이터가 여러개가 transform pieces에 연결될 경우, 올바르게 치환이 이뤄지기 바라는 것은 굉장히 무책임한 바람인듯 싶다(이건 내생각)

 

proxy의 움직임을 고해상도의 자료에 올바르게 연결해줄 수 있도록 해야한다.


다시 총알로 돌아와서...

이 경우는 어떻게 된 것일까?

1대1 치환이 잘 이뤄졌다.

하지만 hard 버전의 총알은 현재 s@name을 가진 것이 없다.

그렇다면 proxy 버전은?

z_0라는 이름을 가지고 있다.

proxy는 @name을 가지고 있지만, hard는 @name이 없었기 때문에 순서로 매겨서 1대1 치환이 일어난 것이다.

만약 hard에도 @name 어트리뷰트가 존재하게 된다면, 그때부터 transform pieces 노드는 @name을 대조해서 일치하는 경우에만 치환을 진행하게 된다.

hard 버전의 총알에 s@name 으로 "a"를 넣어줬고,
proxy 버전의 총알이 가지고 있는 s@name 과 같지 않기 때문에 치환이 이뤄지지 않았다.
@name을 "z_0"로 proxy 총알의 @name과 동일하게 맞추니 치환되었다.


오늘의 정리

  • 시뮬레이션을 위한 모델링
    • 시뮬레이션의 빠른 계산을 위한 가벼운 버전과 출력을 위한 디테일이 높은 버전의 모델링을 각각 제작하였다.
  • 시뮬레이션 진행
    • 위에서 만들어준 가벼운 자료(proxy)를 가지고 시뮬레이션을 진행했다.
  • dop network 결과를 geometry spreadsheet로 보는 법을 배웠다.
  • object merge 노드로 dop network에서 원하는 결과를 뽑아내는 것을 배웠다.
    • dop import로도 원하는 결과를 뽑아낼 수 있지만, 앞으로 배울 어떠한 내용 때문에 object merge로 원하는 결과를 뽑는 방법을 배웠다.
    • 주의할 점은 object의 경로를 기입해줄 때 dopnetwork 뒤에 "/"가 아닌 ":"임을 기억하자.
  • Transform Pieces 노드로 시뮬레이션의 결과를 고화질 정보로 치환하는 작업을 진행하였다.
    • 중요한 포인트는 시뮬레이션 결과와 고화질 정보의 s@name 정보를 잘 맞춰주는 것이다.

DOP Import에서 import style을 선생님이 이것 해주세요 저것 해주세요 할 때마다 뭔가 나만 모르는게 있는것 같다는 찜찜함이 항상 있었는데, 오늘 그 찜찜함이 사라졌다.

 

각각의 조각들에 대해서도 항상 이름을 맞춰주는 습관을 들여놔야겠다고 생각했다.

굉장히 러프한 지오메트리로 지진 혹은 건물의 붕괴를 시뮬레이션하고 디테일한 정보로 올바르게 치환해주기 위해서라도 초반부터 @name을 잘 정리해줘야겠다고 생각했다.

 

 

작업을 함에 있어서 여러가지 습관을 몸에 익혀둬야겠다고 다짐해보는 밤이다. :)