RIGID BODY_20 건물 붕괴 + 빌딩 에셋 제작 - Ep20_Part 03. 창문만들기 + 조각수 줄이기
이번에는 창문을 꾸며볼 것이다.
참고로 지금 하는 작업으로 창문의 치환에 사용될 최종적인 물체를 만든다고 생각하고 작업하기로 한다.
그렇기 때문에 사이즈에 대해서도 지금 미리 정하고 가는 것이 좋다.
벽(mid_2, mid_4, mid_6, mid_8)을 창문으로 꾸며주기 위해서 벽을 뚫기위한 작업을 진행한다.
벽의 한 조각에 대해 양쪽 끝 primitive를 떼어주고 중심점을 찾은 뒤 선으로 이어준다. 그리고 그 선을 resample 노드로 나눠서 얻게 된 포인트에 boolean으로 뚫어줄 박스를 붙여주도록 한다.
구멍에 만들어줄 창문은 구멍을 뚫어줬던 box를 이용해서 만들어줄 수 있다.
이제 창문을 예쁘게 달아주기 위한 아이디어로, resample 노드에서 선을 나눠주는 segments 값은 짝수로, 창문을 달아주기 위해 box를 붙여줄 포인트의 번호는 홀수를 사용하기로 한다.
- 이렇게 할 경우, 창문과 창문 사이의 간격이 균일하게 만들어줄 수 있다.
번호를 홀수만 사용하기 위한 attribute wrangle
마주보는 반대편 벽도 마찬가지이다.
만일 현재 하려는 작업이 일반적인 건물 모델링이었다면, 이제 마무리짓고 치환해줘도 상관없을 것이다. 하지만 현재 하려는 작업은 rigidbody, 충돌 시뮬레이션이다. 그렇기에 지금 이대로의 결과는 문제가 존재한다.
assemble로 각각 packing을 해줬다.
이제 창문 하나와 창틀을 떼어보자.
만일, 창틀이 dop network에 들어가서 proxy로 바뀌게 된다면, 어떤 모양이 될까?
아마도 아래 이미지와 같은 모양이 나올 것이다.
이렇게 되면 창문과 창틀의 proxy 데이터가 서로 겹치는 상황이 발생한다.
충돌조건이 겹치게 되면 작업자의 기대와는 매우 많이 다른 결과가 도출되게 된다.
그렇기 때문에 부피적으로 겹치는 것이 없는 좀 더 나은 충돌조건이 필요하다.
이전 시간에 box를 9개의 조각으로 나눠줬던 방법을 활용하기로 한다.
위와 같이 면이 꼬인 것처럼 나오는 이유는 boolean fracture가 멍청해서... 한 칸 건너뛴 면이 다른 곳과 겹쳐져있어서 그렇다.
이게 완성은 아니다. 최종적으로 봤을 때, 조각의 수량이 너무 많은 것이다. 정보의 낭비일 뿐 아니라, 조각이 너무 많아짐으로 인해 시뮬레이션의 오류가 발생할 수도 있다.
이 부분에 대한 해결책으로는, 창문 위쪽과 아래쪽의 프레임은 굳이 저렇게 떨어질 필요가 없으니 bound 노드를 활용해서 하나의 긴 조각으로 바꿔주도록 한다.
그리고 windowframe 과 windowglass 부분으로 나눠서 @walldetail이라는 attribute를 만들어서 저장해주도록 한다.
위의 과정이 벽에 창문을 다는 하나의 사이클이다. 이와같은 과정을 나머지 3개의 벽에도 적용해주면 된다.
이제 치환을 해주도록 한다.
여기에서 건물의 디테일을 더 올리고 싶다면, 직접 치환 규칙을 만들고 꾸며나가면 된다.
지금은 혼자 무엇을 하기에는 조각이 너무 많다.
조각의 수량을 줄여보도록 하자.
결국 건물을 붕괴시킬 때 많은 조각이 필요하지만, 지금은 좀 과하다. 일단 rigidbody 작업 시작 이전에 조각의 수량을 최대한 줄여준 다음, 다시 조각을 내줘야한다.
위 이미지의 건물이 가지고 있는 조각의 수량은 얼마나 될까?
이 조각들이 현재 효율적으로 조각나있는 것인가? 아닐 것이다. 그리고 창문은 현재 packing이 풀리지도 않은 상황이다. 창문을 unpack 해준다면?
건물의 높이를 41층으로 올린다면?
이정도 수량은 dop network에 넣기에 매우 부담스러운 수량이다.
기둥과 바닥만 만들어주는 골조는 현재 몇조각일까?
일단 건물 골조의 조각 수량을 줄여보도록 하자.
건물 골조의 조각 수량을 줄이기 위한 전략
- 각각의 조각들은 몇층에 있는 어떤 파트인지에 대한 정보를 가지게 된다.
- 각각의 조각을 나누는 조금 더 쉬운 분류가 필요하다.(btm_1, btm_2, ... 이 아닌 다른 분류)
일단 더 쉬운 분류를 만들어준다.
- s@roomeasy를 만들어주고, btm, mid, top으로 나눠준다.
이렇게 나누는 이유로는, 같은 층에서의 모든 바닥 혹은 모든 천장은 하나의 블럭으로 취급하려 하기 때문이다.
층에 대한 정보는 어디에서 얻어올 수 있는가?
위의 노드들을 보면 attribute delete로 지운 정보 중 y에 대한 정보가 있다. 이 정보는 층에 대한 정보로 활용할 수 있을 것이다.
층에 대한 정보는 unpacking 과정에서 날아가게 되기 때문에, transfer attributes parameter로 y 정보를 넘겨줘야한다.
이제 for each named primitve 블럭을 활용해서 같은 층인 조각들을 묶어서 볼 수 있다.
이와 같은 작업을 bottom / top 에 적용해준다.
한가지 더, 1층의 top과 2층의 bottom은 맞닿아있기 때문에 조절만 잘 해준다면, 굳이 떼어서 볼 필요 없이 하나의 블럭으로 처리가 가능할 듯 싶다.
1층과 2층을 예로 들어보자.
1층의 top은 2층의 bottom과 맞닿아있다.
이 때 1층과 2층의 y는 각각 1, 2이다.
y가 같은 조각들을 for each named primitive로 불러서 bound 노드를 활용해 하나의 조각으로 묶어줄 수 있기 때문에, 1층의 top이 가지는 y를 1 증가시켜주면, 2층의 bottom이 가지는 y(2)와 같아지기 때문에 2층의 bottom과 1층의 top을 하나의 조각으로 만들어줄 수 있다.
bottom과 top을 다 합쳐서 42개의 조각이 되는 것을 볼 수 있다.
이제 기둥의 수를 줄일 차례이다.
위의 bottom과 top에서 해준 것과 유사한 작업이 진행된다.
위와 같이 각 방의 x, y, z 값을 활용해서 각각의 기둥에 vector 정보를 만들어주고, 서로 같은 vector 정보를 가지는 기둥조각들끼리 하나의 조각으로 묶어줄 수 있을 것이다.
mid(기둥)만 보도록 해준 뒤, mid_1, mid_3, mid_7, mid_9 로 각각의 귀퉁이 조각을 볼 수 있도록 해준다.
그 다음, x, y, z 값을 가공해서 각각 a, b, c에 대한 정보를 만들어준다.
mid_1
- a : x-1 / b : y / c : z-1
mid_3
- a : x / b : y / c : z-1
mid_7
- a : x-1 / b : y / c : z
mid_9
- a : x / b : y / c : z
이제 a, b, c를 가지고 s@abcunit이라는 정보를 만들어준 뒤, 같은 @abcunit을 가진 조각들끼리 bound 노드를 활용해서 하나의 조각으로 만들어준다.
이제 고민해봐야할 문제는 '창문의 수량은 어떻게 줄일것인가?' 이다.
이 부분은 지금 고민할 단계는 아닌듯 하다.
슬슬 constraint 세팅을 본격적으로 고려하면서 작업을 진행해야하기 때문이다.
오늘 회사에 있다가 예전에 봤던 영화가 떠올랐다.
https://www.youtube.com/watch?v=sULTItHmtwI
저 모습에 반해서 무작정 CG를 하고 싶다고 전공을 때려치고 뛰어든 것이었는데...
참 오랜 기간 돌고 돌다가 이제서야 만들어볼 기초를 다지게 되었다.
꼭!!!! 결과물을 내봐야지...