오늘은 마무리단계로 보닛, door, 창문, side mirror, 와이퍼를 달아주기로 한다.
보닛과 door
두 부품을 달아주는 body에 달아주는 원리(메커니즘)는 같다.
- 경첩에 의해서 body에 달리게 된다.
근데 잘 보면 불필요한 부품이 있다.
- 경첩들 간에 보면 바디에 붙어있어야 할 부품이 붙어있는 것을 확인할 수 있다.
- 이 부분은 따로 떼어서 small parts 쪽에 붙여주도록 한다.
위 이미지와 같은 보닛에 회전축을 고정해주는 constraint를 몇 개를 달아주면 좋을까?
일단 hinge가 두군데 있으니 2개를 달아주면 좋을까?
hinge 두개가 전부 하나의 회전축을 기준으로 회전하니까 중간에 하나의 constraint로도 충분할까?
이론적으로는 두쌍, 한쌍의 constraint로도 우리가 원하는 움직임을 얻을 수 있지만, 안정적이지 않고 삐그덕 거리는 결과를 얻게 된다. hard constraint를 적용하게 되면서 충격이 발생하면 살짝살짝 오차가 발생하게 되고, 그 간극이 벌어지다가 구조물이 망가져버릴 수도 있다. (회전문 작업을 하면서 제대로 봤던 케이스이다.)
그렇기 때문에 보닛과 body를 하나 혹은 두개로 연결해 주는 것은 부족하다.
그래서 오늘은 두개의 경첩 사이에 여러 개의 constraint 연결을 만들어줌으로써 안정성을 확보해 볼 것이다.
- constraint가 많아지게 되지만, 하나의 축이 고정된 상태로 회전한다는 것은 모두 같다.
작업의 방법은 간단하다.
- 경첩 사이에 포인트를 찾아준다.
- 두개의 경첩이 있기 때문에 두 개의 포인트를 얻을 수 있다.
- 두개의 포인트를 이어서 선으로 만들어주고, resample 노드로 선을 쪼개준다.
- 선을 쪼갬으로써 생겨난 포인트들을 가지고 보닛과 body의 가장 가까운 조각들을 대변하는 포인트로 만들면서 constraint를 만들어준다.
두개의 포인트를 찾기 & constraint를 위한 다수의 포인트 만들기
- 경첩을 따로 한쌍씩 떼어준다.
- 보닛에 한쌍, 각 문마다 한쌍씩 총 5쌍이 나오게 된다.
- for each connected piece 블록 안에서 경첩 한쪽마다 packing 및 add 노드로 primitive를 날려주면 포인트를 얻을 수 있다.
- 얻은 포인트들을 add 노드로 선으로 연결해 준 뒤, resample 노드로 경첩 사이에 포인트를 만들어준다.
보닛 및 door 조각내는 것은 지난시간까지 작업에 이용했던 system을 사용한다.
이제 경첩 사이에 만들었던 line을 가져와서 primitive를 날려준 뒤, 각각의 포인트에서 보닛 / body의 조각 중 가장 가까운 조각을 대변해 줄 수 있도록 세팅한다.
그리고 position과 rotation에 대해서 condof / condir 세팅 및 constraint name, type 세팅을 진행해주고, dop network에 추가해 주도록 한다.
위의 작업을 각각의 door에도 적용해주도록 한다.
이번에는 side mirror / wiper 를 달아주자.
side mirror 나 wiper나 둘 다 small 부품을 작업할 때 넣었어도 크게 문제는 없었을 그런 부품들이다.
- system으로 조각을 내주고, 추가적인 constraint를 달아주는 것도 문제 될 것은 없다.
- 다만, wiper 쪽에서 이어지면 아쉬울만한 primitive들이 만들어지는 것이 있기 때문에, 이것들은 직접 select로 잡아서 지워주도록 한다.
그리고 wiper와 mirror를 각각 자동차 큰 덩어리에 붙여줘야 하는데, 이전에 작업했던 대로, 추가 primitive를 만들어주는 곳에 proxy 데이터로 body와 door 들을 가져오는 것은 상당히 많은 수량의 primitive를 만들게 되면서 비효율적인 상황이 발생한다.
- 이 부분은 mirror와 door가 맞닿는 조각, wiper와 body가 맞닿는 조각을 직접 선택해 줘서 포인트를 구하고 primitive를 만들어주는 것으로 해결할 수 있다.
이제 강화유리를 달아주면 된다.
현재 유리쪽에 창틀이 존재한다. 창틀과 유리를 따로 떼어서 달아주도록 하자. 둘 다 찌그러지도록 묘사를 하겠지만, 원본 모델링으로의 치환과정에서 따로 떼어서 작업하는 것이 도움이 될 수 있기 때문이다.
일단 창문 프레임은 복습 차원으로 찌그러지는 세팅을 빠르게 작업을 진행해주도록 한다.
자동차의 유리는 탑승자의 안전 때문에 강화유리로 묘사되는 것이 기본이다. 문제는 작업했던 강화유리의 세팅을 봤을 때 상당히 많은 조각이 필요했었다.
몇천 조각 이상이 필요해지는데 합리적인 방법은 아닌 것 같다. 다른 방식의 묘사가 필요하다.
일단 찌그러지는 면처럼 표현해 주고, 조각 처리를 진행하기로 한다.
결과가 아쉽다.
면이 너무 적은 상태이고, 강화유리처럼 보이지도 않는다.
이런 때 해줄 수 있는 방법으로, 원본 데이터를 point deform에 넣어주기 전에 이때 voronoi fracture로 면을 나눠주는 방법이다.
voronoi fracture를 적용할 때는 가급적 point deform 전에 하는 것을 추천하셨다. 그 이유로는 point deform 이후에 scatter로 포인트를 뿌리고 조각을 내주면 애니메이션에 따라 포인트의 위치가 변할 수 있어서 조각 또한 다르게 얻게 될 수 있기 때문이다.
자동차는 끝이 났다.
앞으로의 고민
다른 씬의 자동차 충돌 혹은 폭발등을 넣으려면 해야할 작업이 훨씬 많이 남아있다.
- 좀 더 복잡한 치환규칙을 만들어준다면, 부러지는 부품들에게도 붙어있는 조각들에는 찌그러지고 구부러지는 묘사를 해줄 수 있을 것이다.
- 파티클의 사용이다. 작은 조각들로 충돌의 느낌을 더욱 살려줄 수 있다. 특히 강화유리가 깨질 때 파편을 제외한 더 작은 가루 같은 것이 팍 튀는 것을 묘사할 수도 있다.
- 굴곡에 대해서 curvature 값으로 어느 부분이 찌그러졌는지를 구해줄 수 있다. solver를 이용해서 이전 프레임의 굴곡과 현재 프레임의 굴곡의 차이를 활용하면 새롭게 찌그러진 곳에 대한 판단이 가능해진다. 그러면, 찌그러진 면 쪽의 도장이 까지게 되는데 바뀐 곳의 색을 바꿔줌으로써 풍부한 표현이 가능해진다.
- 지금까지 작업한 내용을 가지고 충돌을 진행하면 bonnet이 들릴 수 있는데, 엔진룸 안쪽의 디테일을 올려줄 수 있다. 엔진룸 안쪽에 엔진 데이터를 넣어줌으로써 자동차의 무게배분 또한 맞춰줄 수 있다. (지금 데이터는 자동차의 뒷부분에 무게가 많이 실리는 상황인데, 엔진을 넣어줌으로써 앞으로 무게를 맞춰줄 수 있다.)
- 연기작업 또한 가능하다. 무언가 터져나가서 나오는 짙은 스모크가 아닌, 아주 옅게 충돌 순간에 발생하는 그런 연기 말이다.
- 하체가 바닥과 충돌하는 것을 캐치할 수 있다면, 충돌 시 스파크가 튀도록 해줄 수도 있을 것이다.
원리를 이해하고 어떠한 자동차 모델링을 가지고서도 rigidbody 세팅을 만들어낼 수 있을만큼의 반복 숙달이 필요하다.
강의가 진행됨에 따라 어떻게 아이디어가 확장되는지를 주의깊게 보고, 작업자가 필요한 만큼 스스로가 시스템을 만들어볼 수 있어야 한다.
그렇지... 부딪혀서 조각나고 찌그러지고 그런다고 끝일리가 없지...
움직이는데 먼지가 안나면 이상한 거고, 부딪혔는데 먼지 안 나면 이상하지... 쇠가 바닥에 끌리는데 스파크가 없는 것도 이상하고, 찌그러졌는데 도장이 안까지는 것도 이상하지...
끝이 끝이 아니었다. 아주아주아주아주 작고도 소중한 한 발의 내딛음이었다.
갈 길은 9만 리 이지만, 한 걸음 앞으로 갔으니까 또 한 걸음 가보도록 하자!!
그래서... 난 포트폴리오를 어떻게 구상할 것인가...?
다른 포트폴리오들을 봤을 때 기본적으로 깔고 들어가는 그런 묘사들은 다 할 줄 알아야 할 것인데...
여기에 추가적으로 보여줄 수 있을 필살기...
아니다. 일단 기본적인 부분부터 제대로 표현을 해보도록 하자.ㅠ
9만 리 - 한걸음