오늘의 핵심내용
- rigid body 시뮬레이션에서 사용할 물체를 sourcing하는 방법 (custom sourcing)
지난 시간의 핵심내용
- Geometry Spreadsheet를 이해하고 원하는 자료를 Object Merge로 불러내기
- Transform Pieces
'그릇'
- RBD Packed Object
우리가 배우려는 것
- RBD Packed Object에 사용하고싶은 물체를 어떻게 불러오느냐
(일반 solver를 다룰 줄 알아야한다.)
일반 solver를 가지고 시간에 따라 물체를 등장시켜보기
solver 작동의 핵심
- 이전 프레임의 결과를 바탕으로 solver 안에서 한 사이클이 시작되고 이번 사이클의 결과를 solver의 결과물로 사용하는 것
solver에게 시키고 싶은 일 1)
15 프레임에 점 하나를 등장시켜보기
- solver의 start frame 전까지는 Prev_frame은 아무런 내용도 가지지 않는다.
- start frame이 되었을 때 Prev_frame은 solver의 첫번째 인풋으로 들어오는 데이터이다.
- start frame의 solver의 결과는 Prev_frame을 가지고 solver 내부의 한사이클이 진행된 output의 결과이다.
이제 15프레임이 되었을 때 점이 등장하기를 원한다면? 어떻게 해야할까?
15프레임이 되었다고 가정하자. Prev_frame에 들어있는 내용은 14프레임의 solver 결과이다. 14프레임까지 아무런 내용도 없었기 때문에 15프레임의 Prev_frame의 내용 또한 아무것도 없다.
여기에 add로 추가한 점이 합류되기를 원하는 것이기에 merge를 사용해서 점을 묶어주자.
우리가 원하는 것은 15프레임에서 점이 생성되는 것이기 때문에 위의 이미지 내용이 solver의 규칙이 되면 안된다.
위와 같은 내용이 규칙이 되면 start frame에서부터 매 프레임 모든 사이클마다 점이 생성되기 때문이다.
start frame일 때 solver의 결과는 add로 추가해준 점 한개이다. (Prev_frame은 현재 아무런 내용이 없다.)
그 다음 프레임에는 start frame의 결과로 얻은 점 하나가 Prev_frame의 내용으로 들어가고, 이곳에 또 다시 점 하나가 추가되어서 결과로는 점 두개를 얻게 된다.
그 다음 프레임은 위의 점 두개가 Prev_frame의 내용으로 들어가고, 결과로는 점이 하나 더 추가된 점 세개를 얻게 된다.
우리가 원하는 것은 이런 결과는 아니었다.(15 프레임에 점 하나가 추가되는 것이었다.)
만약 24프레임에 점 하나가 더 추가되기를 원한다면 어떻게 하면 될까?
시간이 지남에 따라 반시계 방향으로 생성되는 박스를 만들어보자.
만약 이 박스가 20 프레임에서 생성되기 원한다면?
이번에는 box에 이름을 달아보자.
20 프레임에 등장하는 박스는 spreadsheet를 보면 s@name 어트리뷰트를 달고 있다.
약간의 디벨롭을 진행해보자.
고유한 이름을 가지기 위해서 박스가 생성되는 프레임의 번호를 name 뒤에 붙여주자.
이제 solver로의 물체 합류 규칙을 바꿔보자.
20프레임에서만 box가 생성되는 것이 아니고, 4프레임마다 한번씩 박스가 생성되도록 해주자.
원하는 타이밍에 물체가 solver에 합류되면 된다.
이번에는 등장하는 위치를 다르게 해보자.
합류하는 시점에 copy to points로 위치를 바꿔주면 된다.
이제 색이 점점 어두워지도록 해주자.
이 세팅, box가 등장하는 방식이 rigid body에서 물체를 sourcing할 때 사용하는 핵심 기술이다.
- 단순화된 면은 있으나 이 기술만 자유롭게 응용할 수 있다면, rigid body를 다루는 실력이 훨씬 풍성해질 것이다.
방금까지 만들었던 세팅을 조금 바꿔보자.
- 만약 dop network라면...? 이런 뉘앙스로 dop network 밖에서 미리 box와 box가 붙을 점을 만들어주고 object merge로 필요한 정보를 불러서 solver 안에서 작업하는 것 처럼 묘사해볼 것이다.
지금 이 세팅은 solver를 활용해서 물체가 등장하는 것이다.
- box가 등장하는 시간에 대한 규칙은 switch 노드가 해결하였다.
- 어떠한 물체를 등장시킬지에 대한 것은 solver 밖에서 미리 준비를 해줬다.(packed box)
- 이 물체는 solver 안으로 object merge로 불러왔다.
- 준비한 물체가 어디에 등장할지에 대해서도 solver 밖에서 미리 point의 위치정보를 만들어줬다.
Dop network에서 rigid body solver로 위와 같은 세팅을 잡아보자.
Rigid Body solver의 특이한 부분은 Sourcing을 위한 노드가 마련되어있지 않다.
rigid body solver는 pop solver / smoke solver와 같이 'source를 활용한다'에 대한 노드가 존재하지 않는다.
이 부분을 custom하게 직접 만들어줄 것이다.
기본적으로 지금까지 해왔던 rigid body 시뮬레이션의 세팅에서는 RBD Packed Object에 dop network 밖에서 만들어줬던 물체의 경로를 기입해주고 시뮬레이션을 진행해왔다.
오늘의 방식에서는 굳이 RBD Packed Object에 물체의 경로를 기입할 필요가 없다.
- solver를 이용해서 물체를 '직접' 그릇에 올릴 것이기 때문이다.
위의 노드를 활용해서 RBD Packed Object에 물체를 올리는 Source 제공 노드처럼 이용해볼 예정이다.
SOP Network Node / SOP Solver Node
- 두 노드를 묶어서 물체가 등장하는 수행을 하게 된다.
- SOP Solver 노드 하나만으로도 해결이 가능하긴 하다.
- 느끼기에 불편할 내용이 있어서 SOP Network와 같이 사용하기로 한다.
- SOP Solver는 밖에서 사용하던 solver와 같기 때문에 출력 결과가 하나이다. 이 부분이 아쉬워서 SOP Network와 함께 사용하는 것이다.
Enable Solver Node
- 물체를 불러오는 과정이 어떠한 그릇에서 일어날지를 정해주는 노드
- 상황에 따라서 RBD Pacekd Object 노드가 여러개 존재할 수도 있다.
- 이 때 어떠한 그릇에 대해 물체를 불러오는 과정을 수행할지 이 노드로 정해주게 된다.
- 다른 역할로는 연결된 SOP Solver가 작동할지 말지 작동여부를 결정해줄수도 있다.
일단 SOP Network와 SOP Solver로 물체를 불러오는 작업을 해보자.
rigid body solver의 세번째 인풋 : post solver, 후계산
일단 현재 필요없는 노드는 지워보자.
dop_geometry : 일반 solver에서의 Prev_frame 노드와 같다고 보면 된다.
20프레임에 box 하나가 생성되는 세팅을 잡아보았다.
위의 세팅 시뮬레이션을 실행시키면 20 프레임에 box가 생성되고, gravity에 영향을 받아서 밑으로 떨어져내린다.
만약 SOP Solver를 이용하지 않고, 20 프레임에는 box를, 40 프레임에는 Platonic Solid를 불러와서 시뮬레이션을 진행해야 한다면 어떻게 해줘야할까?
RBD Packed Object의 parameter를 보면 Creation Frame이 있다. 초기 값은 아래 이미지처럼
이렇게 적혀있는데, 이 부분을 각각 20 프레임, 40 프레임으로 지정해주면, 20 프레임으로 지정한 그릇에 담긴 물체는 20 프레임에 시뮬레이션이 되고, 40 프레임으로 지정한 그릇에 담긴 물체는 40 프레임에 시뮬레이션이 된다.
그렇다면 만약, 4프레임마다 box가 생성되기 원한다면?
반복 작업이 좋다면 원하는 수량만큼 RBD Packed Object 노드를 복사해주고 Creation Frame을 4프레임씩 늘려서 바꿔주면 될 것이다.
- 이렇게 많은 수량의 그릇을 만들어서 생성하는 방법은 합리적인 방법은 아니다.(불편하다)
- 예를들어서 40개의 박스를 만들겠다고 40개의 그릇을 만든다는것은 말이 안된다.
그래서 SOP Solver로 그릇에 물체를 올리는 과정(Sourcing)이 필요한 것이다.
4 프레임에 한번씩 박스가 생성되고 시뮬레이션 되도록 해보자.
현재는 그릇이 하나이기 때문에 물체를 그릇에 추가해준다는 것에 큰 문제가 없다.
하지만 그릇이 두개 이상일 경우, 우리가 추가해주는 이 box가 어느 그릇으로 가겠다 라는 것을 명시한 부분이 없다.
만일 위와같이 그릇이 두개 존재하는 경우(각각의 그릇은 Object Name을 A, B로 이름 붙였다) 각각의 그릇에 대해 SOP solver가 한사이클을 돌아서 box가 추가된다(A도 B도 SOP Solver의 내용을 수행하면서 중복으로 생성이 된다.)
중복생성이 아닌, 우리가 원하는 그릇에 원하는 오브젝트를 넣기 위해서는 추가적인 작업이 필요하다.
SOP Solver가 아닌, SOP Network에서 작업을 진행한다.
SOP Network 내부에서 Dop network 자료를 Object Merge로 불러왔던 방식을 활용한다.
새롭게 box를 만들어서 올리고 싶은 곳
A 그릇의 Geometry
SOP Network에서 Object merge로 불러온 저 노드는
SOP Solver의 dop_geometry 노드와 같다고 생각해도 좋다.
이것을 실행한다고 해서 당장에 어떠한 결과가 나오진 않는다.
그 이유는 SOP Network에 세팅을 잡았기 때문이다.
SOP Network에서 준비한 시스템을 마치 solver인것처럼 작동하도록 만들 수 있다.
참고로, SOP Solver 안에 아무런 내용이 없어도 된다.
Geometry spreadsheet 상의 어떠한 내용을 불러오는 것이 아니기 때문에 sim 뒤에는 ':'이 아닌 '/'를 사용한다.
현재 우리가 불러와서 업데이트를 진행한 자료는 SOP Network의 Object merge로 부른것처럼, A라는 그릇에 있는 Geometry 자료를 가져와서 새로운 박스를 합류시켜준 것이다.
이렇게 A 그릇에 대해 작업을 했다는 뉘앙스를 확실하게 박아줄 수 있는 방법이 있다.
Enable Solver를 사용해서 기입해주는 것이다.
Enable Object를 보면 *, A가 기입되어 있다. 이것은 현재 그릇이 A밖에 없어서이기 때문이고, 여러 그릇이 있다면, 여러 그릇의 이름이 명시되어 있다.
이 중에서 내가 물체를 올리고 싶은 그릇을 지정해줄 수 있다.
SOP Network 안에서 A의 그릇의 Geometry 정보를 가져와서 만들어주더라도 Enable Objects에 B를 기입해주면 생성되는 box는 B의 Geometry에 추가되고, A 그릇의 Geometry 에는 추가되지 않는다.
이번에는 B 그릇에 Platonic Solid를 올려보자.
위의 세팅은 처음 접하는 것이다보니 낮설다.
특징으로는,
- rigid body를 sourcing하는 형태로 만들어준다.
- DOP network 안에서 SOP solver를 사용한다.
- Geometry Spreadsheet의 구체적인 정보를 가져와서 사용한다.
쉽고 다양하게 물체를 rigid body에 올리는 방법으로서는 위의 방법이 가장 쉽고 논리적으로 완성도가 있는 편이다.
constraint에 가서도 동일한 기술이 사용된다.
예제를 만들어보자.
규칙)
지면보다 높은 곳에서 새로운 box들이 생성된다.(4프레임마다 한번씩)
생성되는 box는 등장과 함께 위로 튕겨져나온다.(@v)
튕겨져나올 때 약간의 회전 또한 추가된다.(@w)
생성되는 box의 size는 랜덤이다.
고려되어야 할 점은 각각의 box는 고유한 이름을 가지고 있어야 rigid body solver가 헷갈려하지 않는다.
두번째 예제
총알 샤워까지 만들어보기!!
어... 뭔가 놓치고 있는 기분...
총알샤워를 만들었는데... 프록시 데이터가 하드 데이터로 변환이 안된다... 이름을 맞춰줘야할꺼같은데 머리에 과부하가 @_@
박스로 rubber toy 때리기는 강의를 멈추고 먼저 진행해보다가 갑자기 박스들이 이상증세를 보여서 왜 이런가 좌절 모드 들어갈뻔했는데 초기에 고유이름 지정을 안해줘서 rigid body solver가 이상하게(?) 계산한거... 고유이름 붙여주니까 잘 돌아간다...ㅎ
주말동안 포트폴리오를 어떻게 구상할지 고민하면서 이것저것 찾아보는데... 아...음... 하반기 전에 매력 넘치는 포폴만들어서 점프 뛸 수 있을까...? 하는 약간의 현타 아닌 현타가...
결국엔 연습에 연습에 연습이다!!!