맥스스크립트 심화

Edit poly, Editablepoly, Edit Mesh, Editable Mesh 확인하고 분기나누기.

스크립팅하는애님 2021. 5. 12. 23:15
728x90
반응형

안녕하세요.

애니메이터가 들려주는 맥스 스크립트의 스크립팅하는 애님입니다.

오늘은 'k'님이 질문을 올리신 것에 대해서 이야기해볼까 합니다.

질문 내용은 'Edit poly, Editablepoly'의 구별하지 않고 비슷한 기능을 통합해서 사용하고 싶으신 것 같습니다. (제가 정확히 이해한 건지 모르겠네요. ㅎㅎㅎ)

하지만 저는 모델링에 관해서는 거의 아는것이 없어서 세세한 부분까지는 설명 드릴수 없고 메쉬의 가장 대표적인 4가지에 대해서 스크립트로 어떻게 구별을 하는지 알아보도록 하겠습니다.

우선 질문하신 내용의 스크립트를 확인해 보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
try(destroydialog Bridge)catch()
Rollout Bridge "브릿지"
(
    Button b01 "Bridge"
 
 
    on b01 pressed do
    (
        if $.modifiers as string == "Edit_Poly" then
        (
            BR = $.modifiers[#Edit_Poly]
            BR.ButtonOp #BridgePolygon
        )
        else
        (
            messagebox "Editablepoly(x)"
        )
    )
)

createdialog Bridge width:400
cs

 

9번 라인의 내용은 선택한 오브젝트가 'Edit_Poly'라면 아래의 내용을 실행하고, 아니라면 14번 라인 이하를 실행 하라 입니다.

이상태에서는 11, 12번 라인이 실행이 되지 않습니다.

if문에서 조건이 잘못 적혀 있어 그런데요.

'Edit Poly'인 오브젝트를 선택하고 $.modifiers as string을 실행하면 결과 값으로 "#modifiers(BendMod:Bend, Edit Poly:Edit Poly)"가 출력이 됩니다.

"Edit_Poly"로 조건을 만들어도 참인 경우가 생길 수가 없죠.

 

다음과 같이 수정하면 가능합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
try(destroydialog Bridge)catch()
Rollout Bridge "브릿지"
(
    Button b01 "Bridge"
 
 
    on b01 pressed do
    (
        if ($.modifiers[1].name == "Edit Poly") then
        (
            BR = $.modifiers[#Edit_Poly]
            BR.ButtonOp #BridgePolygon
            format "Run !!!\n"
        )
        else
        (
            messagebox "Editablepoly(x)"
        )
    )
)
 
 
createdialog Bridge width:400
cs

 

그럼 여기에서 조금 더 생각해 보겠습니다.

'Edit Poly, Editable Poly, Edit Mesh, Editable Mesh'는 스크립트로 어떻게 구분할 수 있는가입니다.

 

 

4개의 박스가 있고 각각 'Editable Poly, Edit Poly, Editable Mesh, Edit Mesh'로 되어 있습니다.

그런데 여기에서 'Editable'라는 단어가 들어간 녀석들은 'modifier'에 스택이 없습니다.

해당 오브젝트를 선택하고 $.modifiers.count라고 하면 '0'이 결과로 나옵니다.

반대로 생각하면 'Edit'인 녀석들은 스택이 1개 이상이 있다는 얘기가 됩니다.(다른 스택이 쌓여 있다면.)

하늘색 박스부터 파란색 박스까지 각각 선택을 하고 classof $를 사용하여 확인해 보겠습니다.

순서대로 'Editable_Poly, PolyMeshObject, Editable_mesh, Editable_mesh'라고 결과가 나옵니다.

Poly는 확실히 둘 사이가 구분되지만, Mesh는 구분되지 않습니다.

확실하게 구분하기 위해서는 'modifier'의 스택들을 돌면서 어떤 형태인지를 확인하는 것도 필요합니다.

또  'Editable Poly'로 작업되었지만 그 위에 'Edit Mesh'스택이 쌓여 있을 수도 있습니다.

조건을 따지만 점점 더 꼬이고 어려워지네요.

저는 전문 모델러가 아니기 때문에 또 어떤 조건이 발생할지도 잘 모르겠네요.

간단하게 생각해 보겠습니다.

$.modifiers.count 했을때 0 이면 Classof $로 나오는 값을 취하고

$.modifiers.count 했을 때 0을 넘으면 'modifier'들을 for문으로 돌면서 처음으로 나오는 'Edit Poly' 또는 'Edit Mesh'를 취하도록 하겠습니다.(제일 위에 있는 스택이 1번이 됩니다. 그렇기 때문에 스택이 'Edit Poly', ''Edit Mesh', 'Edit Poly'.... 이렇게 쌓여 있다면 제일 위에 것을 취하도록 하겠습니다.)

 

위 조건을 종합하여 다음과 같이 수정하면 됩니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
try(destroydialog Bridge)catch()
Rollout Bridge "브릿지"
(
    Button b01 "Bridge"
 
 
    on b01 pressed do
    (
        if($.modifiers.count == 0) then
        (
            if(classof $ == Editable_Poly) then messagebox "Editable Poly"
            else if (classof $ == Editable_Mesh) then messagebox "Editable Mesh"
            else messagebox "Other"
        )
        else
        (
            for i = 1 to $.modifiers.count do
            (
                if($.modifiers[i].name == "Edit Poly") then
                (
                    messagebox "Edit Poly"
                    exit
                )
                else if($.modifiers[i].name == "Edit Mesh") then
                (
                    messagebox "Edit Mesh"
                    exit
                )
            )            
        )
    )
)
createdialog Bridge width:100
cs

 

9번 라인의 if문은 스택의 유무를 확인하여 없으면 'Edit'가 아닌 'Editable'로 구분하여 각각의 결과 값을 출력합니다.

15번 라인은 스택이 있을 경우(Edit) for문을 사용하여 스택을 순차적으로 돌며 처음 만나는 'Edit' 스택에서 결괏값을 출력하고 for문을 빠져나옵니다.

여기서는 간단히 메시지 박스를 출력했지만, 본격적인 작업은 사용자 정의 함수를 호출하는 방식으로 사용합니다.

 

제가 'k'님의 질문을 잘 이해하고 설명한 건지 모르겠네요.

이해하지 못했다고 해도 알아두면 좋은 내용이라고 생각됩니다.

수고하셨습니다.

728x90
반응형