rigidbody의 핵심은 결국 packing과 치환이다.
현재 창문의 조각수가 너무 많아서 무언가 조절을 하지 않고서는 시뮬레이션을 하는데 있어서 무리가 있다.
이번 강의의 아이디어
- 창문을 여러 스타일로 조각을 내도록 한다.
- 굳이 부러지지 않을 창문도 존재할 것이고, 직격타를 맞아서 많이 부러지는 창문도 존재할 것이다.
- 어떻게 치환을 진행할 것인지에 대한 세팅이 먼저 필요하다.
- 앞으로 어떠한 정보를 다루게 될지 예측할 수 있다.
색이 중요한 정보가 될 수 있으므로, 일단 @Cd 정보를 날려주도록 한다.
빨강, 주황, 노랑, 초록, 파랑의 5가지의 스타일로 나눠주려고 한다.
- 빨강은 조각이 1개인 창문으로 치환하려고 하고, 파랑은 조각이 가장 많은 창문으로 치환하려고 한다.
- 조각의 수량은 빨 < 주 < 노 < 초 < 파 로써 빨강이 제일 적고, 파랑이 제일 많아질 것이다.
- 건물의 높이에 대해서 바닥과 가까울수록 0, roof에 가까울수록 1의 값을 가지도록 세팅해줄 것이다.
건물의 높이를 구해주고, 각 층의 y값을 활용해서 각 층이 건물의 어느정도에 위치해있는지를 파악한다.
f@ratio를 활용해서 빨 / 주 / 노 / 초 / 파 색상을 부여해주도록 한다.
이제 색을 통해 직관적으로 알 수 있다.
- 파란색에 가까울수록 조각이 많은 창문과 치환되고, 빨간색에 가까울수록 조각이 적은 창문에 치환된다는 것이다.
f@ratio를 활용해서 5가지의 i@style 이라는 값을 만들어줄 수 있다. 이 값을 활용해서 style 0은 조각이 적은 창문, style 5는 조각이 많은 창문으로 치환해주도록 해줄 수 있다.
f@ratio 값은 현재 0 ~ 1 사이의 값으로써 이곳에 5를 곱해주면 0~ 4.9XXX 의 값이 된다. 이 값의 소수점을 날려주게 되면 0 ~ 4 인 integer 값을 얻을 수 있다.
위에서 언급한 것과 같이 현재 f@ratio는 0~1사이의 값으로 바닥부터 옥상까지 linear한 값이다. 이 값을 ramp를 사용해서 임의로 조절해줄 수 있을 것이다.
그런데 지금은 style 별로 색이 너무 칼같이 나뉘어있다. 이 부분에 대해 수정이 필요하다.
- 어떠한 random 값을 @ratio 값에 더해줌으로써 변화를 줄 수 있을 것이다.
- 이 때 더해지는 random한 값은 0.2 안에서 더해지게 된다.
- @ratio에 random 값이 더해지면서 음수가 되는 구간이 존재하므로 clamp function을 적용해주도록 한다.
random 값을 만들어줄 때 seed 값을 추가해주면 좀 더 원하는 형태가 나오도록 수정을 해줄 수 있다.
이렇게 치환을 영리하게 할 방법 하나가 마련되었다.
이제 각 벽에 대해 5가지 style의 창문을 만들어줘야한다.
빨간색(style 0)
dop network 안에 들어갈 때 한조각으로 들어갈 창문.
그렇기 때문에 windowframe을 따로 나눠줄 필요도 없다.
위의 상태에서 빨간색(@roompartstyle이 mid_4_0인 부분)만 떼어서 보자.
떼어낸 부분을 위에서 만들어줬던 창문으로 transform pieces 노드를 사용해서 치환해준다.
이렇게 치환된 물체가 올바르게 시뮬레이션이 되려면 무엇이 있어야할까?
각각의 조각에 고유한 @name을 만들어주기 위해서 윗단에 있던 x, y, z 정보를 활용한다.
이제 constraint 세팅을 해보자.
이와같은 창문이 있을 때, 각 창문 프레임의 바깥 부분은 건물 골격을 잡게 되는 부분이다.
이렇게 4개의 포인트를 구해준 다음, 그 포인트를 활용해서 constraint 세팅을 해줄 것이다.
현재 포인트는 위치정보 P 외에는 다른 정보를 가지고 있지 않기 때문에, 이 포인트가 어떠한 조각을 대변하는지에 대한 정보 @roompartstyle을 추가해주도록 한다.
그리고 치환될 때 각 치환되는 곳에 포인트도 같이 붙어서 치환될 수 있도록 packing을 해주도록 한다.
- 여기에서의 packing은 정보를 '묶어서'옮기기 위한 용도로 사용되었다.
한번의 packing이 더해졌기 때문에 unpack 과정이 추가된다.
이제 골격을 잡아줘야하기 때문에, @name이 정리된 골격 정보를 가져와서 ray로 던져줘서 포인트를 만들어주고, ray로 던져진 포인트와 던져져서 만들어진 포인트를 가지고 primitive를 만들어준다.
- 이 때, 포인트에 id를 부여해주고, id가 같은 포인트들끼리 연결해주도록 한다.
창문이 약간의 고정력을 가지고 있기를 원한다면 soft constraint를, 붙어있다 떨어져나가는 것을 원한다면 glue constraint를 사용할 수 있을 것이다.
조건을 잘 설정한다면, 잡아주는 거리 @distance가 어느 임계값을 넘어가면 끊어지도록 해줄수도 있을 것이다.
이제 사면을 전부 작업을 진행해줘야한다.
일단 지금까지 작업한 style 0에 대한 내용을 사면에 적용해준다.
파란색(style 4)
가장 조각이 많이 날 창문
voronoi fracture를 위해서 포인트를 뿌려주고 적용하지만, 면이 꼬이는 부분이 발생한다. 무언가 작업이 필요하다.
일단 프레임을 위, 중간, 아래로 쪼개준다.
창문의 위, 아래 면을 사용하여 primitive 노드로 scale을 올려주고, 그 면을 사용해서 boolean fracture로 잘라낸다.
작업 도중 생기는 불필요한 포인트 등의 정보는 그때 그때 정리해주도록 한다.
잘라낸 면에 불필요한 포인트들이 생성되었고, 각 조각에 대해 bound를 적용해준다.
voronoi fracture를 사용하는 이유는, constraint에 필요한 primitive를 얻을 수 있기 때문이다.
frame들 끼리, window glass 끼리는 이어져있으나, frame과 glass는 연결되어있지 않다.
유리의 외벽부분이 frame을 잡을 수 있으면 될 듯 싶다.
유리의 외벽 부분을 따로 group으로 지정해주도록 한다.
각 면의 중심점을 구해준 뒤, 그 점을 기준으로 유리조각과 frame을 잡아줄 수 있도록 세팅한다.
이제 유리들이 서로 잡을 수 있도록 세팅을 한다.
하지만 frame 너머의 유리조각까지 잡히게 되는 상황이 발생한다.
이런 때는 group과 for each connected piece를 활용해서 keep in bounding regions를 활용해서 불필요한 primitive를 날려주도록 한다.
frame에도 같은 작업을 반복해주고, 한가지 더 하자면, 창문이 빌딩 골격을 잡을 수 있는 세팅 또한 진행해야한다.
frame의 외벽 부분을 group으로 지정해준 뒤, 그곳에 frame의 포인트를 ray로 던진다.
이 때 너무 멀리에서 던져진 포인트에 대해서는, 원래의 위치에 대한 포인트와 던져진 위치의 포인트를 primitive로 연결하고, 임계값 이상의 길이를 가지는 primitive를 지워주는 것으로 너무 멀리서 날아온 불필요해보이는 포인트를 제외해줄 수 있다.
시스템을 만들어주면 subnet으로 묶어주고 정리를 해주도록 한다.
각 면에 대해 붙여주면 된다.
창문을 건물의 골격에 붙여주는 작업 또한 진행한다.
창문을 붙인 이후로 충격량을 창문에서 대부분 흡수하는 것인지 박살은 잘 안나고 충돌체는 튕겨져나가는 상황이 발생!! 혹시나 싶어서 창문의 constraint 생성 수량도 좀 줄여주고 창문의 조각도 조금 줄여줬더니 잡아주는 힘이 조금이나마 줄어서 그런가 그래도 빌딩이 조금 부서지는 시뮬레이션 결과가 보이긴 한다. 하지만 원하는 느낌은 충돌체가 건물을 뚫어버리는 것인데 좀 더 수정이 필요할 듯 싶다.
파편이 흩뿌려지는 것에 대해 퍼지는 강도를 좀 잡아주도록 하자.
빌딩에 대해 sop 세팅을 진행해야한다.
그리고 pop speed limit 노드를 달아줘서 파편 속도, 회전속도에 제한을 두도록 한다.
파편이 퍼지는 반경이 눈에 들어오는 느낌이 있다.
좀 더 다른 방법을 사용해보기로 한다.
pop drag를 사용해본다.
공기의 저항 때문에 파편이 느리게 떨어져내린다.
pop drag의 값이 바뀌면 seed가 바뀌는 것처럼 결과가 완전히 달라질 수도 있다.
drag 만으로 모든 느낌을 표현할 수는 없다.
필요에 따라 wind가 추가될 수도 있고, 중력을 조절해줄 수도 있다.
왜때문에 나의 쇠구슬 충돌체는 비치발리볼과 같은 느낌인것인가...!?!?
density를 올려도 크게 차이가 안나는...
그나마 조금 이것저것 건드려봤을 때 건물을 좀 부수긴 했지만, 아직도 건물을 뚫어버리는 강력함은 없다...
현재는 남은 강의를 따라가는데 급급한 상황이긴 하다.
남은 강의를 얼른 마무리짓고, tweak을 진행해야한다.
강의 중간에 선생님이 이야기하신것처럼, tweak을 게을리하지 말자!!!!
'Houdini > Houdini1_Rigidbody' 카테고리의 다른 글
(늦게 쓰는) TWA Houdini1 Study 후기. (1) | 2023.06.30 |
---|---|
RIGID BODY_20 건물 붕괴 + 빌딩 에셋 제작 - Ep20_Part 06. 볼륨 소스 나이스하게 구하기 + 연기 시뮬 -> END (0) | 2023.06.02 |
RIGID BODY_20 건물 붕괴 + 빌딩 에셋 제작 - Ep20_Part 04. 베이스 붕괴sim + Constraint 세팅 (0) | 2023.05.27 |
RIGID BODY_20 건물 붕괴 + 빌딩 에셋 제작 - Ep20_Part 03. 창문만들기 + 조각수 줄이기 (0) | 2023.05.26 |
RIGID BODY_20 건물 붕괴 + 빌딩 에셋 제작 - Ep20_Part 02. 약간의 숙제 풀이 + 노드 정리 (0) | 2023.05.24 |