문자열 (String Values)
- 사용자에게 보여지는 Object Name은 Max 자체에서 Object들을 구분하기 위한 수단이 아님.
- Max에서는 핸들(Handle)이라는 숨겨진 일련번호로 Object를 구분함.
- Object를 생성하거나 Merge하면 생성 됨.
http://help.autodesk.com/view/3DSMAX/2019/ENU/?guid=GUID-40BD721E-9323-4FCF-8ABB-19E8EA92C675
Help
help.autodesk.com
- Object를 선택하고 $.handle을 실행하면 Object의 Handle 번호가 리턴 됨.
번호를 이용해서 Object에 접근하려면 MaxOps.getNodeByHandle을 이용하면 됨.
Matrix3 Values
- Rigging 하기 위해 필요한 Script 지식의 정점의 데이터형.
- Vector나 Point3는 공간상의 위치만 표현하지만 Matrix3는 Position, Rotation, Scale을 모두 포함함.
- 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으로 사용하기를 권장함.
읽기 쓰기도 가능함.
- Biped Transform Methods
http://help.autodesk.com/view/3DSMAX/2019/ENU/?guid=GUID-556BE0EA-341E-4934-B2B7-2813D318E3D3
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 - 제대로 작동되지 않는 경우가 있으므로 주의해서 사용해야 함.
- 특정 좌표계를 기준으로 작업을 수행하기 위한 In Coordsys라는 명령어가 있음.
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
- ObjectSet은 Array와 비슷해 보이지만 Array의 명령어가 모두 호환되지는 않는다.
따라서, a = Selection as Array와 같이 변환 후 사용해야 함. - ObjectSet Values
http://help.autodesk.com/view/3DSMAX/2019/ENU/?guid=GUID-77CB1890-C949-43AC-B1E9-B37F97B6712D#GUID-77CB1890-C949-43AC-B1E9-B37F97B6712D</a >
Help
help.autodesk.com
PathName
- PathName Literal
http://help.autodesk.com/view/3DSMAX/2019/ENU/?guid=GUID-8395020C-E3B6-4282-AF1C-5B58BDB97A24</a >
Help
help.autodesk.com
- Bip01 Spine을 경로로 표현하면 $Bip01/'Bip01 Pelvis'/'Bip01 Spine' 으로 표현 할 수 있음.
- 위와 같이 표현하면 중복 된 이름의 Object를 구분할 수 있음.
- 위와 같이 표현하면 중복 된 이름의 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 |