본문 바로가기
둥지/DCC

MaxScript 다뤄보기

by 까닭 2023. 7. 31.

 

블로그 내용 참고 영상

 

MaxScript

3ds Max를 다루기 위한 C++ 기반의 스크립트 언어. Maya나 후디니 등 다른 프로그램에선 사용할 수 없기 때문에 Python을 사용하는 것이 더 범용적이다.

개발을 위한 Scripting Editor와 Scripting Listener

box() --생성된 box는 $Box001 이름을 갖는다.

ConvertTo $Box001 Editable_Poly --$Box001을 Editable Poly로 변환
select $Box001 --$Box001을 선택
subObjectLevel = 1 --Editable_Poly 1번 선택 모드인 Vertex 모드로 전환
$Box001.SetSelection #Vertex #{1..8} --Vertex 1번부터 8번까지 선택
$Box001.chamferVertices 10.0 --선택한 vertex에 chamfer를 10만큼 적용

 

결과가 왜 영상이랑 다르지? 아무튼...

 
 

MaxScript 명령어 참조 방법

1. Scripting Listener 참고하기

3ds Max의 interface를 통해 작업한 후 코드를 참고해보자.

Box pos:[-12.8808,-14.2865,0] isSelected:on width:56.8897 length:28.0018 height:55.2531
clearSelection()
select $Box001
move $ [0,25.7776,0]
move $ [0,-11.1289,0]
select $Box001
actionMan.executeAction 0 "40020"  -- Edit: Delete Objects
delete $

 
 
2. 3ds Max 2023 Developer Help 참고하기

 

Help

 

help.autodesk.com

 
 

MaxScript 언어 요소

변수

test_001 = 1
test_002 = 2 + 3
test_003 = 1.0
test_004 = "abcd"
test_005 = box pos: [0,0,0]
test_006 = [10, 10, 10]

print test_006

 
일반 프로그래밍 언어와 같이 변수 선언이 가능하다.

box()

ConvertTo $box001 Editable_Poly
select $box001
subObjectLevel = 1
$box001.SetSelection #Vertex #{1..8}
$box001.chamferVertices 10.0

앞서 사용했던 코드에 변수를 추가한다면 아래와 같이 쓸 수 있다.
변수를 선언함으로써 코드 가독성을 높일 수 있다.

a = box()

ConvertTo a Editable_Poly
select a
subObjectLevel = 1
a.SetSelection #Vertex #{1..8}
a.chamferVertices 10.0

 
if문

if 1 == 1 do
(
    test_005 = box()
)

if 2 == 1 do
(
    test_005 = box()
)
if 1 != 1 then
(
    test_005 = box()
)

else if 1 == 1 then
(
    test_005 = sphere()
)

else
(
    test_005 = Capsule()
)

특이하게 if문 뒤에 do, then이 붙는다.
if문으로 아래의 예제처럼 만들 수 있다.

cTime = (currentTime as integer) / ticksPerFrame --현재 프레임을 구하는 코드

if cTime < 50 then
(
    box pos : [cTime, 0, 0]
)

else
(
    Sphere pos : [0, 0, cTime]
)

하단의 바를 통해 프레임을 지정할 수 있다.
프레임에 따라 도형, 위치가 달라진다.

 
 
for문

for i in 1 to 10 do
(
    Box pos : [i * 10, 0, 0] scale : [0.2, 0.2, 0.2]
)

for문은 in, to, do를 통해 초기화, 조건식, 변화식을 표현한다.
 
함수

function myFirstMaxScript =
(
    for i in - 10 to 10 do
    (
        for j in - 10 to 10 do
        (
            Box pos : [i * 10, j * 10, 0] scale : [0.4, 0.4, 0.4]
        )
    )

    select $*
    Selected = $
    for i in Selected do
    (
        randNumber = random 1 10
        move i[0, 0, randNumber]
    )
)

myFirstMaxScript()

위 함수 코드를 지워도 호출 및 실행은 가능하다.

myFirstMaxScript()

 
이제 위 개념을 토대로 아주 간단한 툴을 만들어보자.

--gui 코드
rollout test "MyFirstScript"
(
    button btn01 "Make Boxes" pos: [5, 5] width : 130 helght : 24

    on btn01 pressed do
    (
        myFirstMaxScript()
    )
)

CreateDialog test width : 140 helght : 40


--함수
function myFirstMaxScript =
(
    for i in - 10 to 10 do
    (
        for j in - 10 to 10 do
        (
            Box pos : [i * 10, j * 10, 0] scale : [0.4, 0.4, 0.4]
        )
    )

    select $*
    Selected = $
    for i in Selected do
    (
        randNumber = random 1 10
        move i[0, 0, randNumber]
    )
)

'둥지 > DCC' 카테고리의 다른 글

Blender Add on 다뤄보기  (0) 2024.05.04