반응형

안녕하세요 오랜만에 3DS MAX SCRIPT 포스팅을 합니다.

제가 올리는 글을 누가 보는가 싶은데.. 간혹 스크립트를 잘 봐주시는 방문객들이 계신듯 하여 포스팅을 하게 되었습니다.

오늘은 3DS MAX SCRIPT의 계층 구조에 대한 이야기 입니다. 

왠만한 개발을 해 보신 분들은 사실 약간 상식적으로 알고 계신 내용일 것 같기는 합니만 그래도 역시 누군가에게는 도움이 될 듯 하여 글을 남겨 봅니다.

 

3DS MAX Scritp 에서 어떤 오브젝트는 개발 관점에서 보면 클래스 입니다. 상위 클래스가 있고 또 하위 클래스가 있는데요. 계층 구조라고 말씀 드린것처럼 클래스 안에 또 작은 클래스가 정의 되어 있고 또 그안에 작은 클래스 또는 구조체가 정의 되어 있다고 보시면 됩니다.

 

클래스라고???

개발이 생소하신 분들은 클래스라고 하면 잘 이해가 안되시죠?

우리 인간을 예를 들어 클래스라는 개념을 설명해 보면 다음과 같습니다. (그냥 예 입니다)

각 단계는 상위 클래스의 하위 클래스가 됩니다.

  • 동물 - 호흡을 한다. 심장이 있다. 
    • 포유류 - 4개의 팔 또는 다리를 가지고 있다. 아기를 낳는다. 젖을 먹인다.
      • 영장류 - 지능이 뛰어나다. 두발 또는 네발로 걸을 수 있다. 시각 능력이 좋다
        • 인간 - 특별히 뇌가 발달했다. 다양한 언어를 구사할 수 있다. 손의 움직임이 뛰어나다
    • 조류 ... 
    • 양서류...
    • 파충류...

뭐 이런식으로 어떤 큰 개념을 정의하고 그 하위에 상위의 개념을 포함하지만 조금 세분화된 개념을 담는 그런 방식으로 한단계 한단계 세분화된 그런 개념을 담고 있는 것이 일반적인 클래스의 개념입니다. (위에 설명한 건 그냥 예를 든 것입니다. 시비 노노)

 

예를 들면 익히 잘 알고 있는 Box 는 

요런 순서의 계층 구조를 가지고 있습니다.

우린 레퍼런스 파일을 통해서 Box() 라는 클래스가 가지고 있는 다양한 프라퍼티에 접근을 할 수 있습니다.

2021.03.24 - [DEV/MAX SCRIPT] - 3DS MAX 스크립트 레퍼런스 (헬프파일) 다운 받기

예를 들면 생성된 Box 개체의 width, Height, length 를 다음과 같이 변경할 수 있습니다.

myBox = box()
myBox.width = 25
myBox.Height = 150
myBox.Length = 50

그럼 아래와 같은 모델이 화면에 자동으로 생성되겠죠.

스크립트로 생성한 box

 스크립트에서 설정한 값이 잘 들어가 있는 것을 알 수 있습니다.

 

GeometryClass

그런데 위에 계층 구조를 보면 Box 위에 GeometryClass 라는 상위 클래스가 보이죠? 레퍼런스에서 해당 위치를 클릭해보면 GeometryClass 라는 녀석에 대한 정보가 나오는데요, 

"The mesh operations underlying the Boolean Compound Object in 3ds Max are accessible in MAXScript." 

라는 글이 해당 페이지의 첫줄에 보이고 

  • <node1> + <node2>
  • <node1>-<node2>
  • <node1>*<node2>

요런 수식들이 소개가 되어있습니다. 내용을 읽어 보면 GeometryClass 는 + - * 와 같은 연산자로 boolean 을 수행할 수 있다는 의미가 되겠습니다. Box 는 GeometryClass 이므로 당연히 Box 와 Box 는 위와 같은 boolean 연산이 된다고 볼 수 있겠습니다.

한번 해볼까요? 

myBoxA = box()
myBoxA.width = 50
myBoxA.Height = 50
myBoxA.Length = 50


myBoxB = box()
myBoxB.width = 150
myBoxB.Height = 25
myBoxB.Length = 25

myBoxB.pos.z = 12.5

요렇게 두개의 박스를 만드는 스크립트를 실행하면 

요런 형태의 두개의 박스가 생성이 됩니다.정육면체가 myBoxA, 길다란 육면체가 myBoxB가 되겠습니다.

자 그럼 myBoxA 에서 myBoxB를 빼 보도록 하겠습니다.

