Pack의 특징
- 복잡하고 많은 자료를 하나의 자료로 압축해서 작업이 가능하다는 점
- 메모리에 업로드된 자료를 마치 스트리밍하듯 불러서 껍데기(가상의 원본)만 활용이 가능하다는 점
이 결과로, 메모리 효율측면에서 큰 이익이 있다.
이제 pack 사용의 실전감각을 기르기 위해 작업을 진행해보자.
나무조각 만들기!
- 제작의 큰 순서
- box 하나로 나무조각 만들기
- box의 모양 변형하기 & 면 추가
- box를 조각내고 약간의 빈틈 추가하기
- box에 나무 질감 입히기
- 어떠한 box가 들어가도 시스템이 올바르게 나무조각을 만들어낼 수 있어야한다.
box의 사이즈를 변경하기 위해 attribute wrangle을 사용해 @pscale을 변경해줄 수 있다.
- 이것은 transform의 uniform scale을 변경하는 것과 결이 같다.
이 방법 말고 box 사이즈를 변경하는 또 다른 방법이 있다.
- v@scale의 값을 변경해주는 것이다.(vector 정보이다)
- 이것은 transform의 scale 값을 조절해주는 것과 결이 같다.
서로 다른 scale을 가질 수 있도록 attribute wrangle을 만들어준다.
기준이 되는 base size를 정해준다.(나무조각의 기준이 되는 크기)
그리고 여기에서 각각의 box 스케일이 조금씩 다를 수 있도록 만들어준다.
color도 각각 다르게 적용될 수 있도록 해준다.
현재 결과는 후디니가 받아들일 때 세개의 box로 인식하는 것이 아니고, 많은 포인트와 많은 primitive를 가진 지오메트리로 인식할 뿐이다.
이 상태에서는 for-each primitive를 적용해도 각각의 면에 적용될 뿐이다.
이것을 해결하기 위해 box를 copy to points 적용 전에 pack해준다.
이것은 box를 pack해준 껍데기의 사이즈를 변경하고 color를 변경해준 것으로 이해하면 된다.
그리고 이것은 이제 각각의 primitive로 떼어낼 수 있다.
이렇게 적용함으로써 각각의 box를 수정(점, 선, 면의 작업)해줄 수 있게 된다.
point 생성규칙을 바꿨다.
copy stamp를 적용해서 포인트를 여러개 복제해준 뒤, copy to points의 두번째 인풋으로 넣어줬다.
Divide
면을 나눈다.
remesh와는 결이 다르다.
Maximum Edges : 면을 나눌 때 만들어지는 도형의 최대 선 개수(3일 경우 삼각형 모양)
Bricker Polygons : 아래 간격에 맞게 면을 나눈다(위의 이미지는 size를 1 by 1 by 1으로 면을 나눈다.)
Poly bevel에 들어가는 Distance 값을 @pscale로도 조절이 가능하다.
각 포인트마다 bevel이 되는 속도의 차이가 심하므로, Attribute noise로도 pscale을 만들어주고(대조군) 이 둘을 blend shape 노드로 적절하게 섞어준다.
이젠 조각을 내보자.
- voronoi fracture를 사용한다.
Voronoi Fracture Node
- 점을 기준으로 물체를 쪼갠다.
- 그렇기 때문에 자르는 기준이 될 점이 필요하다.
쪼갠 모양이 나무를 쪼갠 느낌은 아니다. 수정이 필요하다.
z축 방향으로 확 줄여놓고 voronoi를 적용한 다음, z축 방향으로 스케일을 원상복구하면, 쪼개진 파편들이 길쭉한 나무파편처럼 묘사된다.
Assemble Node
- Create Packed Geometry를 활성화해줄 경우, voronoi가 적용된 각각의 piece를 pack이 적용된 지오메트리로 변환해줄 수 있다.
voronoi를 적용한 결과로 name 정보가 생성되는데, Assemble 노드를 달아주면 이 때 생성된 name이 같은 조각들끼리 pack으로 묶어놓는다.
위의 파편의 위치를 살짝 틀어보자.
- point jitter를 적용해서 pack된 조각들의 위치를 흩어놓았다.
임의의 파편을 지워보자
- removepoint를 사용해서 점을 지울 경우, 그 점의 번호에 해당되는 조각이 삭제된다.
pack된 자료의 특징
가상의 원본(pack이 적용된 자료)은 point에 저장이 되는 것이 아닌, primitive에 저장된다.
point에는 pack된 자료가 어디에 놓일 것인지에 대한 위치정보, pack은 어떤 이름을 가지는지 등, 이런 내용들을 point에 달고 다닌다.
시뮬레이션에 들어가게 되면, pack이 적용된 자료의 무게, 시뮬레이션에 의해 움직일 것인지에 대한 내용 등도 point에 저정하게 된다.
point를 날려버리는 행위는 'pack이 적용된 자료가 놓일 위치를 없앤다.' 라고 생각하면 된다.
표면 처리 작업을 위해 vdb from polygon으로 SDF를 만들어준 뒤, 다시 convert VDB > polygon으로 변환해서 조각나서 씹히거나 떨어져있는 오브젝트들을 한덩어리로 합쳐준다.
(선생님은 remeshgrid 라는 노드를 소개해주셨는데, 찾아보니 후디니 19버전부터 들어가있는 노드인것 같다.)
- vdb from polygon 및 convert VDB의 조합은 원래 volume 에 대한 작업이 우선이기 때문에 부가적인 계산들이 더 많아서 느리다고 한다.
어쨌든, 나는 Remesh Grid 노드를 찾지 못해서 일단 VDB From polygon / Convert VDB 로 작업을 계속 진행하였다.
이제 나무결을 만들어보자
Displace Along Normal
- 오브젝트가 가지는 각각의 포인트의 위치가 normal값에 따라 이동하게 된다.
- @P += @N * chf("Amount"); 와 같다고 보면 된다.
위의 이미지와 같이 global에서 P(position)와 N(normal)을 displace along normal의 parameter에 연결해주고, Output의 P에 연결해주면, Displacement Amount의 값에 따라 부피가 커지게 된다.
Veins
- 일종의 패턴이다.
- P(position)정보를 받아서 0~1사이의 값(amount)을 반환한다.
veins를 잘 다루기 위해서는 parameter를 다루는 순서를 정할 필요가 있다.(참고로 위의 결과는 noise가 적용된 결과이다.)
- 상단의 parameter를 다루고나서 마지막에 noise amplitude를 올려주는 것이 veins를 이해하는데 도움이 된다.
vein spacing : 줄무늬 패턴의 간격에 변화를 준다.
vein attenuation : 검은 부분의 세기를 조절해준다.
vein frequency : vein spacing과 느낌이 유사하다. 값에 따라 패턴의 간격이 변한다. noise를 적용했을 때 두드러지게 확인할 수 있다.
vein direction : 줄무니 나이테가 생기는 방향을 지정할 수 있다.
vein의 결과를 displace along normal의 amount로 넣어주고, scale을 조절해서 울퉁불퉁한 나무질감을 추가해준다.
나중에 시뮬레이션에서도 활용을 하기 위해 약간 수정을 해주도록 하자.
기왕이면 초기의 box의 크기와 마지막 결과로 나오게 되는 나무조각의 크기가 같았으면 좋겠다.
지금도 크기가 많이 차이나는것은 아니지만, bounding box로 보면 약간의 차이가 존재한다. 이것은 결국 시뮬레이션에 들어갔을 때 찜찜함을 만들어내는 그런 요소가 될 수 있다.
우리가 만들어준 나무조각의 중심점이 일단 초기 box와 다르다.
중심점이 0, 0, 0이 아니라서 비율을 조정하기도 조금 애매하다.
중심점을 이동시켜주자.
초기 box의 bounding box와 나무조각의 bounding box를 attribute wrangle을 사용해서 비율을 구해준 뒤, 그 비율을 scale 값으로 활용한다.
비율의 조절을 용이하게 하기 위해 @P를 0,0,0으로 맞춰놓았었다. 하지만, 모든 작업이 끝났을 때는 다시 원래의 위치로 복구해야하는 과정이 남아있다. attribute wrangle을 사용해서 기존 위치를 저장해뒀다가, copy to points를 적용하기 전 @P를 복구시킨다.
- 이런 때를 대비해서 위치를 변경하기 전에 기존 위치를 남겨놓을 수 있는 어트리뷰트를 만들어주도록 한다.
- 혹시 모를 나중을 대비해서 기존의 위치나 길이등의 정보를 남겨놓는 것이다.
정리
- pack / unpack 쉽게쉽게 다룰 수 있어야 한다.
- 효과를 적용하기 전과 적용한 후의 크기가 같아야한다.
- 어디에서 무엇을 바꿨을 때 나뭇조각의 부러진 정도나 크기 등을 조절할 수 있는지도 알고 있어야한다.
오늘의 일기는 주말동안의 과제로 대체하려고 합니다.
후디니 공부를 어떤 목적으로 하는가?
- 한줄요약 : 후디니스트로 취업해서 이직하기 위해 공부합니다.
CG에 처음 관심을 가지게 된 것은 '2012'라는 재난영화를 극장에서 본 것이었습니다.
건물이 박살나고 화산이 폭발하고 해일이 몰려오고 그런 효과들을 보면서 나도 저런 멋진 장면을 만들고 싶다는 꿈이 생겼습니다.
근데 꿈에 도전하기엔 그 당시엔 정보도, 자금도, 아무것도 없었어요.
개인적인 이유로 어찌저찌 CG 업계로 발을 들이게 되긴 했지만, VFX와는 동떨어진 직군이었고, 꿈에 대한 갈증은 계속되었답니다.
이런 저런 분야들을 경험하게 되면서 unreal engine도 사용하게 되고, 후디니를 배울 기회도 TWA를 통해 얻게 되면서, 이제서야 이 갈증을 풀 수 있게 되었네요.
지금은 자기만족 및 갈증을 해소하는 것으로 끝나는 것이 아닌, 후디니를 무기로 앞으로의 이직을 진행해보려고 합니다. 물론, 약점이 많은 사람입니다만, 그만큼 더 절박한 심정으로 최선을 다해보고 있습니다. :)
무엇을 만들고 싶은가?
- 한줄요약 : 영화 / 게임회사 등 영상쪽 VFX 포트폴리오를 만들고 싶습니다.
TWA 수업을 듣기 전에는 기본기를 더욱 탄탄하게 다지고, unreal engine에 연동되는 디지털 어셋을 만드는 쪽을 생각했었습니다. (이 부분은 현재 업무와도 약간 연관이 있을 수 있기에 생각했던 방향이었습니다.)
하지만, 수업을 들으면 들을수록 실무에서 VFX 관련 작업을 하고 싶다는 생각이 커지게 되면서, 생각이 바뀌었답니다. 그래서 수업을 다 듣고 포트폴리오로 영화 / 게임회사 등의 영상팀 문을 두드려볼 수 있는 포트폴리오를 만들어보려 합니다.
무언가 주저리주저리 썼는데 결국 취업(이직)을 위해서 공부하고 포트폴리오를 만들겠습니다!!! 네요 하하
그래도 후디니는 재밌습니다.