목차
- For-Each Point
- For-Each Primitive
- For-Loop with Feedback
- Block Begin / End
- For-Each Named Primitive
- For-Each Connected Piece
모든 랭글러를 위하여!
- For-each 안에서 반복수행이 일어나는데, 이때 반복수행에 필요한 이니셜 한 정보는 block 밖에서 미리 정의한 정보이다.
- 오늘의 목표는 "입문자 선에서 block에 대해 이정도면 괜찮게, 혹은 단단히 알고 있다" 정도 되도록 개념을 잡아보자.
- for-each 자체는 어려운 개념은 아닌지라 방심하기 쉽다. 처음 개념을 잘못 잡으면 반복에 대해서는 알겠는데, 파라미터는 뭐 어쩌라는 거지? 하게 된다.
만약 box를 하나 만들어주고, y축으로 1만큼, 그리고 y축 방향으로 30도만큼 회전을 해주면 어떤 결과가 나올까?
그럼 모든 각각의 포인트에 대해 y축으로 1만큼 이동하고, y축 방향으로 30도만큼 회전해주면?
그럼 모든 각각의 프리미티브에 대해 y축으로 1만큼 이동하고, y축 방향으로 30도만큼 회전해 주면?
처음 transform 노드를 달았을 때와 별 차이가 없다. 하지만, 엄연히 다른 결과물이다. (Geometry Spreadsheet를 확인해 봐도 포인트 개수가 다르다)
For-Each Point Node
위 사진은 For-Each Point Node를 불러왔을 때의 세팅과 같다.(각각의 포인트들을 다 떼어놓는다)
(맨 아랫단의 merge node는 gather method의 merge each iteration 역할)
각각의 포인트들을 다 떼어놓고, 그 포인트에 대해 작업을 수행한다.
노드가 늘어선 모양을 보면 알 수 있지만, 병렬 수행이다.
For-Each Primitive Node
위 사진은 For-Each Primitive Node를 불러왔을 때의 셋팅과 같다.(각각의 프리미티브들을 다 떼어놓는다)
(맨 아랫단의 merge node는 gather method의 merge each iteration 역할)
각각의 프리미티브들을 다 떼어놓고, 그 프리미티브에 대해 작업을 수행한다.
노드가 늘어선 모양을 보면 알 수 있지만, 병렬 수행이다.
For-Loop with Feedback Node
feedback - 직렬 수행으로 진행이 되는 경우, input에 대하여 적용된 결과를 바탕으로 다시 수행이 반복되는 것.
Iteration(반복 횟수) - 블록 안의 수행을 n번 반복해달라는 의미이다.
- 현재 Iteration의 수치가 10이므로, 블럭 안의 transform 작업을 10번 반복하게 된다.
Gather Method
- Merge Each Iteration
- 각각의 회차별로 발생한 결과가 다 합쳐져서 표현됨
- Feedback Each Iteration
- 마지막 수행의 결과만 표현됨
- 지금까지 정리 -
블록이 있고, 그 안에 A라는 수행이 있다고 할 때,
Iteration 수치만큼 A라는 수행을 직렬로 수행해 주는 방법이 있다.(For-Loop with Feedback)
Input에 대해 Iteration 수치만큼 A 수행을 반복한다 했을 때, 적용된 A의 결과를 바탕으로 다시 A를 수행하는 것을 feedback이라고 한다.
블록이 있고, 그 안에 B라는 수행이 있다고 할 때,
각각의 포인트나 프리미티브 조각들에 대해 Input을 쪼개고, B라는 수행을 각각 진행하고, 한 번에 merge 해서 결과를 얻을 수 있다.(For-Each Point, For-Each Primitive)
병렬수행하는 각각의 회차가 Iteration이다. (포인트 숫자, 프리미티브 조각 숫자)
Begin End의 Gather Method - 블록에서의 수행결과를 어떻게 가져갈지에 대한 것.
Block Begin / End Node
Block은 무언가를 반복수행하기 위해 사용하는 것이다. - 시작과 끝이 필요하다.
※ 반복수행을 위해 고려되어야 하는 것.
- Input이 무엇인지 (Block Begin 이전에 완료될 내용)
- 어떤 수행을 요청할지 (Block Begin과 Block End 사이에 오게 될 내용)
- 무엇에 대해 해 줄 것인지 (Block Begin Node의 Method)
- 몇 번이나 반복할 것인지 (Block End Node의 Iteration Method)
- 어떤 방식으로 결과를 뽑아낼 것인지 (Block End Node의 Gather Method)
이상의 다섯 가지에 대해 우리는 능동적으로 선택해 줄 수 있다.
3, 4, 5에 대해 주목할 필요가 있다.
Block Begin Node
Method - 가장 먼저 설정해줘야 할 부분
- 무엇에 대해 반복수행을 할 것인가.
- 원본에 대해 반복수행할 수 있고, 각각의 포인트 혹은 조각들에 대해 반복수행을 할 수도 있다.
- ex) input으로 box가 들어오고, 원본에 대해 반복수행을 한다면, box 그 자체에 대해 반복수행을 진행할 것이다.
- Fetch Feedback : Input의 원본을 가지고 반복수행을 하겠다.
- Fetch Piece or Point : 포인트 혹은 조각 각각을 가지고 반복수행을 하겠다.
Block End Node
Iteration Method
- Auto Detect from Inputs : 인풋으로부터 알아서 감지하겠다.
- ex) Block Begin 노드에서 Method가 Fetch Feedback인 경우, 원본을 사용하는 것이기에, Auto Detect from Inputs는 당연하게도 By Count(횟수)로 적용할 것이고, Method가 Fetch Piece or Point인 경우, By Pieces or Points를 사용할 것이다.
- By Pieces or Points : 조각이나 포인트의 개수만큼 반복
- By Count : 우리가 직접 반복 횟수를 입력
만약 Fetch Feedback(원본사용)인 상태에서 Iteration method를 By Pieces or Points로 한다면? 실행은 될 것이다.
- 원본이 가지고 있는 조각 혹은 포인트의 갯수만큼 반복수행한다.
Fetch Piece or Point(조각, 포인트 사용)인 상태에서 Iteration method가 By Count로 설정된다면, 에러를 발생한다. (논리적으로 말이 안 된다.)
Gather Method
- Fetch Piece or Point에 대해 작업을 하고, Gather Method가 Feedback Each Iteration으로 설정되어 있다면, 가장 마지막 수행의 결과가 도출된다.(반복의 횟수는 의미가 없다.)
ex)
y축 방향으로 0.2만큼, 회전은 10도
원본에 대해(Fetch Feedback)
트렌스폼을 10번 반복(Iteration - By Count)
10번 반복한 마지막 수행만 보고 싶다.(Gather Method - Feedback Each Iteration)
Block Begin Node에는 Block End Node에 대한 정보를, Block End Node에는 Block Begin Node에 대한 정보를 입력해줘야 한다.
Default Block Path - Block Begin이 누구인지 설정해줘야 한다.
현재는 원본에 대해 작업하는 것인지라, Piece Block Path는 설정하지 않아도 된다.
For-Each Point / For-Each Primitive의 차이가 무엇인가?
결정적인 차이는 Piece Elements를 Points / Primitives 중 어느 것으로 할지가 다르다.
Single Path - 굉장히 유용하다.
번호에 해당하는 단계의 하나의 결과를 확인할 수 있다.
ex)
스피어 하나를 생성(polygon)
우리가 가진 모든 프리미티브에 대해
Extrude를 적용하고 싶다.
For-Each Named Primitive Node
- For-Each Primitive와 무엇이 얼마나 다른가?
- For-Each Primitive와 다른 점은 Piece Attribute가 활성화되어 있고, name이 들어가 있는 것이다.
- piece를 구분하는 기준이 attribute로 있느냐 / 없느냐
- For-Each Primitive와 다른 점은 Piece Attribute가 활성화되어 있고, name이 들어가 있는 것이다.
만약 우리의 원본이 어떠한 어트리뷰트로 분류되어 있다면, 우리는 그 분류에 맞게 조각으로 사용할 수 있다.
※ Group은 0과 1로 표현되는 Integer Attribute와 같다.
i@group_그룹이름
if(i@group_A == 1){
s@A = "A";
} // A라는 이름의 그룹에 대해 스트링 어트리뷰트 A에 문자열 A를 할당한다.
else if(i@group_B == 1){
s@A = "B";
} // B라는 이름의 그룹에 대해 스트링 어트리뷰트 A에 문자열 B를 할당한다.
else if(i@group_C == 1){
s@A = "C";
} // C라는 이름의 그룹에 대해 스트링 어트리뷰트 A에 문자열 C를 할당한다.
※ named primitive로 선택되는 순서는 내림차순, 가장 작은 순서부터이다.
- ex) string attribute라면 A > B > C 이런 순서이고, integer attribute라면 0 > 1 > 2 순서이다.
For-Each Connected Piece Node
- 블록의 형태가 For-Each Named Primitive와 정확하게 동일하다.
- Piece Attribute의 이름만 바뀌었다.(이것도 우리 입맛에 맞게 바꿀 수 있는 부분이다)
- Connectivity는 무슨 역할인가?
- 연결되어 있는 것들끼리 분류되어 하나의 Attribute로 저장된다.
- Connectivity Type - Point / Primitive를 선택할 수 있다.
- Attribute - 생성하려는 Attribute 이름
- Attribute Type - Integer / String을 선택할 수 있다.
For-Each는 사실 항상 헷갈리던 개념이었다. 다른 튜토리얼을 보면서도 아 이렇게 쓰나 보다 하면서 약간 감각적으로? 익혀보는 그런 느낌이었지만, 뒤돌아서면 잊어버리고, 이건 또 뭐 어떻게 적용을 하는 것인가 하면서 끙끙거리다가 제대로 못쓰는 그런 노드였다.
하지만 오늘 수업을 들으면서 아주 명확하게 머리에 꽂히는 기분이 들었다. 템플릿으로 제공하는 For-Each 노드가 아닌, Block Begin / Block End 노드를 사용해 보면서 그것은 확실한 사실로 다가왔다. 템플릿 없어도 된다. 나도 이제 Block 노드로 For-Each 구현할 수 있다.
'Houdini > Houdini1_Starter' 카테고리의 다른 글
STARTER09_고난주간 1일차 (0) | 2023.01.19 |
---|---|
STARTER08_Solver (1) | 2023.01.18 |
STARTER06_ INITIAL VALUES(FOR EACH 노드 들어가기 전에) (0) | 2023.01.13 |
STARTER05_Attribute 관련 Node (0) | 2023.01.12 |
STARTER04_Let's render (0) | 2023.01.11 |