myBoxA = box()
myBoxA.width = 50
myBoxA.Height = 50
myBoxA.Length = 50

myBoxB = box()
myBoxB.width = 150
myBoxB.Height = 25
myBoxB.Length = 25
myBoxB.pos.z = 12.5

myBoxA - myBoxB

delete myBoxB

다른부분은 동일하고 마지막에 myBoxA 에서 myBoxB 를 빼는 수식을 추가한 다음 길다란 녀석을 삭제하는 코드를 추가하였습니다.

결과는요?

네. boolean 같은 복잡한 클래스를 사용하지 않아도 이렇게 쉽게 boolean 동작을 수행하는 군요. 

네 그럼 Box 뿐만 아니라 다른 geometryClass 의 모든 대상이 위와 같이 단순한 연산자를 이용하여 boolean 연산을 할 수 있다는 의미로 보시면 됩니다.

GeometryClass 에는 Box 외에도 Sphere 나 Cylinder, Tube 및 친근한 Teapot 같은 개체도 모두 GeometryClass 이므로 모두 동일하게 위와 같은 연산을 사용할 수 있다는 거죠.

GeometryClass 에는 아래와 같은 명령어도 지원합니다.

설명을 보면 

"Returns an array of two integers - the face count and the vertex count of the TriMesh on top of the modifier stack. "

라고 되어 있는데요, Sphere 를 하나 생성한 뒤 위의 코드를 한번 실행해 볼까요?

mySphere = Sphere()
GetTriMeshFaceCount mySphere

요렇게 작성한 뒤 실행해 보면 

$Sphere:Sphere002 @ [0.000000,0.000000,0.000000]
#(224, 114)

요런 결과가 리턴 됩니다. 첫째 줄은 생성된 sphere 에 대한 정보이고요, 두번째가 바로 작성한 코드의 결과물인데요. 위의 설명에 따르면 face 개수와 vertex 개수를 돌려 준다고 합니다. 생성된 sphere 는 224개의 face 와 114개의 vertex 로 이루어져 있다는 것을 알 수 있습니다. 다시 말하자면 우리는 생성한 geometryclass 가 뭐든간에 해당 개체의 폴리곤수를 바로 알 수 있게 되는 겁니다. mesh 나 poly 같은 개체의 geometry 속성 정보를 알기 위하여 class 구분을 하고 getNumfaces 나 polyop.getNumVertexs 를 사용하는 것처럼 개체의 클래스나 구성 방식 등을 검사를 할 필요가 없는거죠.

 

Node

자 그럼 한칸 더 상위로 올라가서 Node 를 볼까요?

Node 는 3DS MAX Script 에서 아주 중요한 개념으로 해당 클래스에서 사용할 수 있는 프라퍼티나 메소드가 아주 많습니다. 스크립팅의 아주 기본적인 부분도 많이 보이네요.

아주 간단한 예를 들면 우리가 scene 에서 보여지는 모든 개체는 node 라는 클래스라고 보면 됩니다. EditableMesh 건 EditablePoly 건 Camera 건 심지어 helper 나 dummy 같은 개체도 모두 node의 하위 클래스 입니다.

즉 Node 라는 개체에 대한 설명이 적혀있는 레퍼런스 페이지에 있는 모든 하위요소를 사용할 수 있습니다.

 제가 아~~주 자주 사용하는 node 의 대표적인 프라퍼티 또는 메소드를 보면 아래와 같습니다.

  • IsValidNode <var>
  • move <node> <point3> -- mapped
  • scale <node> <point3> -- mapped
  • rotate <node> <eulerangles> -- mapped
  • copy <node> -- mapped
  • reference <node> -- mapped
  • instance <node> -- mapped
  • delete <node> -- mapped
  • classOf <node>

딱 봐도 어떤 일을 하는지 아시겠죠? 우리가 알고있는 대부분의 요소는 node 이며 위와 같은 명령어를 이용하여 컨트롤 할 수 있답니다. 복사하고 이동하고, 회전하고 삭제하고, 해당 개체가 어떤 클래스인지 확인하는 그런 것들이죠.

Node Common Methods

 

라는 항목을 보면 Node 에서 사용할 수 있는 더 많은 상세한 레퍼런스들을 확인할 수 있습니다.

Node 클리스의 상세한 레퍼런스 들

이렇게 말이죠.

물론 Node 자신의 subClass 에는 GeometryClass, Shape, Light, Camera, Helper, SpacewarpObject, System 이러한 요소들이 있고 각기 자신에 해당하는 프라펕와 메소드들을 다룰 수 있지만 역시 node 에서 정의하고 있는 모든 프라퍼티와 메소드를 사용할 수 있는 것 입니다.

 

