Max Script 를 이용하여 무엇인가를 하려면 필수 요소라고 할 수 있는 것 중의 하나가 개체를 선택하거나 지정하는 방법입니다. 여기서 개체는 3D Scene 안의 오브젝트, 스플라인, 헬퍼 등과 같은 사용자가 직접 선택할 수 있는 개체를 말합니다. 물론 오늘 강좌에서의 선택은 마우스를 클릭하여 선택하는 select의 개념만을 말하는 것은 아닙니다.
예를 들어 A 라는 모델링 개체의 스케일을 2배로 변경한다고 했을 때 일반적인 사용자의 입장에서는 마우스로 해당 모델링을 클릭하거나 레이어 리스트에서 선택하거나 개체 리스트에서 해당 모델링을 선택 (select) 한 뒤 속성 등을 변경하게 되는데요. 스크립트에서는 굳이 select 의 상태를 만들 필요는 없습니다. 물론 동일하게 select 상태를 만들 수 있긴 하지만 성능 관점에서는 굳이 select 상태여야 할 필요가 없다면 바로 진행을 하면 됩니다.
참고로 본 강좌 진행을 위해 알아야 할 것은 이제부터는 개체를 노드(Node)라고 부를 것 입니다. 3DS MAX Script 에서 공식적으로 개체를 Node 라고 지정하였기 때문이고요. 레퍼런스 등을 보실때도 그렇게 이해하고 계신 것이 혼선이 없을 것 입니다.
우선 기본적인 방식을 살펴 보겠습니다.
- selection 상태를 만드는 방법
- 현재 선택된 개체를 가져오는 방법
- selection 상태가 아닌 상태에서 개체를 지정하는 방법
- 지정된 이름을 기준으로 지정하는 방법 (단수 개체)
- 이름의 일부를 기준으로 지정하는 방법 (복수 개체)
- 레이어 단위로 지정하는 방법
- 모델링 클래스 단위로 지정하는 방법 (geometry, spline, ...)
이런 것들을 소개해 드릴 까 합니다.
이번 강좌의 내용만 잘 이해하셔도 3D Scene 내의 대부분의 개체를 선택하거나 지정하는 것이 가능합니다.
Selection 상태를 만드는 방법
먼저 기본형은 Select <Node> 의 형태로 되어 있습니다.
Node 는 $ 표시를 붙인 뒤에 개체의 이름을 적어주면 해당 노드를 지정하게 됩니다.
만약 $Box01 이라 하면 "Box01" 이라는 이름을 갖는 노드(개체)를 지칭하게 됩니다. 이녀석을 선택 (Select) 상태로 만드시려면 아래와 같은 방법을 사용하면됩니다.
Select $Box01
요 코드를 스크립트 에디터 또는 리스너(F11) 창 아래 하얀색 창에 적어주고 실행하면 "Box01" 이라는 이름을 갖는 모델링이 선택된 상태가 됩니다. 물론 Box01 이라는 개체가 존재해야 하지요.
A 라는 오브젝트를 선택한 뒤 B 라는 오브젝트를 추가로 선택하고 싶으신 경우 아래와 같이 코드를 작성하시면 됩니다.
select $Box01
selectmore $Box02
selectmore 라는 명령어를 이용하여 셀렉션을 추가할 수 있습니다.
현재 선택된 개체를 가져오는 방법
코드 작성을 하다보면 모든 기능이 시작부터 끝까지 자동화가 어려운 경우가 있습니다. 그런 경우 사용자에 의해 특정 개체를 선택한 뒤 부터 코드가 실행이 된다거나 하는 경우가 종종 있을 수 있습니다. 이럴때 현재 선택된 개체를 가져오는 스크립트가 필요한데요. 바로 아래와 같이 사용하시면 됩니다.
myObject = getCurrentSelection()
이렇게 하면 현재 선택된 개체들을 myObject 라는 변수로 가져올 수 있는데요. 아래와 같이 실재로 사용할 수 있습니다.
myObject = getCurrentSelection()
for obj in myObject do
(
-- 선택된 개체에 대하여 수행해야 하는 코드를 작성한다.
print (obj.name)
)
-- 또는
for i = 1 to myObject.count do
(
obj = myObject[i]
print (obj.name)
)
selection 상태가 아닌 상태에서 개체를 지정하는 방법
스크립트를 이용하여 자동화 업무를 하다보면 항상 선택이라는 액션이 발생되는 것은 아닙니다. 선택이라는 액션이 이루어 지는동안 속도가 많이 저하되기 때문에 자동화의 대상이 많을 수록 선택 과 같은 액션은 생략하는 것이 좋습니다. 개체가 선택될 때 마다 맥스에서는 UI 를 업데이트 해주어야 하는데요, 이때 성능이 많이 느려지게 됩니다. 아래의 내용에서는 선택 과정 없이 특정 개체에 직접 접근하는 간단한 사례를 설명하겠습니다.
지정된 이름을 기준으로 지정하는 방법 (단수 개체)
오브젝트의 이름을 알고 있는 경우 가장 손쉽게 개체를 지정할 수 있습니다. 보통은 코드 작성의 편의를 위하여 변수에 담아서 사용하는것이 일반적인 방법입니다. 위에 select 예제와 유사한 방식으로 지정하게 됩니다.
obj = $Box01
print (obj.name)
Box01 이라는 모델링 개체의 이름을 프린트 창에 출력하는 코드죠. 위와 같이 첫줄을 적어주면 obj 라는 개체가 갖는 다양한 속성들이나 명령들을 적용할 수 있게 됩니다. 예를 들어 해당 개체가 Box 라는 class 인 경우 아래와 같이 속성을 변경할 수 있게 됩니다.
obj = $Box01
print (obj.name)
-- 박스의 크기를 현재의 두배로 만들자
obj.width = obj.width * 2
obj.height = obj.height * 2
obj.length = obj.length * 2
-- 높이를 50 만큼 올려보자
obj.pos.z += 50
요런식으로 사용하는 것이지요.
이름의 일부를 기준으로 지정하는 방법 (복수 개체)
이번에는 이름의 일부분만을 이용하여 개체를 지정하는 방법을 소개해보겠습니다.
예를 들어 "box01" , "box02",... "box99" 이런식으로 동일한 이름 구조를 갖는 복수개의 개체가 있는 경우에 해당됩니다.
objs = execute ("$box*")
print objs.count
위에 보시면 execute 라는 명령어가 있는데요. 뒤쪽에 나오는 문자열을 실행 가능한 문장처럼 해석하는 것입니다. 문자열에는 "$box*" 이라는 형태로 씌어져 있는데 여기서 * 은 와일드 카드라고 불리는 글자 입니다. 다시말하면 box + 어떤 것이든 해당되는 문자열 이라고 보시면 됩니다. scene 내에 box 로 시작하는 모든 개체가 objs 라는 변수에 담기는 것이죠. objs 는 배열형 변수가 되어 실제 사용하실 때는 아래와 같이 하나씩 꺼내 쓸 수 있게 됩니다.
objs = execute ("$box*")
print objs.count -- 전체 담겨져 있는 개체의 수를 출력한다
for o in objs do
(
print o.name -- 개체의 이름을 출력한다.
-- 여기서 개체별로 하고 싶은 액션을 작성하면 됩니다.
)
-- 다른 방법으로는
for i = 1 to objs.count do
(
print objs[i].name
)
위와 같은 형식으로 각각의 개체에 대하여 어떤 작업을 하는 것이 가능합니다.
레이어 단위로 지정하는 방법
그럼 이번에는 레이어 단위로 개체를 지정하는 방법을 알아보겠습니다.
3DS MAX 작업을 하다보면 레이어를 기준으로 개체를 생성하고 관리하는 경우가 종종 있습니다. 물론 레이어 창을 열어서 해당 레이어 안의 개체를 선택해 줄 수 있겠지만 레이어가 많은 경우, 또는 특정 레이어에 항상 같은 작업이 반복되는 경우 레이어의 개체를 지정하여 액션을 만들어 주는 것이 유용할 때가 있습니다.
레이어 이름을 아는 경우 아주 간단하게 적용이 가능합니다.
myLayer = LayerManager.getLayerFromName "myObjects"
myLayer.nodes &objs
for o in objs do
(
print o.name
)
myObjects 라는 이름을 갖는 레이어의 모든 개체를 objs 라는 변수에 담는 코드 입니다.
레이어.nodes 라는 명령어가 뒤에 따라오는 참조형 변수에 해당 레이어의 모든 노드를 담아주는 기능을 수행합니다.
참조형 변수는 반드시 & 기호를 붙여 주어야 하며 미리 정의를 해줄 필요는 없습니다.
모델링 클래스 단위로 지정하는 방법 (geometry, spline, ...)
scene 내에 위에서 정의한 방식 외에도 여러 레이어에 포함되어 있고 다양한 이름으로 존재하는 개체를 지정해야 하는 경우도 많이 있습니다. 예를 들면 scene 내의 모든 geometry 나 spline, helper 등을 선택해야 할 때도 있기 마련입니다.
이럴 때 사용할 수 있는 간단한 방법이 있습니다.
for o in objects do
(
print o.name
)
scene 내의 모든 오브젝트에 대한 처리가 가능하게 하는 간단한 방법입니다.
여기서 사용된 objects 와 같은 개체를 오브젝트 셋이라 부를수 있는데요 다음과 같은 종류가 있습니다.
objects --all the objects
geometry --the standard 3ds Max categories...
lights
cameras
helpers
shapes
systems
spacewarps
selection --the current selection
어떤 변수에 위에 해당되는 셋을 선언해주면 scene 내의 모든 해당 클래스의 개체가 대상이 됩니다.
아주 간단하지만 강력한 기능이죠.
이렇게 다양한 방법으로 화면 내의 개체를 지정하고 지정된 개체에 대하여 필요한 어떤 작업을 수행하는 것이 가능합니다. 어렵지 않죠?
다음번에는 어떤 조건을 붙여서 개체를 지정하거나 피하는 방법을 소개해 드리겠습니다.
그럼 이만~
2022.05.31 - [DEV/MAX SCRIPT] - [3ds max script] ray 에 대하여 알아보기
2019/12/11 - [DEV/MAX SCRIPT] - 3DS MAX 스크립트로 초간단 다이얼로그 창 , UI 버튼 만들기
2019/12/16 - [DEV/MAX SCRIPT] - 3DS MAX SCRIPT 강좌?? 무작정 시작하기 - 디자이너 추천
'DEV > MAX SCRIPT' 카테고리의 다른 글
3da max script 점과 점 사이의 거리 구하기 (0) | 2021.02.24 |
---|---|
3DS MAX 스크립트, 프라퍼티 와 매소드 이해하기 (0) | 2021.02.24 |
3DS MAX SCRIPT 강좌?? 무작정 시작하기 - 디자이너 추천 (12) | 2019.12.16 |
3DS MAX 스크립트로 초간단 다이얼로그 창 , UI 버튼 만들기 (3) | 2019.12.11 |
3DS MAX Script 에 대하여 (0) | 2019.06.01 |