본문 바로가기
3DMAX/Setup

캐릭터 셋업 책 정독 및 정리 - 2차 스크립트와 함수(Script & Function)

by tartist 2015. 12. 17.

제2강 - Expression 과 Script


*Expression

 

1. Expression?

- 수학적 표현을 통해서 오브젝트의 파라미터나 애니메이션을 컨트롤하는 방법이다.

- 수학을 써야 한다니 겁을 먹을수도 있지만, 일반적인 수준에서의 캐릭터 셋업은 상식적 산수만 알아도 Expression Controller의 강력한 기능을 사용하는 데에는 큰 문제 없다.

- Scrpit Controller와 상대적으로 비슷하지만, 기능은 더 적다. 하지만, 속도가 빠르다는 장점때문에 많이 이용된다.

 

2. 변수와 상수   

- 예약 변수

1) T : ticks, 맥스에서 시간은 1초에 4800틱의 해상도를 가지고 있다. , 초당 1/4800 만큼의 정밀도로 시간이 계산된다. 1초가 30프레임으로 되어 있는데 1프레임안에 160틱이 들어있는 셈이다. 그렇기에 T값을 160으로 나누면 F와 같아진다.

2) F : frames, 타임 슬라이더의 프레임 숫자를 의미한다.

3) S : secs,초 단위의 실제 시간을 의미한다. 3ds max의 디폴트 세팅에서 1초는 30프레임이므로 30프레임의 위치에서는 S 1의 값을 가지게 된다.

4) NT : normalize time, 해당 오브젝트의 애니메이션 전체 구간을 1이라고 가정했을 때 현재 시간을 의미한다. 예를 들어 애니메이션 전체 구간이 300프레임 일 때 현재 프레임이 150프레임이라면 NT 0.5값을 가지게 된다.

- 예약 상수

1) Pi : 3.14159의 값을 가지는 상수이다. ㅠ 라는 기호로 표시되고 파이라고 읽는다. 파이는 지름이 1인 원의 둘레 길이이다. 그렇기 때문에 원의 둘레를 구하는 공식이 2r이 된다. 파이와 원의 둘레를 구하는 공식은 자동차 바퀴가 굴러가는 등 둥근 물체가 자동으로 정확하게 회전하는 리깅을 위해서 꼭 필요한 공식이므로 매우 중요하다.

2) E : 2.71828의 값이고 자연로그의 밑이 되는 자연상수이다. 미분이나 적분 계산에 매우 자주 사용되는 상수이며 자연에서 발견되는 다양한 성장, 감소현상의 계산에 사용된다.

3) TPS : 4800의 값을 가지는 상수이다. 3ds max 1초에 4 8백번의 틱을 생성하는데 내부적으로 애니메이션을 계산하는 가장 기본 단위가 된다.

- 스칼라 변수와 벡터 변수의 개념 깨우치기

X y 좌표에 (2,3)에 표시될 때 2 3은 각각 스칼라이지만, 그래프상 (2,3)은 벡터이다.

크기만 있고 방향이 없을 때 스칼라라고 표기하고, 크기와 방향을 모두 가지고 있을 때 벡터라고 표기한다.

  • Tick Offset : 특정 오브젝트에 시간차를 두고 오브젝트가 따라다니게끔 설정하는 기능. 예를 들어 게임의 검기가 Tick Offset기능을 활용하여 제작이 가능하다.

 

3. 연산자

- 더하기, 빼기, 곱하기, 나누기를 연산자라고 한다. 하지만 Expression에는 이외에도 다양한 연산자가 존재한다. 공식 레퍼런스를 참조해서 연산자의 종류를 분류해보면 다음과 같다.

1) 스칼라 산술 연산자

연산자

예제

설명

+

P + q

더하기

-

P ? q

빼기

-

-p

마이너스 부호

*

P * q

곱하기

/

P / q

나누기

^

P ^ q

P q제곱

**

P ** q

P q제곱, ^연산자와 같음

 

2) 벡터 컴포넌트 연산자

예제

설명

V.x

벡터의 첫 번째 컴포넌트(X)

V.y

벡터의 첫 번째 컴포넌트(Y)

V.z

벡터의 첫 번째 컴포넌트(Z)

 

3) 스칼라 관계 연산자와 논리 연산자

