https://www.twahoudini.com/course/rigidbody1
HOUDINI1_ RIGIDBODY
3️⃣ 출동 SIMULATION 기초 이론부터 심화된 내용을 공부합니다. 또한 자동차를 이용한 리깅 시뮬레이션 BASIC을 훈련합니다.
www.twahoudini.com
RigidBody08에서는 레고를 Procedural하게 모델링해볼 예정이다.
Procedural modeling은 결과물을 논리적으로 만들어서 최대한 사용자의 편의에 맞추는 것이다.
그냥 단일한 Lego Block 하나를 modeling하는 것이 아니다. 기왕 시스템을 만드는 거, 우리 원하는 모양의 규격을 입력하면 그에 맞게 바로 Lego Block이 만들어지게 해볼 것이다.
그리고 Lego block이 1x1부터 10x10까지 모두 준비가 필요하다면 그에 맞는 아이디어를 미리 준비해야할 것이다.
목차
1. 전체 제작 과정
2. 기술 확인
3. 레고 블럭이 어떤 규칙으로 생겼는지
4. re) 전체 제작 과정 (1과 유사)
5-1. 모델링
5-2. 레고 스타일 바꾸기
5-3. Multi 레고
6. Colors
1. 전체 제작 과정
레고 블럭의 모양은 크게는 2가지, 세부적으로 분류하면 4가지 정도 된다.
먼저 레고 모양을 2x4로 가정하고 어떻게 만들어지는지 이야기해보겠다. 2x4 모양은 x로 2칸, z로 4칸으로 x,z 값 모두 1보 다 클 때의 규칙이다.
화면에 보이는 8개의 point들을 올바른 규칙에 의해 위치시키는 것이 이번 강의의 핵심 내용이 될 것이다.
해당 Point들을 바탕으로 이후 만들어낼 Box의 꼭지점의 위치를 파악할 필요가 있다.
새롭게 구해진 8개의 꼭지점들을 Box로 변환시켜줄 것이다.
이제 레고 블럭의 아래쪽을 Boolean node로 파주려 한다.
이때 Boolean을 이용하기 위해서 기존 Box를 기준으로 파내고 싶은 만큼의 Box를 만들어주어야 한다.
Boolean에 필요한 Box를 만들기위해서 중심이 되는 8개의 핵심 point들을 이용해준다.
원하는 느낌으로 Box를 Boolean해주었다면, 이제 레고끼리 장착이 되기 위한 버튼 Stud를 만들어줄 것이다.
이 작업에 또한 앞서 만든 8개의 핵심 point들이 필요하다. 해당 point들의 위치에 stud가 놓이게 될 예정이다.
또한 Stud가 생김에따라 Stud 뒤쪽의 공간을 뚫어주어야 한다. 해당 부분을 뚫어주어야 레고블럭의 느낌이 살아난다.
블럭들끼리 합체하기 위해선 위쪽의 Stud가 다른 블럭의 아래에 끼워져야 한다.
여기서는 핵심 point들을 기준으로 새롭게 Stud가 끼워질 부분의 point 규칙을 만들어주어야 한다.
새롭게 만들어진 3개의 point들을 기준으로 back_anti를 붙여줄 수 있다.
여기까지가 기본 모양을 만드는 과정이었다.
이제 이 Base 모양을 기준으로 좀 다양하게 자료 준비를 해줄 것이다.
가벼운 simulation을 위한 Proxy, Base에서 Bevel을 준 자료, Bevel의 자료에서 Subdivde를 준 자료 그리고 마지막엔 Logo가 달린 레고를 만들어줄 예정이다.
2. 기술 확인
오늘 rigidbody08에서 쓰일 Skill은 총 3가지이다.
1. Boolean (basic)
2. Box with Custom Points
3. If 조건문 with nodes
먼저 Boolean을 다루어보겠다.
Box와 Sphere를 하나씩 생성해준다. Transform으로 Box와 Sphere의 크기와 위치를 조절해 순서대로 Boolean에 연결해주겠다.
Boolean node는 마치 밴 다이어그램과 같다.
Boolean의 Input1으로 들어가는 것이 Geometry A, Input2로 들어가는 것이 Geometry B이다.
Boolean의 파라미터에서 Operation을 신경써주면 된다. 위의 사진은 Substract(A-B), Union, Intersect의 결과이다.
이때 Boolean에서 Union을 함으로써 유용한 점은 두 물체가 붙여질 때 중간의 불필요한 부분은 사라져 뚫린부분이 된다는 것이다.
다음은 Custom Points로 Box를 만들어보려 한다.
사실 상자를 만드는 방법은 Box가 제일 빠르다. 하지만 작업 상황에 따라 Box의 사이즈 조절로써 모든 것을 해결하는데 어려움이 있는 부분이 있다.
오늘 Box의 좌우 높이, 폭, 크기 조절보다는 Box가 가질 points의 구체적인 위치가 더 중요하게 다뤄질 예정이다.
그래서 Box가 가지고 있는 각각의 8개의 점의 위치를 다 알고 있다고 했을 때 어떻게 하면 우리가 가진 점을 기준으로 Box를 조절할 수 있을지 이야기해보겠다.
Rows와 Columns가 2x2인 Grid를 생성해준다.
해당 Grid는 점 4개로 이루어진 면이다. 그래서 하나의 Primitive가 있고 Vertex에는 면이 생성되는 규칙이 담겨있을 것이다. 이때 각각의 point가 가지는 위치 정보가 바뀐다면 Grid의 모양도 바뀌게될 것이다.
Group을 생성해 3번 point만을 group에 넣어준다. Attribute Wrangle로 해당 Group에서의 3번 point의 위치만을 옮겨주겠다.
결과를 보면 3번 포인트가 움직이면서 Grid의 면이 깨지지 않고 point의 위치에 의해 모양만이 변한 것을 볼 수 있다.
이번에는 구체적으로 각각 Group을 주고 하나씩 바꾸는 것이 아니라, 원하는 위치 정보를 미리 만들어 한번에 Grid에 정보를 넘겨주려 한다. 이때 Attribute Copy를 이용해볼 예정이다.
좌표가 다른 point를 4개 생성해준다. 네 점을 Merge해준다.
이제 Attribute Copy의 Input1에 원본의 정보인 Grid를, Input2에 Reference 정보인 네 점을 연결한 다음 P의 Attributes 정보를 넘겨주겠다.
결과를 보면 앞 뒤가 뒤집힌 Grid를 볼 수 있는데, 이는 Grid의 point number와 네 점의 point number를 보면 0번과 3번의 위치가 바뀌어있기 때문이다.
네 점이 Merge된 순서를 바꾸어 point number의 순서를 변경해준다면, 앞면이 위로 올라간채로 확장된 Grid를 볼 수 있다.
이제 Box에 대해서 이야기해보려 한다.
앞서 Grid에서 네 점을 만들어준 것에서 높이를 1씩 높여준 4개의 점을 추가해준다. 총 8개의 points가 준비된다.
Box(Polygon mesh) 하나 생성해준다. 이때 이 Box의 point number를 보면 우리가 준비해둔 point와는 달리 배열되어 있는 것을 볼 수 있다.
이 상태로 Attribute Copy를 통해 8개의 points에서의 P 정보를 Box로 넘겨준다면, line들이 꼬여 Box가 아닌 무언가 기하학적인 형태가 결과로 나온 것을 볼 수 있다.
이때 Box의 Type을 Polygon mesh가 아닌, Polygon으로 변경해준다면 Box의 point number가 우리가 준비해둔 8개의 point와 비슷하게 1,2층의 형태로 배열되는 것을 볼 수 있다.
Merge에서 points의 순서를 맞춰준 뒤, 결과를 보면 우리가 원했던 느낌의 모양이 유지된 상태로 확대된 Box를 얻을 수 있다.
이제 마지막 3번째 node 단위에서 어떻게 If 조건문을 구현하는지에 대해 배워보겠다.
목적은 Attribute Wrangle Vex Code로 If 조건문을 쓰는 것이 아니라, node에서 If 조건문을 구현할 방법이다.
"만약 현재 Frame이 24 Frame보다 크다면, 내가 가진 point의 색이 빨강색이었으면 좋겠다"고 식을 써보려 한다.
먼저 Attribute Wrangle로 해당 식을 구현해보겠다. 24 Frame이 넘어가면서 point에 빨강색이 들어오는 것을 볼 수 있다.
하지만 지금의 If문 상태는 완결이 나지 않아 좀 불안한 감이 있다.
굳이 완벽한 느낌을 위해서 24 Frame보다 크지 않을 때의 상황에 파란색을 주어 식을 완성시키도록 하겠다.
결과적으로 모든 구간이 조건으로 이용됨으로써 조건의 판별이 완벽해진 상황이 되었다.
이제 위의 조건들을 Attribute Wrangle에서가 아닌, node에서 구성해보려 한다.
이때 Switch가 핵심이 될 것이다. Switch는 어떤 Input을 쓸지 선택해주는 node이다.
A와 B가 있다는 상황을 만들어 Switch에 "$F>24"라는 조건을 넣어준다.
해당 조건을 달성할 때 Switch가 Input2의 내용을 선택하는 것을 볼 수 있다.
이번엔 Switch에 들어갈 내용들을 바꿔주겠다. Input1에는 Null, Input2에는 Add를 연결해주겠다.
조건을 달성할 때는 Add를 선택해 점이 생성되고, 조건에 부합하지 못할 때는 Null에 의해 아무 정보도 생성되지 않는 것을 볼 수 있다.
이때 Switch를 하나 더 복사해 Input1,2를 서로 교체해준다면, 반대로 조건이 부합할 때 Null이 선택되어 정보가 생성되지 않게 된다.
둘의 내용을 Merge로 묶어준다음 Null을 달아 Result라 이름을 지어주겠다.
이때 Merge로 서로 반대의 결과가 나오는 Switch를 묶어줌으로써 모든 순간에 점이 있는 결과를 얻을 수 있게 되었다.
$F이 24보다 큰 순간에는 첫번째 Switch를 통해서 내용이 불러들여지고, $F이 24보다 작은 순간에는 두번째 Switch를 통해서 내용이 불러와진다.
이렇게 node로 만든 방식이 유용한 순간이 따로 있는데, 바로 Vex식으로써 수행과정을 다 쓰지 못할 때 다음과 같은 node 방법이 상당히 유용하다.
예시를 들기 위해서 Box 두 개를 생성해보겠다. 하나의 Box는 Subdivide가 되었으면하고, 다른 Box는 Polybevel이 들어갔으면 한다. 이때 Subdivide와 Polybevel은 code보다는 node가 훨씬 편한 녀석들이다.
이 둘에 아까의 조건의 Switch를 달아준다면, 조건을 달성할 때 Subdivide 달성하지 못할 때 Polybevel이 들어갈 것이다.
좀 더 보기 편하게 만들기 위해서 node의 배열을 바꾸어 Box가 좀 더 중립적인 느낌이 들도록 해주겠다. Null을 하나 더 생성해 Null 두 개 사이에 Box가 배치되도록 해주겠다.
그런데 두 결과 중 하나를 고르는 방식이라면 아까의 방식과는 다르게 해결할 수도 있다.
하지만 이러한 Box에서 내려오는 방식은 우리가 Attribute Wrangle에서 사용했던 If문의 구조와 작업 순서가 다르기 때문에 좀 더 어려운 내용에서 사용의 어려움이 생기게 될 것이다.
이에 Attribute Wrangle에서의 If문 구조와 같은 아까의 node 배열을 앞으로 사용할 예정이다.
3. 레고 블럭이 어떤 규칙으로 생겼는지
레고 만들기를 시작하기 전 일단은 규칙을 올바르게 세우기 위해서 레고가 어떤 규격으로 이루어져 있는지 알아야 필요가 있다.
위 사진은 레고의 규격 사진이다. 수식도 많고 소숫점의 숫자도 많은 것을 확인할 수 있다.
그런데 숫자들을 자세히보면 어떠한 규칙이 보이는 것을 알 수 있다.
불필요한 수식들을 지우고, 전체 길이를 1.6으로 약분해주도록 하겠다.
이제 구해준 레고 비율을 가지고 다른 레고 조각은 어떻게 생겼는지 분석해보도록 하겠다.
먼저 2x4의 높이가 짧은 레고를 분석해보도록 하겠다.
Stud는 길이가 3인 것이 4개이고, Stud들 사이의 간격은 2인 것이 3개이다.
레고의 한 Stud에서의 블럭 길이가 5이기 때문에 Stud 길이인 3을 빼고 나면 2의 길이가 남는다.
앞서 구해준 3*4 + 2*3 남은 두 길이인 2를 더해주고나면, 전체 2x4 블럭의 세로 길이가 20인 것을 알 수 있다.
그런데 방금 구한 방식이 아닌, 다른 기준으로도 길이를 측정할 수 있다. 이제 새롭게 말할 다른 방법이 우리가 Procedural하게 레고를 만드는데 그리고 레고의 모양을 이해하는데 더 도움이 될 것이다.
Stud 중심간의 간격을 가지고 길이를 쟤보겠다. 길이가 5인 부분이 3개이다.
나머지 추가적인 부분은 Stud 반개 정도의 길이 두개, 그리고 나머지 Stud 이외의 가장자리 부분 두개이다.
해당 나머지 부분의 구성이 레고 비율 사진과 비교했을 때 노랑 레고에서의 가로 길이와 같은 것을 볼 수 있다.
5*3 + 5(나머지) = 20로 2x4 블럭의 세로 길이가 구해지게 된다.
세로 길이를 구할 때의 두 가지 방법으로 가로 길이 또한 구해보겠다.
3*2(Stud) + 2(Stud 사이 간격) + 1*2(남은 길이) = 10이 나온다.
다른 방법으로는 5*1(Stud point 간격) + 5(나머지) = 10을 구할 수 있다.
그리하여 2x4 블럭에서 2인 부분의 길이가 10, 4인 부분의 길이가 20인 것을 알 수 있다. 결과적으로 10/2 = 5, 20/4 = 5로
1x1의 블럭의 길이가 5인 것을 알 수 있다.
만약 3x6의 블럭이라면 가로 길이는 3*5 = 15, 세로 길이는 6*5 = 30이 될 것이다.
이렇게 기본이 되는 Box의 Size 규칙을 배웠다.
이제 규칙을 더 만들기 전, 우리가 Houdini에서 레고를 직접 만들 때 어딜 기준으로 만들지 생각해보아야한다.
만약 1x1의 블럭부터 형태의 기준을 어디에 두고 작업을 시작해야 할지 보도록 하겠다.
1x1의 블럭의 좌우 길이가 5인 것을 알고 있다. 또한 Stud의 지름이 3, 높이가 1인 것도 알고 있다.
하지만 블럭의 중심에서 끝까지의 길이가 2.5, Stud의 반지름의 길이가 1.5로 계산할 때 약간의 불편함이 예상된다. 이를 해결하기 위해서 전체적으로 2를 곱해주도록 하겠다.
이제 앞선 비율을 잊고 해당 비율로 작업해줄 예정이다. 이에 1x1 블럭의 좌우 길이가 10x10이 될 것이다.
2x1 블럭의 모습을 위에서 한번 그려보도록 하겠다.
이때 Stud의 중심을 기준으로 Stud를 그리게 되고, 해당 Stud를 기준으로 2씩 띄워서 Box를 그리게 된다. 이에 블럭의 꼭짓점의 위치가 구해지게 된다.
예를 들어 맨 왼쪽 위의 꼭짓점은 Stud의 중심을 기준으로 왼쪽으로 5칸, 위쪽으로 5칸 위치에 놓여 있다.
이렇게 Stud의 중심이 레고 블럭의 꼭짓점을 구하는데 이용될 것이다.
여기까지의 내용을 전부 이해했다면 도면상의 내용은 다 구현할 수 있게 되었을 것이다.
이번에는 도면 블럭의 옆모습을 그려보겠다. 빨강색 1x2 블럭부터 그려보겠다.
먼저 Stud의 중심을 잡아주고 그 위로 Stud의 높이, 지름에 따라 Stud를 그려준다.
그 다음 블럭의 가장자리를 그려주고 4칸의 높이를 그려 닫아주도록 한다.
노란색 블럭을 그려보겠다. Stud의 중심을 잡아주고 그에 따라 Stud를 그린 뒤 아래로 12칸의 높이를 그려준다.
도면을 기준으로 XZ Plane과 XY Plane에서의 거의 대부분의 위치를 구해줄 수 있게 되었다.
이제 도면에서는 볼 수 없는 레고 안쪽에서 일어나는 일에 대해 이야기해보겠다.
만약 블럭의 아래에서 새로운 블럭이 합체되기를 원한다면, 블럭 안쪽에 결합될 Stud의 간격만큼의 공간이 확보되어 있어야할 것이다. 이때 사용될 기술이 Boolean이다.
우리는 Stud의 중심을 기준으로 얼마나 파여나갈지에 대한 좌표 또한 구해줄 것이다.
그리고 그 좌표를 기준으로 생성된 Box로 블럭의 안쪽을 Boolean해줄 예정이다.
또한 추가적으로 파주어야할 부분이 있는데 바로 Stud의 아래쪽 부분이다.
이 부분을 파주어야 뒷면을 보았을 때 디테일이 살아 레고 같다는 느낌을 받을 수 있다.
이때 이 부분은 Stud의 모양에 맞춰 Tube의 형태로 파여지게 될 것이다.
전체적으로 패여진 부분과 표면을 비교해보면 전반적으로 레고의 두께가 2칸이라는 것을 알 수 있다.
이제 마지막으로 레고끼리 끼워졌을 때 접지력을 높여줄 아래쪽 디테일에 대해서 설명하겠다.
만약에 똑같이 1x2의 레고 2개가 끼워진다면, 안쪽의 양쪽 가장자리와 Stud가 맞물리는 부분에서 고정력이 생기게 될 것이다.
이때 레고끼리의 접지력을 높이기위해서 Stud 사이 부분에 기둥을 하나 생성해줄 예정이다.
만약 1x2 블럭이 아니라, 1x3 블럭이 된다면 늘어난 Stud 갯수에 맞게 기둥이 하나 더 추가 될 것이다.
여기서 블럭끼리 겹쳐지기 위해서 기둥의 길이는 Stud간의 간격과 같아야 될 것이다.
1xN의 블럭에서는 방금과 같은 기둥이 쓰이게 된다. 하지만 NxN의 블럭에서는 아랫쪽의 디테일이 달라지게 될 것이다.
먼저 만들어진 결과를 보면 아까의 기둥과는 그 모양이 다른 것을 볼 수 있다.
1xN의 블럭에서는 하나의 Stud를 기준으로 접지되는 부분이 4군데이지만, NxN의 블럭에서는 3군데로 구성된다.
NxN 블럭의 위쪽에서 Stud가 끼일 곳을 살펴보겠다.
Stud 4개의 중심에 아래쪽 구조물이 있으면 될 것이다.
중심의 위치를 비율로써 확인해보면 각각의 Stud 중심으로부터 좌우로 5만큼씩 떨어져있는 것을 볼 수 있다.
{0,0,0}의 Stud 중심으로부터 아래쪽 구조물의 중심 {5,0,5} 사이의 길이는 5√2이다. Stud의 반지름 길이는 3이기 때문에 5√2에서 3을 빼준다면 아래쪽 구조물의 반지름을 구할 수 있다.
√2는 1.414...의 값이고 여기에 5를 곱해준다면 7.07...의 값이 생성된다. 여기에 3을 빼주게 되면 4.07...이 나온다.
소숫점 아래 값을 제거하고 반지름을 4라고 가정하도록 하겠다.
이렇게 레고 블럭을 만들기 위해 필요한 규칙을 다 얻었다.
4. re) 전체 제작 과정 (1과 유사)
2x4의 블럭을 기준으로 설명하겠다.
일단 가장 먼저 Stud가 어디에 놓일지 위치를 잡아주어야 한다.
이제는 Stud들이 놓일 위치가 10칸 간격으로 놓여있다는 사실을 알고 있다.
여기서 우리는 어떠한 과정을 통해 끝점들을 파악하게 될 것이다.
그 다음 파악된 점들을 바탕으로 레고의 Main_Body가 될 Box의 위치를 잡아줄 것이다. 꼭짓점이 될 point들의 위치는 핵심 point들을 기준으로 5x5의 위치에 있게 된다. 그리고 위 아래 point들의 높이는 4칸이 될 것이다.
이제 Main_Body의 아래쪽을 뚫어줄 point들의 위치가 필요하다.
이 point들 또한 핵심 point들을 기준으로 구해줄 것이다.
앞서 구해준 레고 블럭의 두께가 2칸이고 Main_Body의 꼭짓점이 핵심 point로부터 5x5에 위치한다.
이에 Boolean에 이용될 point들의 위치는 핵심 point로부터 3x3의 위치에 놓이게 될 것이다.
이제 Main_Body 위에 Stud가 올려질 차례이다.
핵심 point들을 Stud의 기준으로 삼아 지름이 6칸, 높이가 2칸인 Stud들을 만들어준다.
Stud가 만들어지면서 아래쪽에 파이게 될 부분은 Boolean으로 해결해주면 된다.
이제 아래쪽 Detail을 묘사해줄 차례이다.
1xN과 NxN의 모양이 다르기 때문에 둘을 따로 구현해줄 예정이다.
이를 node로 If 조건문을 만드는 방식을 통해 해결해줄 것이다.
일단은 NxN에서의 구조물을 만들기 위해서 아래쪽 구조물의 중심이 될 새로운 points를 구해주어야 한다. 이는 핵심 point들을 기준으로 구해주게 될 것이다.
이 point들을 기준으로 구조물을 만들고 Boolean으로 블럭의 아래쪽에 합쳐주게될 것이다.
지금까지의 결과가 Base 과정이 될 것이다.
이제 Simulation에서 빠르게 작동하기위한 Proxy를 만들어줄 수 있을 것이다.
그리고 Base를 기준으로 Bevel을 준 결과와 Subdivide로 면을 늘려준 결과까지 얻게될 것이다.
마지막으로 레고에 대한 Logo도 달아줄 예정이다.
5-1. 모델링
점 하나에서부터 시작하겠다.
Attribute Wrangle을 달아 Detail에 정보를 남기도록 하겠다.
Integer Attributes 정보로써 x,y,z를 만들어 몇 칸의 어떠한 높이의 블럭을 만들지를 정해주도록 하겠다.
x, z 값을 조절해 가로, 세로에서의 Stud 갯수를 정해줄 수 있다.
y값은 0을 넣으면 높이 4칸의 얇은 블럭, 1을 넣으면 높이 12칸의 두꺼운 블럭이 만들어질 것이다.
이러한 정보들이 모두 Detail에 저장된다.
{2,0,4}로 두고 작업을 하겠다.
Sub Network 생성해 그 안에서 모델링 작업을 해주도록 하겠다.
밖에서의 Attribute Wrangle에서의 Detail 값을 받아 그 내용을 바탕으로, 1xN과 NxN의 블럭을 node의 If문으로 선택해줄 예정이다.
Sub Network를 두 개 생성해 하나는 1xN, 다른 하나는 NxN의 내용을 모델링해줄 것이다. 이렇게 둘을 따로 모델링해주는 이유는 블럭 아래쪽 디테일이 다르기 때문이다.
x,z 내용을 바탕으로 Switch에 If문을 적어주려한다. Detail function으로 x값을 불러와 x값이 1이 될때 Input2의 내용이 선택되도록 해주었다. 그리고 1칸 짜리 블럭이 x,z 방향 둘 다 존재할 수 있기 때문에 z값 또한 같은 조건을 주도록 한다.
이제 NxN의 내용으로 들어가 작업해주도록 하겠다.
우리는 Detail에 저장된 2x4 내용을 바탕으로 8개의 점을 만들어주어야 한다. 이를 위해 for 반복문을 사용해주려 한다.
제일 처음 가지고 있는 1개의 point를 for 반복문으로 8번 복제해준다. 그렇게 되면 9개의 points가 존재하게 되는데, 그 이유는 {0,0,0}의 점이 복제에 의해서 중복되기 때문이다. 이때 원본이었던 0번 point를 지워줌으로써 8개의 points를 얻어줄 것이다.
Attribute Wrangle(Points)에서 Integer값 i=0이 total point보다 작을 때 계속하여 증가하는 for 반복문을 적어준다.
이때 반복문에서 구체적으로 어떤 수행이 발생되어야 하는지를 알아보도록 하겠다.
예시로 4x3의 블럭으로 설명해보겠다.
첫 점은 원점에 생길 것이다. 그리고 Block의 규격에 맞게 10칸의 간격으로 point가 놓이게 될 것이다.
a=4, b=3으로 tp=a*b=12가 될 것이다. 이에 i=0,1,2...10,11까지의 결과를 가질 것이다.
이때 i 값을 a로 나눔으로써 얻은 몫과 나머지로 i의 순서에 따라 배열된 point들의 위치를 특정지을 수 있다.
몫의 값이 z를 기준으로 몇 번째 층에 놓일지가 될 것이다. 이를 floorcount라 하겠다.
나머지 값이 x를 기준으로 몇 번째 칸이 있는지가 될 것이다. 이를 ordercount라 하겠다.
i/a = floorcount ··· ordercount라 할 수 있다.
이제 이 식을 vex code로 표현해보겠다. int floorcount = floor(i/a); int ordercount = i%a;로 각각 표현될 수 있다.
이렇게 (0,0) ~ (2,3)까지의 i에 따른 point의 위치를 구할 수 있었다.
이제 우리가 구한 위치를 좌표계에 맞게 써보도록 하겠다.
{0,0,0}, {10,0,0}, {20,0,0} ... {20,0,20}, {30,0,20}으로 쓰이게 될 것이다.
이렇게 만들어질 위치 정보를 vector new = set(newx,newy,newz)로 두겠다. 이때 newx = ordercount * 10이 되고 newy = 0 그리고 newz = floorcount * 10이 될 것이다.
이렇게 만들어진 new 정보를 addpoint로 점으로써 추가해준다면 비로소 핵심 point를 만들어낼 수 있다.
이 핵심 point들은 Detail에 저장된 x,y,z에 맞춰 그 갯수가 조절될 것이다.
다음은 추후 작업에서 도움이 될 floorcount와 ordercount의 정보를 Attributes로 남겨두려한다.
만약 이를 위해서 f@floorcount로 Attributes 정보를 남겨둔다면, 원하는대로 정보가 남겨지지 않을 것이다.
이때 새롭게 setpointattrib fucntion을 사용해주겠다.
예시로 setpointattrib(0,"floorcount", newpoint, floorcount,"set")을 설명하자면, "첫번째 Input에 대해 작업을 수행하려 하는데 앞서 이용했던 floorcount의 변수가 floorcount라는 Attributes로 새롭게 생성될 newpoint라는 점에 저장되게 될 것이다"라고 할 수 있다.
setpointattrib로 정보를 남겼다면, 마지막에 removepoint로 중복되는 0번 점을 하나 제거해준다.
이제 우리가 필요한 모든 points가 준비되었다.
Info의 Detail의 내용을 바탕으로 아래쪽 기둥에 필요한 point들도 미리 구해주도록 하겠다.
3x5의 블럭을 예시로 든다면, (3-1)*(5-1)로 총 8개의 points가 필요해질 것이다.
이때 해당 point들을 구해주기 위해서 핵심 points 전체를 사용하는 것이 아닌, 0번 점으로부터 2x4 범위의 8개의 points만을 사용해주도록 하겠다.
여기서부터 방법은 간단하다. 이 8개의 point들의 위치를 {5,0,5} 이동시켜 기둥의 point들을 구해주게될 것이다.
a와 b에서 -1을 해주어 total points를 기둥에 필요한 points의 갯수로 맞춰준다. 그 다음 vector new에 {5,0,5}를 더해준다면 under_points를 얻게 된다.
이번에는 핵심 points 중 어떤 점이 꼭짓점에 있는 점인지 특정해주려 한다. 그래야 해당 점을 기준으로 Box의 꼭짓점이 될 점들을 구해줄 수 있기 때문이다. 이를 위해서 앞서 저장해둔 floorcount와 ordercount의 정보를 이용해주겠다.
주어진 많은 점 중에서 (0,0) 위치의 점이 꼭짓점 중 하나라고 분류하기 위해서 조건문을 쓸 것이고, 조건이 참이라면 ㅔㅐPointGroup A에 속한다고 해주겠다.
이때의 조건의 내용을 "만약 floorcount와 ordercount가 0이라면 groupA다"라고 해주겠다.
그런데 그 다음의 점들은 블럭의 규격이 바뀜에 따라 꼭짓점 위치가 바뀌기 때문에 좀 전처럼 위치를 숫자로 특정짓기 어렵다. 이에 Detail에 저장된 x,z 값을 이용해주도록 하겠다.
예를 들면, (0,2) 위치의 점의 조건이 "floorcount==0 && ordercount==(a-1)"가 되는 것이다.
네 점의 Group들을 A,B,C,D로 지어주고 이들을 시각적으로 구별하기 위해서 서로 다른 색을 주도록 한다.
이때 Group을 지정하기 위해서 새롭게 setpointgroup function이 사용된다.
setpointgroup(0,"A",@ptnum,0 or 1,"set")로 쓰였을 때, 다른 부분은 setpointAttrib와 비슷하지만 빨강색으로 표시해둔 부분에 0을 넣게되면 group으로 지정하지 않겠다로 인식되고 1을 넣게되면 group으로 지정하겠다고 인식된다.
Node Info를 보면 A라는 PointGroup이 생성된 것을 볼 수 있다.
이제 방금 구해준 꼭짓점으로 Box를 만들 때 필요한 점들을 새로 구해주겠다.
Blast로 A,B,C,D의 점을 모두 떼어내준다.
각각 Attribute Wrangle을 달아 5x5씩 이동시켜 Box의 꼭짓점이 될 위치로 이동시킨다.
이렇게 이동시킨 4개의 점을 Merge 해준 뒤, Box로의 꼭짓점 역할을 하게 하기위해서 y축으로 이동시킨 점을 생성켜줄 예정이다.
이때 if문을 이용해 "만약 Detail에서의 y값이 0인 경우에 모든 점들을 y축으로 -4 만큼 이동시키겠다. 그러나 만약 y값이 1인 경우에 모든 점들을 y축으로 -12 만큼 이동시키겠다."라고 선언해준다.
이렇게 Detail의 y값이 0이냐 1이냐에 따라 레고 블럭의 높이를 조절할 수 있게 되었다.
이제 앞의 Merge되어 있던 4개의 points와 y값이 변경된 points 4개를 Merge 해준다. Box의 꼭짓점이 될 8개의 점이 완성되었다.
Attribute Copy를 이용해 8개의 점을 Reference로 Box(Polygon)의 크기와 위치를 변경시켜주었다.
만약 이때 Box가 꼬인 모양으로 생성된다면, Merge에서의 points 순서를 Box와 알맞게 맞춰주도록 한다.
이렇게 레고 블럭의 Body가 될 Box가 완성되었다.
그 다음으로는 Box의 아래쪽을 뚫어주기 위한 Box를 만들어보겠다.
Body를 만들기위해 만든 시스템을 복사해준다.
핵심 points를 기준으로 5x5씩 이동시킨 Body의 꼭짓점과는 다르게 Boolean에 이용될 Box의 꼭짓점은 3x3씩 이동되어질 것이다. 그 이유는 Box의 두께가 2칸이 되어야하기 때문이다.
Blast 아래의 Attribute Wrangle을 수정해 x,z축을 해결해주고 나면 y축을 수정해줄 차례이다.
Merge 아래에서 Attribute Wrangle로 모든 points를 {0,-2,0}만큼 떨어뜨려주겠다.
앞에서 만든 Body와 Body_Boolean을 순서대로 Boolean node에 연결해주면 두께가 2칸으로 아래가 뚫린 블럭이 완성된다.
이번엔 핵심 points를 기준으로 Stud를 만들어보겠다.
핵심 points의 위치에 Copy to Points로 Tube(End Caps)를 붙여주겠다.
이제 나머지 작업은 Tube의 파라미터에서 해주도록 하겠다.
일단은 Stud의 높이와 지름을 2칸, 6칸으로 지정해준다.
이때 높이를 2칸으로 지정해주면서 Stud 높이의 1칸이 Box 안쪽으로 들어가게 되었다. Height를 Copy Parameter하여 Center.y 값에 넣어준 뒤 절반으로 나누어주면 된다.
Stud가 원했던대로 잘 위치해있는 것을 볼 수 있다.
Object Merge로 끌어와 Boolean으로 Box에 Union 해준다.
이제 Stud를 만들어주면서 생긴 Stud 아래의 구멍을 묘사해주려 한다. 똑같이 핵심 points의 위치에서 시작한다.
핵심 points의 위치에 Copy to Points로 Tube(End Caps)를 붙여준다.
지름을 2, 높이를 2로 설정해준다. Stud 아래에 위치해 있기 때문에 Center.y 값에는 - Height/2 값을 넣어준다.
Object Merge로 끌어와 Boolean으로 Box에 Subtract(A-B) 해준다.
Lego 안쪽을 보면 방금 만든 구멍이 안쪽으로 뚫려 들어가 있는 것을 확인할 수 있다.
다음은 아래쪽 기둥을 만들어줄 차례이다. 이 또한 핵심 points의 위치에 Copy to Points로 Tube(End Caps)를 붙여준다.
기둥의 지름은 앞서 정해둔 규칙에서처럼 8로 두겠다.
기둥의 높이는 if문을 이용해 "Detail y=0일 때 (4-2)=2, y=1일 때 (12-2)=10"인 정보를 만들어두고 Detail function으로 불러와 사용할 것이다.
Center.y 값에는 - Height/2 값을 넣어준다.
그 다음 Copy to Points 아래에 Attribute Wrangle을 달아 모든 점에 대해서 Box의 두께인 2만큼 y축으로 내려준다. 이때 좀 더 자연스러운 느낌을 원한다면 -1.5 정도의 값을 주어도 된다.
기둥의 중심을 파주기위해서 Tube를 복사해 Radius 값을 6으로 낮춰준 뒤 Boolean(Subtract) 해준다.
Object Merge로 끌어와 Boolean으로 Box에 Union 해준다면 NxN의 레고 블럭 모델링이 완성된다.
이제 1xN 모델링을 손봐줄 차례이다. NxN에서의 전체 내용을 복사해 그 규칙을 조금 수정해주도록 하겠다.
먼저 if문을 이용해 Nx1의 모양 또한 1xN의 규칙으로 통일시켜주겠다.
이렇게 1xN에서 핵심 points를 만들어내는 규칙이 변경됨에 따라 꼭짓점을 그룹화시키는 규칙 또한 변경해주어야 한다.
새롭게 Blast와 Sort(Reverse)만을 이용해 해당 시스템을 만들어내준다.
그 다음 해당 Points를 기준으로 5x5만큼 이동시켜 Body에 필요한 point들을 새롭게 얻어낸다.
Attribute Copy를 Display해보면 Box가 원하던대로 잘 생성된 것을 볼 수 있다.
Boolean의 경우도 방금의 시스템을 가져와 사용하겠다.
이때 Box의 points들을 5x5가 아닌 3x3으로 구해준다.
Boolean의 결과를 보면 원하는 느낌대로 Box가 깎여나간 것을 볼 수 있다.
Stud의 경우는 바꿀게 없다.
드디어 아래쪽 기둥 디테일을 바꿔줄 차례가 왔다.
먼저 처음에 이용될 points가 핵심 points가 되었으면 한다.
핵심 points 중에서 마지막 점을 지우고 {0,0,5} 만큼씩 이동시켜 기둥의 중심이 될 points를 구해주겠다.
이제 해당 points에 앞서 만들어둔 Tube, Copy to Points 시스템을 연결해준다. 이때 기둥에 구멍을 뚫어줄 필요가 없기 때문에 Boolean과 Input2에 연결된 Tube를 지워주도록 한다.
마지막으로 우리가 규칙에서 정해두었던 지름 4를 Radius에 입력해준 뒤, Boolean으로 Box에 연결해주면 된다.
이렇게 레고 블럭의 모델링이 완료되었다.
5-2. 레고 스타일 바꾸기
이제 기본 레고의 모양을 바탕으로 여러가지 버전의 레고를 만들어보겠다.
Proxy, Base, Bevel, Subdivdie, Logo 순으로 Base를 제외한 4가지 스타일을 만들어볼 예정이다.
새롭게 Sub Network를 만들어 그 안에서 작업하도록 하겠다.
먼저 Clean으로 Modeling에서 이용한 모든 Attributes 정보를 제거해주겠다.
첫 번째 Proxy는 간단하게 Convex Hull을 달아 완성시켜준다.
그 다음 Bevel을 줄 차례이다.
먼저 Group(Edges)의 Include by Edges를 이용하여 그 각이 40도를 넘는 부분만 Group으로 지정하겠다.
그 다음 해당 Group에만 Polybevel을 주어 블럭을 부드럽게 만들어준다.
이제 Subdivide를 해줄 차례이다.
그냥 그대로 Subdivide를 해주게 되면, 원하는 모양이 나오지 않는다.
이에 새롭게 Remesh를 하여 작업하도록 하겠다.
Remesh의 Hard Edge Group에 미리 준비해둔 Edges Group을 입력해준다면 해당 Edges를 기준으로 형태를 유지하면서 Remesh가 들어가게 된다.
그 다음은 Bevel에서 해주었던 작업을 똑같이 해준 다음 Subdivide를 해주면, 더 많은 부드러운 면이 생성된다.
마지막으로 Stud 위에 Lego라고 적힌 로고를 입력해주겠다.
Stud의 윗부분 면만을 떼어내기 위해서 Primitives의 VertexCount 정보를 이용해보겠다. VertexCount를 이용하면 한 면이 가진 꼭짓점의 갯수를 알 수 있다.
우리는 이를 이용해 12개의 꼭짓점을 가진 Stud의 윗면만을 떼어내줄 것이다.
Attribute Wrangle(Primitives)에서 primintrinsic function을 이용해 VertexCount의 정보를 불러온다.
그리고 불러온 VertexCount의 정보를 이용해 Group Expression node에서 12개의 꼭짓점을 가진 면만을 Group화 시켜준다.
그런데 결과를 보면, Stud의 윗면만 떼어내어 진 것이 아니라 Stud의 아랫면과 Stud 아래의 구멍에서의 면까지 Group에 포함된 것을 볼 수 있다.
이때 Stud의 윗면을 제외하고는 전부 y값이 0보다 아래에 있기 때문에 Group Expression에서 "@P.y>0"의 내용을 추가해주겠다.
원하던대로 Stud의 윗면만이 떼어내진 것을 볼 수 있다.
그 다음은 로고가 붙을 점을 얻어내기 위해서 Stud의 윗면에서의 중심 점을 찾아주려 한다.
각각의 면을 기준으로 중심을 찾아내야하기 때문에 For-each Primitive를 써주겠다.
반복 node 안에서 Bound를 달아 Sphere Type으로 Bouding Box를 만든 다음 Accurate Bounds로 정중앙으로 이동시켜준다.
그 다음 Add node로 Sphere에서 면을 지우고 점만을 남기면, 우리가 원하던 중심점을 찾을 수 있다.
이제 로고를 생성해 중심점에 붙여주는 작업을 해주겠다.
Font node를 생성해 텍스트를 입력하고 파라미터를 조절해 원하는 느낌을 찾아준다.
그 다음 Font에 PolyExtrude를 달아 두께를 살려주겠다. 이때 Output Back을 체크하여 뒷 면을 채워준다.
Copy to Points로 로고를 중심점에 붙여준다음 Bevel이나 Subdivide의 결과에 Boolean(Union) 해준다.
로고 스타일의 레고 또한 완성되었다.
5-3. Multi 레고
이제 Detail의 정보가 들어있는 부분을 수정하여 정해준 범위 내에서 가능한 나올 수 있는 모든 경우의 수의 레고가 동시에 발생하도록 해보겠다.
먼저 4개의 points를 생성해 각각 Detail x,y,z 내용을 만들어준다.
네 개의 points에 대해 한번에 여러 작업을 해주기 위해서 For-each Point를 쓰도록 하겠다.
우리는 Lego_Build가 반복 node안에 들어갔을 때 각각의 Pass마다 Merge에서의 Detail 내용이 차례내로 나왔으면 한다.
하지만 결과를 보면 Merge의 첫번째 순서로 연결된 Detail 값만이 계속 출력될 뿐이다.
이렇게 값이 잘 적용되지 않는 이유는 각각의 point로 제공되는 Detail 값이 올바르게 반영되지 않았기 때문이다.
Lego_Build를 떼고 각각의 point가 대변하는 값이 어떻게 되는지 한번 보겠다.
Single Pass로 보았을 때 첫번째로 들어온 점에서의 Detail 값이 이용되면서, 다른 점들의 z에 대한 값이 이용되지 않은 것을 알 수 있다.
이에 전략을 바꿔주겠다.
먼저 x,y,z에 대한 정보를 Detail이 아닌 Points로써 저장해준다.
그 다음 반복 node 내에서 Attribute Promote로 Points 정보를 Detail에 넘겨주겠다. 이때 Original Name에 넘기고 싶은 정보인 x y z를 써주도록 한다.
이제 Single Pass를 하나하나 변경해가면서 확인해보면 정보가 잘 들어가 있는 것을 볼 수 있다.
Lego_Build를 다시 연결해주고, Pack해주겠다.
Single Pass를 꺼주고 결과를 보면 총 4개의 레고 블럭이 한번에 잘 들어와 있는 것을 볼 수 있다.
이때 레고 블럭이 한번에 생기면서 겹쳐있게된 부분을 수정해주려한다.
각각의 회차마다 다른 간격으로 블럭이 옮겨지게 하기위해서 Metadata의 Iteration 값을 쓰도록 하겠다.
Pack 아래에 Attribute Wrangle을 달아 Iteration 값에 의해 회차가 진행됨에 따라 y축 아래로 더욱 떨어지도록 해주었다.
간격이 좁다면 y값에 float 값을 곱해주어 조절해줄 수 있다.
이제 For-each에 들어가기 전에 points를 일일이 생성해 x,z 값을 주는 것이 아니라 1x1부터 NxN까지 한번에 만들어줄 수 있는 시스템을 만들어보려 한다.
Rows와 Columns가 5x5인 Grid를 생성해준다. 이 Grid의 모든 points에 대해 적당한 x,y,z 값을 제공해준다면 원하는 레고 블럭을 만들 수 있을 것이다.
point number를 기준으로 x,z 값에 해당하는 위치정보를 나열한다면, 그만큼의 모든 레고를 만들 수 있는 조건이 준비가 된다.
이때 위치정보를 구하는 방식은 모델링에서 이용한 적 있었던 몫과 나머지를 이용한 방식을 쓰겠다.
Attribute Wrangle을 생성해 Input1에는 Grid를, Input2에는 Parameter가 준비된 Null을 달아준다.
Null에서의 x와 z 파라미터를 기준으로 Grid의 Rows와 Columns를 정해주도록 하겠다.
앞으로 만들어질 블럭은 x 값이 0이 될 필요가 없다. 이에 정의내려준 x값 뒤에 1을 더해주어 최솟값이 1이 되게 해주겠다.
z값 또한 똑같이 1을 더해 0이 되지 않도록 해준다.
그 다음 아래에 Attribute Wrangle을 두 개 달아주어 하나는 y=0이 되어 얇은 블럭을 생성하고, 다른 하나는 y=1이 되어 두꺼운 블럭을 생성하도록 해준다.
만약에 얇은 것이나 두꺼운 것 중 하나만 보고 싶은 것이 아니라 둘 다 동시에 보고 싶다면 Merge로 둘을 합쳐 For-each에 연결해주도록 한다.
6. Colors
Coolors - The super fast color palettes generator!
Generate or browse beautiful color combinations for your designs.
coolors.co
이제 우리는 위의 사이트에서 여러 색들을 가져와 해당 범위 안에서 랜덤하게 레고 블럭에 색이 들어가도록 해주겠다.
서로 다른 위치, 색의 points를 생성해 Merge한 뒤 Attribute Copy로 색을 블럭에 옮겨주겠다.
아무것도 건드리지 않으면 Merge의 첫번째 순서로 들어간 색의 값이 블럭으로 옮겨지게 된다.
이때 Sort를 이용해 색이 Random하게 선택되도록 해주겠다.
다만 이대로는 색이 Random하게 골라져도 블럭 전체에 한 색만이 적용된다.
Metadata의 Iteration 값을 Sort의 Seed 값에 넣어줌으로써 모든 블럭에 각각 다른 seed가 적용될 수 있도록 해주겠다.
결과를 보면 블럭이 전부 랜덤한 색을 가지고 있는 것을 볼 수 있다.
이제 사이트에서 긁어온 색상을 이용해주려한다.
그런데 Add에서의 Color에 바로 적용하는 것이 아니라 Attribute Wrangle(Detail)에서 따로 작업해줄 필요가 있다.
그 이유는 긁어올 RGB 값이 0~256 사이의 값이기 때문에 @Cd 값으로써 이용하려면 0~1 사이의 값으로 만들주어야 하기 때문이다.
일단은 {0,0,0}의 점을 a01이라는 integer 정보로 저장해준다.
그 다음 vector c01이라는 chv로 조절 가능한 파라미터를 만들어준다. 해당 파라미터가 fit function에 의해 0~256 사이의 정보를 0~1 사이의 정보로 변환할 수 있도록 해준다.
마지막으로 setpointattrib를 이용해 a01이라는 점에 c01의 색을 Cd값으로 저장해주겠다.
x축으로 10씩 떨어진 간격으로 10개의 점을 생성하고, 똑같은 과정을 10번 반복해주겠다.
결과적으로 10개의 컬러 팔레트가 완성되었다.
완성된 팔레트에 사이트에서 긁어온 색의 RGB 정보를 기입해준다면 랜덤하게 예쁜 색이 입혀진 레고 블럭을 볼 수 있다.
'TWA Houdini1 > Rigidbody' 카테고리의 다른 글
TWA 후디니 1 RIGIDBODY_11 : Constraint 기본 개념 (0) | 2023.04.06 |
---|---|
TWA 후디니 1 RIGIDBODY_09 : 총알+레고+플랭크 소싱으로서 시뮬레이션하기 (0) | 2023.03.31 |
TWA 후디니 1 RIGIDBODY_07 : Custom SOURCING + Solver 복습 (0) | 2023.03.27 |
TWA 후디니 1 RIGIDBODY_06 : Simulation 데이터 부르기 + 총알 모델 (0) | 2023.03.25 |
TWA 후디니 1 RIGIDBODY_05 : 기본훈련 Domino Simulation (0) | 2023.03.25 |