Programming/MaxScript

자료형(Data Type)

ParkJinseok 2021. 4. 11. 13:04

문자열 (String Values)

 

Help

 

help.autodesk.com

  • Object를 선택하고 $.handle을 실행하면 Object의 Handle 번호가 리턴 됨.
    번호를 이용해서 Object에 접근하려면 MaxOps.getNodeByHandle을 이용하면 됨.

 

Matrix3 Values

  • Rigging 하기 위해 필요한 Script 지식의 정점의 데이터형.
    • Vector나 Point3는 공간상의 위치만 표현하지만 Matrix3는 Position, Rotation, Scale을 모두 포함함.

  • 특정 Object의 Transform에 Matrix3를 곱하면 Position, Rotation, Scale을 변경 할 수 있다.
    이 때, 곱하는 앞뒤 순서가 중요함.

  • Matrix3는 Object의 Position, Rotation, Scale을 표현하는데 사용되기도 하지만, 자기 자신의 각도나 위치 등을 다른 오브젝트에 반영하는데 사용 되기도 함.

  • Matrix3 1은 단위 행렬.
    • 단위 행렬을 Position, Rotation, Scale에 아무런 변화가 없는 변환 행렬.
    • 앞뒤 위치에 영향을 받지 않으며 1과 비슷한 역할을 함.
    • Script 작성시 Matrix3를 초기화 할 때 사용함.

  • Matrix3 0은 제로 행렬
  • $.trasnform으로 Return되는 값은 World Transform
function fnGetLocalTransform trParent trChild =
(
	trChild*(inverse trParent)
)        

function fnSetLocalTransform trParent trLocal =
(
	tempVar = trLocal*trParent
)

$P.transform = fnGetLocalTransform $R.transform $Y.transform

 

쿼터니언(Quat Values)과 오일러(Euler Angles Values)

Script로 Object의 Rotation에 접근하기

  • $.Rotation 방식으로 사용하게 되면 값이 뒤집혀서 계산 됨.

  • $.Transform.Controller.Position이나 $.Transform.Controller.Rotation으로 사용하기를 권장함.
    읽기 쓰기도 가능함.
 

Help

 

help.autodesk.com

 

  • 계층 구조안에 있는 Object를 World Axis로 회전시키는 방법
    • Var = $B.Transform --원래 위치를 기억하기 위해서 Var라는 임시 변수를 생성.
    • $B.Transform = ( eulerAngles 90 0 0 ) as Matrix3 -- $B를 월드 중심에서 90도 회전
    • $B.Pos = Var.Pos --최초의 위치를 다시 $B에 적용한다.

  • In Coordsys
    • 특정 좌표계를 기준으로 작업을 수행하기 위한 In Coordsys라는 명령어가 있음.
      Ex) in coordsys world, in coordsys parent

    • 제대로 작동되지 않는 경우가 있으므로 주의해서 사용해야 함.

Euler Rotation 값의 누적과 Controller 접근


녹색 주전자($G)은 2200도를 회전했고, 파란 주전자($B)는 40를 회전한 상태.

 

Script로 확인해보면 둘다 40도 회전한 것으로 나옴.

 

제대로 확인하려면 아래와 같이 입력해야 함.

 

MaxScript에서 Componenet를 확인 할 때 에러가 나는 것이 아니라 Undefined가 나온다면 아직 지정되지 않은 상태라는 의미임.

Ex)

$.Tranform.Controller = $.Controller

 

  • MaxScript에서 #의 의미는 '이름'에 해당 됨.
    • 배열로 관리되는 값들이 특정 이름을 가지고 있다면 대부분 #Name 방식으로 접근이 가능함.
    • $.Transform.Controller[2].X_Rotation = $.Transform.Controller[#Rotation].X_Rotation

 

Quatenion 연산과 slerp(Spherical Linear Interpolation) 함수

  • Slerp 함수는 2개의 Quatenion 각도의 중간 각도를 계산해주는 명렁어
    Ex) 캐릭터의 팔꿈치나 무릎에 있는 중간 각도의 Bone을 Script로 제어하려 할 경우에 사용함.


  • 아래 가운데 회색 주전자는 빨간 주전자와 파란색 주전자의 회전값의 중간 회전 값으로 slerp R B 0.5로 설정해놓은 값이다.

  • Quatenion의 문제점중에 하나는 같은 각도에 대해서 2개의 값이 존재 할 수 있다는 점
    Ex) (Quat 0 0 0.92388 -0.382683) = (Quat 0 0 -0.92388 0.382683)

  • Quatenion은 위치 벡터를 이용해서 회전 각도를 표현하는 방식인데 부적절한 값을 이용해서 slerp를 사용해서 각도를 계산 할 경우,가까운 거리가 아닌 먼 거리의 회전 값을 이용해서 각도를 구하게 된다.

  • 위의 문제를 해결하는 방법은 Quat::MakeClosest 메서드를 사용하는 방법이 있다.

  • 위의 메서드를 먼 쪽의 Quatenion을 사용하려하면 가까운 쪽의 Quatenion으로 수정해주는 기능을 한다.

function MakeClosest quat1 quat2 =
(
	local dot = quat1.x*quat2.x + quat1.y*quat2.y + quat1.z*quat2.z + quat1.w*quat2.w
	if (dot < 0.0) do 
	(quat2.x = -quat2.x; quat2.y = -quat2.y; quat2.z = -quat2.z; quat2.w = -quat2.w)
	quat2
)

 

사용 방법은 아래와 같이 Function을 선언하고 해당 함수를 사용해 수정해준 후 Slerp 명령어를 사용하면 된다.

 

  • Rigging할 때 대부분의 경우에 Orientation Constraint으로 해결이 가능하지만, 경우에 따라 위의 방법을 사용해야 할때도 발생함.

 

Collection

http://help.autodesk.com/view/3DSMAX/2019/ENU/?guid=GUID-DAABD302-FB6A-40BB-882A-888631488FB7</a >

 

Help

 

help.autodesk.com

NodeChildrenArray

  • 계층구조에 접근하는 방법

ObjectSet

 

Help

 

help.autodesk.com

PathName

 

Help

 

help.autodesk.com

 

  • Bip01 Spine을 경로로 표현하면 $Bip01/'Bip01 Pelvis'/'Bip01 Spine' 으로 표현 할 수 있음.
    • 위와 같이 표현하면 중복 된 이름의 Object를 구분할 수 있음.

  • MaxScript에서 Object의 이름에 공백이 사용 되었을 경우엔 작은 따옴표(')로 묶어줘야 함.
    Ex) $'Bip01 L Hand'

'Programming > MaxScript' 카테고리의 다른 글

MaxScript에서 Python 사용하기  (0) 2021.04.12
함수(Function)  (0) 2021.04.11
좌표계(Axis)  (0) 2021.04.11
Macro Script  (0) 2021.04.11
확인해볼만한 내용  (0) 2021.04.06