연산자

예제

설명

=

P = q

P q는 같음.

P < q

P q보다 작다.

P > q

P q보다 크다.

<=

P <= q

P q보다 작거나 같다.

>=

P >= q

P q보다 크거나 같다.

|

P | q

논리 OR로서 pq 둘중에 하나라도 0이 아니면 1인된다.

&

P & q

논리 AND로서 pq 둘다 동시에 0이 아니면 1인된다.


 

4) 벡터 산술 연산자

연산자

예제

설명

+

V + W

벡터 더하기

-

V ? W

벡터 빼기

*

P * V

벡터에 스칼라 곱하기

*

V * P

벡터에 스칼라 곱하기

*

V * W

벡터의 내적 연산

X

V x W

벡터의 외적 연산

/

V / p

벡터에 스칼라 나누기


            V W는 벡터이고, p는 스칼라 즉, 숫자이다.         

            위 도표에서 모든 연산의 결과는 다시 벡터가 된다. , V+W를 연산한 결과 역시 벡터라는 뜻이다. 하지만 벡터의 내적 연산만 결과가 스칼라가 된다.

 

        5) 연산의 우선 순위

            R * 0.5 + B + 0.5 (R * 0.5) + (B * 0.5)에서 처럼 괄호로 연산 순서를 묶어주지 않더라도 연산의 우선순위가 정해져 있기 때문에 덧셈을 가장 마지막에 연산하게 된다.

            Expression에서 사용되는 연산의 우선순위는 다음의 도표를 참조하도록 하자.

연산자

우선 순위 설명

-+

예를 들어 -8이나 +25에서 처럼 양수와 음수를 뜻하는 기호

.

벡터의 컴포넌트 연산, 예를 들어 V.x

**^

제곱 연산

X

벡터의 외적(cross)연산

*/

곱셈과 나눗셈

+-

덧셈과 뺄셈

=<> <= >=

관계 연산자

|&

논리 연산자

 

 

4. 벡터의 내적과 외적

    1) 내적 ? 공간상의 각도를 계산하기 위해 사용되는 기능.

    A B 두 개의 벡터가 있을 때 내적을 이용해서 각도를 계산하는 공식은 다음과 같다.

    Acos(unit(A) + unit(B))

    이 공식을 Max Script로 표현하면 acos(dot mormalize(A) normalize(B)) 두 경우 모두 계산 결과는 각도 단위로 계산된다.


    2) 외적 ? 특정 평면의 수직 벡터를 계산하는데 자주 사용. B벡터R벡터가 있을 때 B * R 연산을 한 결과가 W이다. 여기서 W B와도 직각이고 R과도 직각이다. 외적 연산은 이러한 특징에 의해서     평면의 노말(Normal) 방향을 알아내는데 사용되기도 한다.

 

 