드디어 최상위 클래스 : Value

그럼 최상위 Value 라는 개체로 가 볼까요?

Value 개체는 3DS MAX 에서 정의하고 있는 class 의 최상위 개체입니다. 말하자면 모든 구조체, 클래스 등은 Value 에 속하므로 Value 에서 정의하고 있는 기능을 수행할 수 있는 것이라 할 수 있겠습니다.

최상위인 value 에는 대표적으로 다음과 같은 항목들이 정의되어 있습니다.

  • <value> == <value>
  • <value> != <value>

익히 잘 알고 있는 bool 연산자죠? if 구분 같은 곳에서 대상과 대상이 같은지 다른지 판단할 수 있고요. 

  • print <value>
  • format <format_string>

와 같은 코드를 통해서 해당 정보를 출력해 볼 수 도 있습니다. 

Working with Values

라는 레퍼런스 페이지에 보면 스크립팅을 하는 동안 Value 를 어떻게 다룰 수 있는지 잘 소개가 되어있습니다.

스크립트는 다른 개발 언어와 다르게 빠르게 작성하고 빠르게 컴파일, 실행을 할 수 있기 때문에 이런 구조체를 알면 디버깅도 빠르고 작성도 손쉽게 할 수 있겠습니다.

Value 에는 node 와 같은 scene 내의 개체 뿐만 아니라 Float ,Integer ,String ,BitArray ,Point3 ,Ray ,Quat ,AngAxis ,EulerAngles ,Matrix3 ,Point2 ,Color ,Arrays 와 같은 클래스나 구조체들도 포함되어 있습니다. Ray 에 대해서 지난 포스팅에 소개해 드렸었죠?

2022.05.31 - [DEV/MAX SCRIPT] - [3ds max script] ray 에 대하여 알아보기

 

[3ds max script] ray 에 대하여 알아보기

가끔 아니 어쩌면 자주 3D 공간안에서 물체의 위치를 지정할때 이 물체가 저쪽에 닿는 면에 딱 위치하고 싶은데... 할때가 있죠? 예를 들면 나무나 돌덩이 이런걸 랜덤하게 막 생성한 다음 굴곡진

diy-dev-design.tistory.com

사실 Value 는 정말 아~~주 아주 기본적인 속성들을 다루고 있다고 보시면 되고 해당 정보들 없이는 스크립팅이 불가능한 정말 개념이 없어도 늘 사용하는 그런 애들이라고 보시면 됩니다.

 

 

마치며

자 오늘 포스팅은 사실 개념적인 부분이어서 조금 어려울 수도 있을 것 같습니다.

하지만 스크립팅을 하다보면 저처럼 자연스럽게 알게 되기도 하고요. 또 이런 개념을 이해하고 스크립팅을 하면 훨씬 쉽고 유연하게 코딩을 하실 수 있을 거에요. 

저 처럼 무작정 코딩을 하며 배워가는 경우에도 "아~~~ 이게 이런거였어?!?!?" 이런 적이 셀 수 없이 많았거든요. 

 

자 다시 정리하자면 

  • 상위 클래스에서 정의되어 있는 프라퍼티나 메소드는 하위 클래스에서도 접근 할 수 있다.
  • 즉 name, rotate, move, delete, copy 같은 개념은 하위의 어떤 클래스에서도 사용할 수 있다.
  • 지금 보고 있는 개체의 상위 클래스가 무었인지 확인해 보자.

 

자 다들 화이팅하시고 스크립팅을 통해 에이스의 진면모를 보여주시기를 바라며 오늘의 포스팅을 마칩니다.

 

2021.02.26 - [DEV/MAX SCRIPT] - [3ds max script] vector 에 대하여

 

[3ds max script] vector 에 대하여

안녕하세요. 오늘은 디자이너라면 조금 생소할 수 있는 vector 라는 개념에 대하여 소개해 드릴까 합니다. 혹시 작년 쯤인가요? 슈퍼밴드라는 밴드 오디션 프로그램에서 F=ma 라는 곡으로 아주 인

diy-dev-design.tistory.com

2021.02.24 - [DEV/MAX SCRIPT] - 3da max script 점과 점 사이의 거리 구하기

 

3da max script 점과 점 사이의 거리 구하기

간단하게 포스팅을 남기려고 합니다. 제목 그대로 버텍스 간 거리 구하기 입니다. 아니 정확히는 두개의 point3 사이의 거리를 구하는 방법을 소개해 드릴까 합니다. 그리고 용용 편으로 두 점사

diy-dev-design.tistory.com

 

반응형

+ Recent posts