안녕하세요.
애니메이터가 들려주는 맥스 스크립트의 스크립팅하는 애님입니다.
오늘은 자식 노드의 선택하는 방법에 대해서 알아보겠습니다.
맥스의 스크립트에서는 부모 노드를 찾는 스크립트는 <node>.parent를 사용합니다.
그리고 자식을 찾는 스크립트는 <node>.children을 사용하면 가능합니다.
간단하네요.
하지만 자식의 자식은 어떨까요?
혹은 자식의 자식의 자식은 찾을 방법이 있을까요?
아쉽게도 맥스 스크립트에서 하나의 노드를 선택하여 최하위 자식까지 선택하는 방법은 없습니다.
물론 맥스에서 부모 노드를 더블클릭하면 자식 노드까지 다 선택이 되지만, 만약 2개 이상의 부모 노드의 트리를 타야 하는 경우 스크립트의 도움이 없다면 일일이 추가 선택으로 해결해야 합니다.
그럼 어떻게 스크립트로 가능한지 천천히 알아봅시다.
우선 노드를 선택했을 때 자식 노드를 찾는 방법에 대해 확인하겠습니다.
먼저 바이패드를 만들어 두겠습니다.
그리고 노드를 하나 선택하면 그 자식을 알려주는 스크립트를 만들겠습니다.
1
2
3
|
selObj = $
$.children
|
cs |
목을 선택하고 다음 스크립트를 실행해 봅시다.
목의 자식인 $Bip001 L Clavicle, $Bip001 R Clavicle, $Bip001 Head 3개의 노드가 나옵니다.
그 다음에는 자식의 자식이 나와야겠죠?
그렇다면 아까 나온 자식을 배열 형태로 저장하고 for문을 사용하여 자식의 자식을 찾을 수가 있습니다.
(계속 자식 자식 하는 게 이상하네요. ㅎㅎㅎ)
처음 선택한 노드를 레벨1이라고 하고 레벨1의 자식을 레벨2로 하고 그 자식을 레벨3... 이런 순으로 명명하겠습니다.
레벨3의 자식을 찾아보도록 스크립트를 추가해 봅시다.
1
2
3
4
5
6
7
8
9
|
selObj = $
nextChild = #()
child = $.children
for i = 1 to child.count do
(
append nextChild child[i].children
)
|
cs |
실행을 해보시면
이렇게 레벨2의 자식인 레벨3의 노드가 나옵니다.
스크립트의 내용은 별다른 것이 없습니다.
선택한 노드의 자식을 찾고 그것을 배열형 child변수에 저장한 다음 그 child의 값을 돌며 다음 자식을 찾아 nextChild에 저장합니다.
그런데 일반 노드를 배열로 저장하는 것이 아닌 children형의 배열로 저장이 됩니다.
그 부분을 먼저 해결해 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
selObj = $
childNode = #()
nextChild = #()
child = selObj.children
if(child.count != 0) do
(
for i = 1 to child.count do
(
append childNode child[i]
)
for i = 1 to childNode.count do
(
for j = 1 to childNode[i].children.count do
(
append nextChild childNode[i].children[j]
)
)
)
|
cs |
7번 라인의 if문은 선택한 노드의 자식이 있어야 실행을 하도록 합니다.
9번 라인과 16번 라인의 for문은 <node>.children을 사용하여 나온 children형 데이터에서 필요한 노드만 뽑아 오도록 합니다.
여기까지가 레밸1을 선택하고 레밸2와 레밸3을 확인하는 내용입니다.
지금까지의 내용을 확인하면 중복되는 내용이 보입니다.
<node>.children인데요.
중복(반복)되는 것들은 반복문이나 사용자 정의 함수로 정리를 할 수 있습니다.
하지만 자식 노드의 끝은 몇 번째 레밸인지 알 수가 없기 때문에 일반적인 반복문인 for문을 사용할 수 없습니다.
이전에 '맥스 스크립트 기초' 게시판의 반복문(while)에서 끝을 알 수 없는 반복은 while로 한다고 이야기했습니다.
오늘은 여기에 이야기를 마치고 다음 시간에 while문으로 정리를 하고 나머지를 진행하겠습니다.
'맥스스크립트 심화' 카테고리의 다른 글
Selection Filter확장 (0) | 2019.09.19 |
---|---|
자식노드 선택(4) (2) | 2019.09.18 |
자식노드 선택(3) (0) | 2019.09.17 |
자식노드 선택(2) (0) | 2019.09.16 |
오브젝트의 선택(3) (0) | 2019.09.14 |
오브젝트의 선택(2) (0) | 2019.09.13 |
오브젝트의 선택(1) (0) | 2019.09.12 |
오브젝트의 머지(7) (0) | 2019.09.11 |