5. 함수 응용하기

    -일반적으로 함수를 y = f(x)라는 식으로 표현하는데 빵 제조기에 이런 표현을 적용해 보면 빵 = 빵제조기(밀가루)라고 표현할 수 있다.

    Max 함수는 두 숫자를 입력받아서 둘중에 큰 숫자를 출력하는 함수이고 y = max(a,b)라는 식으로 표현할 수 있다. Max 함수에 의해 a b를 비교하고 더 큰 값이 y에 전달된다

    

    1) 삼각 함수

  • 주로 원운동을 하는 경우에 어김없이 등장한다. 예를 들어 삼각 함수를 통해서 피스톤의 왕복 운동을 애니메이션 할 때 피스톤의 크랭크축의 각도라든지 거리를 계산할 수 있다. 지수함수는 그래프의 특성상 천천히 감속하거나 가속하는 특성을 표현할 수 있다.

  • 삼각함수에 아크(arc)가 붙으면 역삼각함수(Inverse Trigonometric Function)이 된다. 역함수의 대표적인 예는 제곱근이다. 3을 제곱하면 9이고 9를 제곱근하면 3이 된다. 역삼각함수 역시 같은 개념이다. Sin(90) = 1이고 asic(1) = 90 이다.

  • Acos(x), asin(x), atan(x), cos(x), cosh(x), sin(x), sinh(x),tan(x), tanh(x) Expression에서 지원하는 9가지 삼각함수이다.

    

    2) 지수 함수, 로그, 자연로그

  • Y = exp(x) 함수는 지수 함수(Exponential Function)이다.  Y=log(x)함수는 로그함수이고, y = ln(x)는 자연로그 함수이다.

     

        

        3) 라디안과 각도 변환 함수 

      • 3dx max에서 pi3.141592.. 의 값을 가지는 상수인데 이 값이 라디안 개념으로는 180도 각도에 해당된다. 다시 말해서 360도 각도는 라디안 단위로는 6.28319..에 해당된다. 라디안과 각도는 이처럼 각도를 표시하는 단위의 차이이기 때문에 마치 인치와 센티미터으 차이와도 비슷하다.

      • 라디안을 각도로 변환해 주는 함수는 radToDeg()이다. 예를 들어 radToDeg(pi)라는 Expression 180을 리턴한다. 반대로 degToRad()함수는 각도를 라디안으로 변환해 주는 함수이다.  degToRad(180) 3.14159 값을 리턴한다.

         

            

            4) 소수점 올림과 버림 함수

        • Ceil() 함수와 floor()함수는 입력된 숫자에 대해서 무조건 소수점 이하 자리가 사라진다. 예를 들어 버림 함수인 floor에 대해서 floor(1.3)이라고 하면 0.3이 사라지고 1.0의 값이 리턴된다. Ceil() 함수는 천장을 의미하는 올림함수, floor()함수는 바닥을 의미하는 내림함수이다.

            

            5) 일반적인 함수

        • Pow는 제곱함수이다. Pow(p ,q) p^q와 동일한 결과가 된다. Pow(2,3) 8이다.

          Maxscript에서는 pow 2 3 이라고 쓴다. Expression maxscrpit에서 다소 결과값이 다르게 나오는데, 이유는 Expression은 부동소수(float) 연산을 하지만, Max Script는 입력되는 값에 의해서 정수(integer)연산을 할 수도 있다는 점을 조심해야 한다.

        • Sqrt(p)

          sqrt함수는 제곱근 함수이고 square root라는 뜻이다. Sqrt(9)를 연산하면 3이 반환된다. 이 함수는 Max Script Expression에서 동일한 사용이 가능하다.

        • abs(p)

         abs함수는 절대값이라고 부른다. P에 입력된 값이 양수이면 그대로 p를 반환하지만 음수인 경우에는 p를 양수로 변환한 뒤 변환(return)한다. abs(8) abs(-8)은 둘다 8을 리턴한다.

        • min(p,q) , max(p,q)

          min함수와 max 함수는 함수 이름에서 역할을 쉽게 짐작할 수 있다. Min은 최솟값이고 max는 최대값이다. 예를 들어 min(3,4) 3을 리턴하고 max(3,4) 4를 리턴한다.

          Max Script에서는 amin , amax 라는 함수가 유사한 기능을 한다.

          myMin1 = amin # (5,1,4,2,8)

          myMin2 = amin 5 1 4 2 8

        • mod(p ,q)

         이 함수는 p q로 나눈 나머지 값을 리턴하는 함수이다.

        P

        Q

        Mod(p, q)

        설명

        13

        1

        0

        13 / 1 =13,나머지 0

        13

        2

        1

        13 / 2 =6,나머지 1

        13

        3

        1

        13 / 3 =4,나머지 1

        13

        4

        1

        13 / 4 =3,나머지 1

        13

        5

        3

        13 / 5 =2,나머지 3

        13

        6

        1

        13 / 6 =2,나머지 1

        13

        7

        6

        13 / 7 =1,나머지 6

        13

        8

        5

        13 / 8 =1,나머지 5

         

         

           

              6) 조건 함수 

            • If 함수

              If(p ,q, r)을 풀어서 이야기 하면 p를 검사해서 맞으면 q이고 틀리면 r이다. 라고 이해하면 된다.

            • 논리 연산자

              P | q : 논리 OR로서 p q 둘중에 하나라도 0이 아니면 1이 된다.

              P & q : 논리 AND로서, p q 둘 다 동시에 0이 아니면 1이 된다.

              논리 OR은 한글 표현으로는 논리 합이라고 부른다. 그리고 논리 AND논리 곱이라고 부른다. 다시 풀어서 쓰자면..

              P | q : p q 둘중에 하나라도 참(true)이면 1이 된다. - OR

              P&q : p q 둘다 참(true)이면 1이 된다. ? AND

            • vif 함수

              이 함수의 사용법은 vif(c, v1, v2)이다. If 함수와 매우 유사한 함수로서 c가 참이면 V1이 결정되고 거짓이면 V2로 결정된다. 이 때 V1 V2에는 벡터가 사용된다는 점이 if 함수와의 결정적인 차이점이다.

               

               

                  7) 벡터 함수 

                • Length(v)

                  Length함수는 벡터의 길이를 리턴하는 함수 인데 원점으로부터 해당 오브젝트까지의 길이(length)를 리턴한다. 리턴되는 값은 벡터가 아니라 스칼라(숫자)라는 점을 조심해야 한다. Length([10,0,0])의 값은 Length([10,0,0])이 되고, length([10, 10, 0])의 결과는 14.1421이 된다. X , y의 위치의 대각선 길이 값을 구하게 된다. 그런데 이 함수는 무조건 월드 중심으로 계산하기 때문에 활용 범위가 그다지 많지는 않다. 하지만 이런경우에 length(오른손 위치 ? 왼손 위치)를 해주면 오른손과 왼손의 길이를 알 수 있다. 벡터의 뺄셈에 의해서 두 오브젝트의 거리에 해당하는 새로운 벡터를 만드는 것.

                • Comp(V , i)

                  컴포넌트 함수는 V 벡터의 i번째 컴포넌트를 리턴한다. I 0이나 1, 그리고 2의 값을 입력받는다. 예를 들어서 A라는 벡터 변수에 [10,20,30]이라는 값이 들어 있다고 할 때, comp(A , 0) 이라고 연산을 하면 10의 값이 리턴된다. Comp(A , 1)이라고 연산을 하면 20의 값이 리턴된다. Comp(A , 2)이라고 연산을 하면 30의 값이 리턴된다.

                • Unit(V)

                  벡터 V의 방향은 유지한 채 길이가 1인 벡터를 리턴한다. 다시 말해서, 벡터의 길이를 1로 변경해 주는 함수인 것이다. 이 녀석은 말로 설명이 잘 안되니, 개념을 잡자_049.Max 파일을 참조하길 바란다.(동영상 개념을 잡자_동영상_014.wmv)
                   

                 


                **Max Script**

                1. 스크립트 리스너

                - 간단한 Script 구문을 실행하고 리턴되는 값을 모니터링 하는 기능

                - Print format 등 출력에 관계되는 함수를 사용할 때 출력될 스트림을 지정하지 않으면 Script Listener로 출력된다.

                - 디버깅 툴

                   


                   2. as 

                    - 형 변환을 시켜주는 코드

                    - Ex> 1.4 as integer -> 1   ,   3 as float -> 3.0    ,   $.pos as string -> “(12,15,0)”

                    - 데이터 형 변환 외에도 컬렉션 타입 변환에도 사용된다. 예를 들어 a = geometry as array 라는, Script geometry라는 오브젝트 셋 컬렉션을 배열 형태의 컬렉션으로 변환시켜 준다.

                       


                      3. 매크로 스크립트

                       - 이 기능을 통해서 키보드 단축키, 툴 바, 쿼드 메뉴, 일반 메뉴 등에 등록해서 편하게 사용할 수 있다.

                      - 스크립트 레퍼런스 문서 어떻게 읽는가?

                      문자

                      영문 표기

                      한글 표기

                      의미

                      […]

                      Bracket

                      대 괄호

                      선택적, 사용해도 되고 안해도 됨

                      {…}

                      Brace

                      중 괄호

                      사용하지 않거나 여러 번 사용 가능

                      {…}+

                      Brace +

                      중 괄호 +

                      최소 한번 이상, 여러 번 사용 가능

                      ( )

                      Parenthesis

                      둥근 괄호

                      묶어주는 기능

                      <rule></rule>

                      Angile Bracket

                      꺽쇠 괄호

                      규칙, 예를 들어<string></string>은 문자열을 의미

                      |

                      Vertical Bar

                      수직선

                      수직선으로 분리된 아이템중 하나를 선택

                       

                      - MacroScript BoxTest category : “My Category” tooltip : “Default Box” (box () )

                      라고 리스너에서 실행하면 Default Box라는 이름의 Macro Script가 등록된다.

                      - Macro Script의 문법

                      • Name : macro Script를 정의할 때 구분짓는 이름이다. 일반적으로 함수나 롤아웃 등을 정의할 때 함수나 롤아웃의 이름은 변수의 속성을 가지고 있어 롤아웃 외부에서 내부로접근이 용이하다.

                      • Category : customize user interface 창에서 구분되는 카테고리의 이름이다.

                      • ButtonText : 버튼에 표시될 텍스트이다.

                      • Icon : 버튼에 표시될 아이콘이다.

                      • Tooltip : 버튼의 툴팁이다. Customize User Interface 창에서 이 이름으로 보여지게 된다.


                       

                           4. 예약어

                           

                            - Max Script에는 특수한 기능을 하는 명령어들이 미리 만들어져 있는데 이것을 예약어라고 한다.

                            - 예약어는 크게 3종류로 나눌 수 있다.

                            • Language Reserved Keywords (Script 언어를 구성하는 예약어)

                            • Punctuation and Symbols (구분과 기호)

                            • Reserved Global Variables (글로벌 예약 변수들)


                             

                                 5. 변수(variable)

                                 

                                  - 말 그대로 변할 수 있는 수이다. 다음문구를 예로 들어보자.

                                  - “오늘 바람이 유난히 많이 부는군요. 세계 기록 수립에는 바람이 변수 입니다.”

                                  • 경기장에 부는 맞바람이 초속 0~10m 사이, 맞바람이 초속 1m가 강해질 때마다 선수들의 100m 달리기 기록이 0.01초씩 늦어진다고 가정했을 때 의 공식

                                  • (달리기 기록) = (선수 최고 기록) + (wind * 0.1)


                                  - 이름(Names)

                                    • 첫 문자는 영어 알파벳과 “_” 문자로 시작되어야 한다.

                                    • 두 번째 이후 문자에는 영어 알파벳과 “_” 문자와 숫자를 사용할 수 있다.

                                    • 영어 알파벳은 대소문자 구분을 하지 않는다.

                                    • 잘못 사용된 예 

                                              1) 1objet : 첫 문자가 영어가 아님

                                                2) Pressed? : 특수문자 ?가 사용되었음.

                                                3) a big number : 이름에는 공백을 사용할 수 없음     

                                     4) seven(7) : “(“ 등의 문자를 사용할 수 없음;.

                                   

                                    - 변수의 종류 

                                                1) 일반 변수 : a = “hello” , a = 1 , a = [10,20,30]  등등..

                                     2) 배열 변수 : 배열의 개념을 설명하기 위해 지하실 락커를 예를 들어보자.

                                     1번락커에 가방, 2번락커에 도시락, 3번락커에 우산, 4번 락커에 신발을 넣었다. 락커[1]은 가방, 락커[2]는 도시락, 락커[3]은 우산, 락커[4]는 신발이 되었다.

                                             락커.count 4가 된다.

                                             비워라 락커 명령은 전체 락커를 비우게 된다.

                                             비워라 락커[3] 명령은 3번의 우산만 비우는 명령이 된다.

                                     Append 락커 코끼리 라고 치면 코끼리가 들어있는 락커 하나가 뒤에 추가된다.

                                     

                                                            2-1) 배열의 사용

                                     

                                      380P~382P를 집중적으로 읽으며 이해하자. tempPos 를 이용한 배열변수 사용.


                                     

                                         

                                        6. 구조체(Structure) 

                                          • Show $.material 이라고 치면 material 의 다양한 프로퍼티들이 나온다. 그중에 디퓨즈맵이 있는데 show $.material.diffusemap 이라고 치면 디퓨즈맵에 대한 프로퍼티를 볼 수 잇다.  이처럼 특정 오브젝트를 정의하는 수 많은 특징들을 계층 구조 형태로 구성한 것을 클래스라고 부른다. 실제로 클래스는 단순히 프로퍼티 뿐 아니라 해당 오브젝트와 관련된 함수도 포함되는 개념이다. 383~385페이지를 정독하기!!

                                           

                                           

                                             

                                            7. 기준 좌표계와 Max Script 

                                              Script

                                              설명

                                              $.pos

                                              선택된 오브젝트의 월드 포지션이 리턴된다.

                                              $.transform.pos

                                              선택된 오브젝트의 월드 포지션이 리턴된다. 바이패드 오브젝트에도 사용할 수 있다.

                                              $.transform.controller.Position

                                              선택된 오브젝트의 로컬 포지션이 리턴된다.

                                              • Max Script에서 바이패드의 로컬 트랜스폼을 ExposeTransform 헬퍼의 도움 없이 알아내기 위해서는 matrix3라는 행렬 데이터를 사용해야 한다.

                                              • Matrix3라는 행렬 데이터는 오브젝트의 위치, 회전, 스케일 정보를 모두 가지고 있는 데이터 형태이다.

                                              • 부모 역할을 P 오브젝트(parent)가 있고, 자식 역할을 하는 C 오브젝트(Child)가 있을 때 C의 로컬 트랜스폼을 알아내는 공식은 다음과 같다.

                                                C의 로컬 트랜스폼 = $C.transform * (inverse $P.transform)

                                                월드 좌표(월드로 부터의 거리)와 로컬 좌표(부모로부터의 거리)에 대해서 확실히 알고 넘어가자!!

                                                 

                                                 

                                                8. 데이터 형(Data type) 

                                                  - 숫자(Number Values)

                                                  Number 형은 우리가 익히 알고 있는 숫자 형태이다.  기본적인 사칙 연산과 제곱 연산이 ‘^’ 연산이 가능하다.

                                                   

                                                              1) Integer : 소수점이 없는 정수형

                                                           2) Float : 소수점으로 표현되는 부동소수형

                                                   

                                                  - 문자열(String Values)

                                                  • 문자 형태의 데이터. Messagebox 1은 에러나지만, messagebox “1”은 정상 출력된다.

                                                    1 as string -> “1”

                                                    1 as integer -> 1

                                                  ​- Point3 , Point2 Vales


                                                  Point3 x,y,z 세 개의 축으로 표현되는 3차원 공간의 한 점을 의미한다. 그리고 point2 x,y 두 개의 축으로 표현되는 2차원 공간의 한 점을 의미한다. 예를 들어 $.pos 등에 의해서 리턴되는 포지션 값이 Point3 데이터이다.

                                                  Point3 데이터의 특이한 점은 Color 데이터 형과 형 변환이 된다는 점이다.

                                                  (color 255 0 0) as point3 [255, 0 ,0]으로 리턴된다.


                                                  - Matrix3 Values ? 중요!

                                                  Matrix3 데이터는 리깅을 하기 위해서 필요한 Script 지식의 정점에 있는 데이터 형이다. 벡터나 Point3 데이터는 공간상의 위치만을 표현하는 데이터지만, Matrix3는 위치, 회전, 스케일을 모두 포함하는 데이터이다.

                                                  • 모든 오브젝트의 위치, 회전, 스케일 정보는 Matrix3에 모두 들어있다.

                                                  • 특정 오브젝트의 트랜스폼(Transform) Matrix3를 곱하면 위치, 회전, 스케일을 변경할 수 있다. 이 때 곱하는 앞 뒤 순서가 중요하다.

                                                  • Matrix3 데이터는 오브젝트 자신의 위치, 회전, 스케일을 표현하는데 사용되기도 하지만, 자기 자신의 각도나 위치 등을 다른 오브젝트에 반영하는데 사용되기도 한다.

                                                  • Matrix 연산법 숙지하기(행렬연산)

                                                  - ​행렬 연산

                                                  • 행렬 표기에서 언제나 행이 첫 번째, 그 다음이 열이다.

                                                  • 게임 프로그래머를 위한 기초수학과 물리에서 제5장 행렬연산을 공부할 것!

                                                     

                                                   


                                                   

                                                     

                                                    9. 쿼터니언과 오일러

                                                     

                                                    쿼터니언과 오일러는 3D 공간에서 물체의 회전 정보를 표시하는 방법이고 서로 장단점을 가지고 있다.

                                                     

                                                    - 오일러

                                                    • 기준 좌표계 

                                                    Script

                                                    기준 좌표계

                                                    바이패드 가능 여부

                                                    읽기

                                                    쓰기

                                                    기타

                                                    $.Position

                                                    World

                                                    X

                                                    O

                                                    O

                                                    $.Pos로 생략 가능

                                                    $.transform.Position

                                                    World

                                                    O

                                                    O

                                                    X

                                                     

                                                    $.tranform.controller.Position

                                                    Local

                                                    X

                                                    O

                                                    O

                                                    사용 권장

                                                    $.Rotation

                                                    World

                                                    X

                                                    O

                                                    O

                                                    값이 뒤집힌다.

                                                    $.transform.Rotation

                                                    World

                                                    O

                                                    O

                                                    X

                                                     

                                                    $.transform.controller.Rotation

                                                    Local

                                                    X

                                                    O

                                                    O

                                                    사용 권장

                                                     

                                                    • 계층구조에 속해 있는 오브젝트를 월드 좌표계 형식으로 회전시켜주는 함수

                                                      Function setWorldEuler obj euler =

                                                      ( var = $B.transform

                                                      $B.transform = (eulerAngles 90 0 0) as matrix3

                                                      $B.pos = var.pos)

                                                      위와 같은 함수를 쓰고 setWorldEuler $B (eulerAngles 90 0 0) 라고 실행하면 계층구조나 이전 방향에 상관없이 월드 좌표계를 기준으로 x축으로 회전된 방향이 된다.


                                                    - 쿼터니언연산과 slerp(Spherical Linear Interpoltion)함수

                                                    쿼터니언은 수학적으로 쉽지 않은 개념이고 관련된 명령어들도 쉽지 않은 것들이 많다. 하지만 리깅을 위해서 쿼터니언과 관련 명령어들을 모두 알고 있을 필요는 없고 몇 가지 필요한 것들만 알고 있으면 된다. 그 중에 가장 핵심적인 명령어가 slerp이다.

                                                    Slerp : 두 개의 쿼터니언 각도의 중간 각도를 계산해주는 명령어이다. 예를 들어서 캐릭터의 팔꿈치나 무릎에 있는 중간 각도의 본을 Script로 제어하기 위해서는 필수적인 명령어이다.

                                                    쿼터니언은 개념적으로 위치 벡터를 이용해서 회전 각도를 표현하는 방식인데 부적절한 쿼터니언 값을 사용해서 slerp 계산을 하게 되면 중간 회전 각도를 계산할 때 가까운 쪽이 아니라 더 먼쪽으로 계산을 하게 된다.

                                                     slerp함수를 제대로 쓰기 위해서는 아래의 함수가 정의 되어야 한다.

                                                    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)

                                                    Quat )

                                                    • 쿼터니언은 길이가 1인 공간 벡터 형태로 회전 방향을 표현하게 되는데 모든 방향을 다 표현하면 반지름이 1인 구 형태가 된다. 그리고 slerp함수는 가상의 최단거리에서 정확하게 중간 위치를 알아내게 된다.

                                                       

                                                       

                                                      10. 함수(Function) 

                                                        - ‘함수? ‘특정 기능을 하는 명령어라고 할 수 있다. 예를 들어 abs라는 함수는 절대값을 계산해 주는 함수인데 abs -5를 실행하면 마이너스가 사라지고 절대값(absolute) 5가 리턴된다.

                                                        함수 예제 코드

                                                        fn Factorial n =(  K = 1

                                                                              for i=1 to n do (K=K*i)

                                                                              return K)

                                                        Factorial 10

                                                        결과값은 3628800


                                                        - Return


                                                        함수’를 종료할 때 사용되는데, 많이 생략되어 사용된다.

                                                        종종 예외 상황에 대한 처리로 사용되기도 한다. 예를 들어 Factorial 8.1 이라든지 심지어는 Factorial “가 나 다” 이런식으로 정수 값이 아닌 다른 데이터 형이 입력되면 Factorial 함수는 비정상적인 상황을 맞이하게 된다. 특히 ‘가나다’가 입력된 경우는 파라미터 ‘가나다’가 for 명령어에서 사용되면서 Script 에러가 발생된다.


                                                        - 함수의 문법과 파라미터(Parameter)


                                                        함수라는 것 자체가 중요하기도 하지만 공식 Max Script 레퍼런스를 보는 방법도 매우 중요하기 때문에 이 문법이 도대체 어떤 뜻인지 하나씩 자세히 살펴보도록 하자.


                                                        The syntax for <function_def></function_def> is:

                                                        [mapped] ( function | fn) <name> </name>{ <parameter> </parameter>} = <expr> </expr>

                                                        in which <name></name> is the name of the function.    

                                                        The optional sequence of <parameter></parameter> can be one of:

                                                        <name></name>
                                                        <name></name>: [<operand>] --keyword parameter with optional default value  

                                                         

                                                          • [mapped] ? 함수의 파라미터에 objects 라든지 배열 등 컬렉션을 적용할 경우 mapped function… 이런 식으로 함수를 정의해서 사용해 줘야 한다. Mapped는 대괄호 ‘[ ]’로 묶여 있는데 대괄호는 선택적(optional)이라는 뜻이다. 그렇기 때문에 mapped 없이 그냥 function 명령어를 사용해도 무방하다. Mapped는 상당히 전문적인 개념이라서 대충의 의미 정도만 파악하고 있어도 된다.

                                                          • <name>- </name>함수 이름을 뜻한다. Script Controller변수편에서 설명된 이름(Names)의 규칙대로 함수의 이름을 만들어야 한다. 대체로 예약어만 조심한다면 크게 문제 되지 않는다.

                                                          • {<parameter></parameter>} ? 중괄호 ‘{ }’로 표기 되었다. Script 문법에서 중괄호로 표기된 내용은 여러 개 중복해서 사용될 수 있다는 뜻이다. 함수의 내용에 따라서 얼마든지 늘어날 수 있고, 없을 수도 있다.

                                                          • ‘=<expr>’</expr>은 실제 함수 내용에 해당된다.

                                                            Fn Factorial n =

                                                            Fn Factorial n:10 =

                                                            Fn Factorial n: =

                                                          • “:” 콜론없이 사용한 방식이 일반적인 방식이고, 순서 방식의 파라미터이다. 두 번째와 세 번째 방식은 콜론(‘ : ’)을 사용함으로써 키워드 방식의 파라미터가 되었다.


                                                        - 변수의 스코프

                                                        변수 마다의 활동 영역을 말한다. 즉, A 영역에서 활동하는 변수와 B 영역에서 활동하는 변수의 이름이 같아도 영역이 다르면 서로 다른 변수로 취급된다는 뜻이다. 상황에 따라 로컬 변수로 선언할지 글로벌 변수로 선언할지 잘 선택해야 한다.

                                                        상위 레벨의 스코프에서 생성된 변수는 하위 레벨의 스코프에서 자동으로 인식이 된다.

                                                        • 스코프의 레벨 ? 새로운 스코프가 생성되는 경우들 

                                                                    1) Sript 파일이나 Listner에서 최상위 레벨(Top-level)의 소괄호 ‘(‘ 열기

                                                                  2) 함수 본체(Function body)가 시작될 때

                                                                  3) For 반복문이 시작될 때

                                                          ​4) 유틸리티(utility), 롤아웃(rollout), 우클릭 메뉴, Macro Script 등이 시작되거나 선언될 때

                                                                  5) When 구문이 시작될 때 

                                                        • Lexical Scoping

                                                          Lexical Scoping은 하위 레벨의 스코프에서 local을 명화하게 명시함으로써 동일한 이름의 변수를 하위 레벨 전용으로 사용할 수 있게 해 주는 기능이다.

                                                        • 알고 있어야할 스코프의 개념 

                                                         1) 함수에서 사용된 변수는 로컬 변수이기 때문에 서로 다른 함수간에 변수 이름이 중복되더라도 상관없다.

                                                                 2) 변수가 최초 사용할 때 가급적이면 앞에 local 키워드를 삽입한다.

                                                                 3) 글로벌 변수는 되도록이면 사용을 자제한다.

                                                          

                                                           

                                                          11. Script Controller는 함수(Function)이다.

                                                           

                                                          -Script Controller는 함수와 거의 비슷한 개념이다. 스코프에 의해서 로컬 변수가 사용되는 점이라든지 최종적으로 리턴되는 방식 역시 함수와 동일하다.

                                                           

                                                          - 자세한 내용은 책과 예제를 참조하자! (443P~447P)