재질을 예쁘게 묘사하는 핵심
- 얼마나 조각을 예쁘게 준비하느냐
- 얼마나 어울리는 constraint 규칙을 활용하느냐
오늘 배울 재질 표현 : 콘크리트
- constraint 규칙이 그나마 가장 쉽다.
- 유독 콘크리트 묘사에서 조각을 내는 것에 대해 할 이야기가 많다.
수업의 흐름
- 조각의 준비
- 충돌할 물체를 최대한 단순화해서 시뮬레이션 진행
- Brute & 자동차를 콘크리트 벽에 충돌시켜보기
위 이미지의 의미
- 작업을 하게 될 과정의 순서
- 작업자가 어떠한 단계까지 콘크리트에 대한 묘사를 해줄지에 대한 선택지
'선택지' 라는 단어의 의미
디테일의 차이는 있지만, 큰 골격은 네가지 케이스가 비슷하다.
작업자가 어떤 작업을 하느냐에 따라 필요한 디테일의 양이 달라진다.
조각난 면의 디테일이 네번째처럼 다 보여야할 작업이 있고, 디테일을 보기엔 거리가 있어서 두번째 혹은 세번째 정도로 타협을 보고 작업을 진행해도 되는 경우가 있다.
작업하는 내용의 스케일에 따라 디테일을 얼마나 살릴지, 디테일을 얼마나 포기하고 시뮬레이션의 속도를 올릴지를 고민해야한다.
- 작업자가 의도를 가지고 어디까지 디테일 작업을 진행할 것인지 직접 판단을 내릴 수 있어야 한다는 의미이다.
첫번째 케이스
box에 voronoi fracture를 적용했을 때의 결과
디테일을 살리기 전, 가장 기본이 되는 조각의 흐름을 표현
디테일이 올라가는 과정은 procedural 하게 준비하게 된다.
두번째 케이스
voronoi fracture가 적용된 첫번째 케이스에 치핑(chipping)을 해준 결과
큰 조각의 모서리 부분이 랜덤하게 조각나도록 해줄 작업
모든 모서리가 일정하게 다 조각나는 것도 아니고, 어떠한 seed 값에 의해서 조각나는 모서리가 바뀔 수 있다면, 작업자가 마음에 드는 케이스를 직접 골라서 사용할 수 있다.
기왕이면 조각나는 깊이도 조절이 가능했으면 좋겠다.(얇게 / 두껍게)
세번째 케이스
노이즈를 활용한 조각내기
첫번째 케이스와 큰 골격이 동일하지만, 절단면에 노이즈가 추가되었다.(노이징)
네번째 케이스
두번째 케이스인 치핑과 세번째 케이스인 노이징이 같이 적용된 결과
치핑을 위한 기본 골격의 제작
Voronoi Fracture
Fracture : '조각을 낸다' 를 뜻함
Voronoi : 공간의 기준을 잡는 방식 중 하나
어떠한 공간에 대해 어떤 포인트와 더 가까운지를 기준으로 영향을 나누는 것
파란색 두 점에 대해 선으로 이어준다면, 빨간색 선과 같이 연결해줄 수 있을 것이다.
이 때 생성되는 빨간 선에 대해 수직인 평면이 존재하게 된다.
(3d 공간에서 위의 빨간 선에 대해 수직인 선은 무수히 많고, 그 선들이 포함되는 면이 존재한다.)
선의 규칙
각각의 조각이 빨간 선에 대해 수직인 방향으로 쪼개졌다.
쪼개는 면과 면이 만나는 지점에서는 더이상 뻗어나가지 않는다.
작업자가 원하는 방향으로 쪼개기를 원한다면, 포인트를 기준으로 쪼개려는 면과 수직인 선을 그어주고, 그어준 선의 길이만큼 더 간 위치에 놓일 포인트가 필요하다.
위와 같이 귀퉁이에 대해 직접 포인트를 위치시켜서 잘라내줄 수 있다.
만약, 작업자가 물체의 중심을 알고 있다면, 각각의 꼭짓점을 활용해서 귀퉁이를 잘라낼 수 있지 않을까?
미리 뽑아놓았던 grid의 네 귀퉁이의 점이 중심으로부터 멀어진다면? 쪼개지는 면이 중심에서 멀어지면서 조각나는 사이즈가 작아지게 될 것이다.
위의 네 포인트의 위치가 조금씩 달라진다면, 쪼개지는 단면의 방향 또한 달라지게 될 것이다.
그렇다면, voronoi에서 사용할 각각의 포인트들(각각의 꼭짓점)은 중심으로부터 어디까지 멀어질 수 있을까? 멀어지는데 한계가 필요하다. 초기 꼭짓점과 중심점의 거리보다 2배 이상 멀어지게 될 경우, 중심점과 voronoi에서 사용할 꼭짓점을 이어주는 선의 중심에 쪼개는 면이 생성되는데, 쪼개는 면이 물체를 벗어나게 되어서 조각이 생성되지 않는다.
box에서 확인해보자.
실전에서 사용하게 될 때는, 물체의 중심을 따로 구해줘야 하고, 구해진 중심에 대해 얼마나 멀리 포인트를 이동시켜야할지에 대한 작업이 필요하다.
Extract Centroid Node
- 물체의 중심을 구해주는 노드
- Method에 따라 구해주는 중심이 달라진다.
- Center of Mass : 무게중심
- Bounding Box Center : 일반적으로 Bound 노드의 Box를 적용했을 때 생성되는 Box의 중심점과 같은 결과
이제 각 포인트의 위치를 구해주고, 중심점에 대해 거리 조절이 가능하도록 세팅해보자.
vector mypos 변수에 물체의 각 귀퉁이의 위치정보를 저장해주고, vector center에는 물체의 무게중심(중심점)의 위치를 저장해준다.
그리고 방향을 정해줘야하는데, 중심점으로부터 멀어지는 방향이어야 하기 때문에, 귀퉁이 각각의 위치에서 중심점의 위치를 빼줌으로써 방향을 정해줄 수 있다.
그냥 이 값을 @P에 더해주게 되면, 중심점에서 각 귀퉁이의 거리만큼 더해지게 되므로(두배가 된다고 보면 된다.) 이것을 조절해주기 위해서 channel float을 곱해줘서 조절해준다.
조각이 날 때, 모든 귀퉁이에서 조각이 발생하지 않을 수도 있다. 어떤 때는 모든 귀퉁이에서 조각이 발생할수도 있겠지만, 어떠한 경우에는 임의의 귀퉁이에서만 조각이 발생할 수도 있다.
이와같은 조절을 하기 위해서 어떻게 해야할까?
각 꼭짓점에 대해 어떤 포인트를 사용하고 사용하지 않을지를 정해주면 된다.
임의의 가중치를 각 꼭짓점에 부여해주고, 특정 값을 기준으로 가중치가 더 높으면 조각을 생성하도록 사용하고, 가중치가 낮으면 사용하지 않도록 할 수 있을 것이다.
물체를 바꿔서 적용해보자.
위의 물체의 경우, 한쪽에 포인트가 많이 몰려있다. 그래서 이쁘게 결과가 나오지 않을 수 있다.
이런 경우에는 일정 거리 안에 포인트가 뭉쳐있을 경우, fuse 노드를 사용해서 하나로 합쳐버려서 정리해주는 것이 예쁜 결과를 만들어내는 방법이 될 수 있다.
이제 모든 조각에 대해 적용해보자.
랜덤한 vector 값을 더해줌으로써 포인트들의 위치에 살짝 변화를 가해줘서 쪼개는 면의 방향을 살짝씩 틀어줄 수도 있을 것이다.
여기에 조각이 나는 깊이를 조절해주는 deep에도 랜덤한 값을 곱해줘서 조각나는 깊이에도 차이를 둘 수 있도록 해보자.
이제 시뮬레이션 세팅을 잡아보려고 한다.
어떻게 constraint 세팅을 잡느냐도 매우 중요하다.
- constraint를 만드는 방식에 따라 작업자가 다양한 옵션을 가지고 작업을 할 수 있는 것이 있고, 그렇지 않은 constraint 세팅도 존재한다.
constraint 세팅은 이전에 만들어줬던 subnetwork로 묶은 데이터를 이용해준다.
충돌할 물체도 sop 세팅을 이용해서 만들어준다.
조각을 늘려보자.
위에서 언급했던 것 중, constraint 세팅에 따라 작업자가 부가적인 옵션을 가지고 작업할 수 있는 것이 있고, 아닌 것이 있다고 했었다.
현재 사용중인 constraint 세팅은 'area'라고 하는 좋은 정보를 가지고 있다.
- area는 조각끼리의 닿은 면적을 구해준 정보이다.
이 정보를 활용할 수 있는 방법으로는 아마도, 조각이 작아서 조각끼리의 닿은 면적이 작다면 잘 부숴져서 조각나는 것이 맞을 것이고, 큰 조각이라서 조각끼리 닿은 면적이 넓다면 상대적으로 더 큰 고정력을 가지게 되어서 덜 부숴지게 될 것이다.
(area 정보와 glue constraint의 strength를 잘 조합하면 될 것 같다.)
만약 strength에 area를 곱해준다면, area가 작은 조각은 strength 또한 작아지게 될 것이다.
둘의 차이는 @area가 적용되지 않을 경우, 모든 constraint가 일괄적으로 strength가 10000으로 적용된 것이다.
이렇게 strength가 일괄되게 적용될 경우, 조각과 조각 사이가 매우 작은 면으로 붙어있더라도 그 힘은 10000으로 고정되기 때문에 잘 떨어지지 않을수도 있다.(부자연스러운 결과가 나올 수 있다.)
그래서 닿은 면적에 대한 정보를 strength와 함께 조합하려는 것이다.
f@area 라는 정보는 굉장히 절대적인 정보이다.(면적에 대한 정보이기 때문에)
만약 손 안에 들어오는 작은 유리잔을 깨게 된다면, 유리조각들 사이에는 축척에 맞춰서 더욱 약한 f@area 값을 가지게 될 것이다.
이렇게 될 경우, 원하는 결과를 얻기 위해서 dop network 안에서 glue constraint의 strength 값을 무한정 높이게 될 수도 있다.
반대로, 빌딩같은 규모가 큰 조각을 작업하게 된다면 어떻게 될까?
위의 케이스와는 반대로 f@area가 strength에 바로 곱해지게 될 경우, 작업자의 예상보다 훨씬 더 딱딱한 결과를 얻게 될 수도 있다.
dop network 밖에서 f@strength를 정의해줄 경우, 이 값은 dop network 안의 glue constraint의 parameter로 있는 strength 값에 곱해지게 된다.
- ex) dop network 밖의 @strength가 0.1이고, glue constraint의 strength parameter 값이 1000일 경우, glue constraint의 최종 고정력(strength)는 0.1 x 1000 = 100이 된다
그렇기 때문에, dop network 안의 glue constraint의 strength parameter를 1로 세팅할 경우, dop network 밖에서 만들어주는 f@strength 값이 곧 glue constraint의 최종 고정력이 된다.
이제 f@area를 제대로 활용해보자.
아이디어)
- f@area는 비율로 사용된다.
- 다른 상수를 사용해서 곱해줌으로써 f@strength를 조절할 수 있도록 해준다.
이제 area_ratio를 만들어줘야한다.
먼저 @area의 최대값을 알아낼 필요가 있다.
sort 노드를 사용해서 area에 대해 내림차순으로 정렬을 해준다.(높은 값 > 낮은 값 순서)
이렇게 하면, 0번 primitive로 area 값이 가장 높은 것이 오게 되고, prim function을 활용해서 attribute wrangle에 변수로 불러와준 뒤, fit function을 활용해서 0~1 사이로 조절해준다.
여기에 한번 더 변화를 줘보자.
area_ratio를 channel ramp로 조절이 가능하도록 해보자.
현재 면이 작은 primitive들은 area값이 거의 0에 가까울정도로 낮은 상태일 것이다.
위와같이 ramp를 조절해주면 어떻게 될까?
만약 위와같이 ratio를 조절해준다면?
작은 조각들도 큰 고정력을 가지도록 하고 싶다면, ramp parameter의 값을 위의 케이스와 같이 높여서 적용하면 될 것이고, 작은 조각들의 고정력을 낮추고 싶다면, ramp parameter 값을 아래 케이스와 같이 낮춰주면 될 것이다.
더이상 glue constraint의 고정력 조절을 위해 dop network 안으로 들어가서 이값 저값 바꿔줄 필요가 없게 되었다.
어제의 그 뮤턴트 애니메이션에도 적용해봤는데, 영...
box를 날카로운 팔로 찢어낸다는 느낌보다는 좀 뜯어내는 그런 느낌이라서...;;
아직 재질에 대해 더 배우면 다시 해보고싶다 :)
'Houdini > Houdini1_Rigidbody' 카테고리의 다른 글
RIGID BODY_18 재질표현 + 어려움🔥🔥🔥 - Ep18_Part 03. 출력준비 (Brute & Car) (0) | 2023.04.25 |
---|---|
RIGID BODY_18 재질표현 + 어려움🔥🔥🔥 - Ep18_Part 02. Advanced Con sys - 노이즈+치핑 시스템 (1) | 2023.04.21 |
RIGID BODY_17 캐릭터의 충돌조건 - Ep17. mixamo 캐릭터로 충돌조건 만들기 (2) | 2023.04.19 |
RIGID BODY_16 CONSTRAINT의 변형 (1) | 2023.04.18 |
RIGID BODY_15 리깅 시뮬레이션 BASIC - Ep15_Part04. 자동차 서스펜션 시스템 (1) | 2023.04.14 |