script 제작(특히 expression제작)이나 vfx를 위해서는 수학이 필요성이 절실합니다. 최상위 실력자가 되려면 3d 수학을 필히 학습하세요. 국내에는 도서가 없읍니다. 가르쳐 주는 곳도 없읍니다.
3d 프로그램에서의 3×3 행렬의 의미
3d 프로그램은 공간에서 물체의 방향과 크기를 묘사하기 위해 3×3 행렬을 사용합니다.(단, 3d프로그램은 공간에서 물체의 위치를 묘사하기 위해, 4×4 행렬을 사용합니다.)
아래의 행렬은 3×3 단위 행렬입니다. 이 단위 행렬은 방향과 크기에 어떠한 변화도 발생하지않은 상태를 의미하는 행렬입니다. 이 단위 행렬을 가지고, 물체의방향과 크기 변화를 설명하겠습니다.
위 3×3 단위 행렬을 숫자들의 집합으로 생각하지 말고, 3d 프로그램(maya, xsi, Houdini)의viewport의 가장자리에있는 axis icon으로 일단 간주하세요.
위의 단위 행렬에서 맨 첫 번째 줄(즉, 1 0 0)은 x축을 의미하고, 두번째 줄(즉, 0 1 0)은 y축을 의미하고, 세 번째 줄(즉, 0 0 1)은 z축을 의미한다고 생각하세요. 그러면, 위의 단위 행렬은 아래와 같은 행태로 생각할 수 있습니다.
그래서, x축은 x축을따라서 1 unit의 위치에 있는 지점을 의미하고, y축은y축을 따라서 1 unit의 위치에 있는 지점을 의미하고, z축은 z축을 따라서 1 unit의위치에 있는 지점을 의미한다고 간주할 수 있습니다.
만약 axis icon의 크기가 모든 방향으로 두 배로 크기가 커졌다면, 각각의 축에 따라서 원래 위치의 2배가 되는 위치로 이동시키면 됩니다. 그러면 아래와 같이 작성할 수 있습니다.
아래 비디오 클립은 axis icon을 두 배로 키울 때, 화면의 왼쪽 상단 부분에서, 3×3 행렬의 값이 어떤 식으로 변화하는 지를 보여주고 있읍니다.
지금까지 object의 위치를 묘사하기 위해서 3×3 행렬이 사용되는 방식을설명하였습니다.
다음으로 object의 회전을 묘사하기 위해서, 3×3 행렬이 사용되는 방식을설명하겠습니다.
설명의 용이성을 위해서, 다시 단위 행렬을 가지고 설명하겠습니다. 즉, axis 아이콘을 y축을따라서 반 시계방향으로 회전한 경우를 생각해 보세요. 이 경우, 기존의x축은 –z축 방향을 향하게 되고, 기존의 z축은 +x축방향을 향하게 됩니다.
그러면, 각각의 축은 아래와 같이 변경이 되었다고 생각할 수 있읍니다.
시각화를 위해서 아래 비디오 클립을 삽입하였습니다. Axis icon을y축으로 반 시계방향으로 회전할 때, 화면의 왼쪽 상단 부분에서3×3 행렬의 값이 어떤식으로 변화하는 지를 보여주고 있읍니다.
지금까지는 object가 회전하거나 크기가 변경된 후에 3×3 행렬의 값이 어떤식으로 변경되는 지를 관찰했읍니다. 그러나, 만약 object의 상태를 묘사하는 행렬이 아래와 같은 경우를 생각해 보겠습니다.
위의 행렬을 이 post의 맨 위쪽에서 설명한 3×3 단위 행렬과 비교하여설명하겠습니다. 위 행렬의 맨 첫 번째 줄과 단위 행렬의 맨 첫 번째 줄은 서로 동일하기 때문에, 크기나 방향에 어떠한 변화가 없습니다.
위 행렬의 두 번째 줄과 단위 행렬의 두 번째 줄을 비교하면, 위행렬은 y축 방향이 거꾸로 되어서 아래쪽을 향하게 됩니다.
위 행렬의 세 번째 줄과 단위 행렬의 세 번째 줄을 비교하면, 위행렬은 z축 방향이 거꾸로 된 것을 알 수 있습니다.
위 행렬 상태를 얻을 수 있는 방법에는 2가지 방법들이 있습니다.
한 방법은 scale tool을 사용해, y축 방향과 z축 방향으로 거꾸로 scaling하는 방법입니다.
다른 또 하나의 방법은 x축을 중심으로 180도 회전시키면 됩니다.
이 2가지 방법들 중 어느 하나의 방법을 사용하더라도, 위의 행렬 상태를 얻게 됩니다.
|
SonJoonHyong
2013년 2월 12일 화요일
3×3 행렬 maya scripting
2013년 2월 1일 금요일
nuke 7 한글 메뉴얼(7)
Parameter 값을 animation하기 : 이것은시간이 경과하면서 해당 parameter의 값들이 변화는 것을 의미합니다. 일반적인 3d program에서는 이것을 keyframe한다고 말합니다. Nuke는 3d program처럼, keyframe을 설정함으로써, parameter의 값을 animation시킵니다.
각각의 parameter 오른쪽 끝에 있는 animation button을 클릭하면 아래와 같은 팝업 메뉴가 나타납니다.
이 메뉴를 사용해서, parameter에 keyframe을 설정하나, 기존의 keyframe을제거하거나, 다른 작업을 할 수 있습니다.
Parameter에keyframe을 설정하는 순서
1. Keyframe을 설정하길 원하는 frame으로 이동합니다.
2. Parameter의 값을 변경합니다.
3. Parameter의 오른쪽 끝에 있는 animation button을 클릭합니다.
4. 나타난 팝업 메뉴에서 Set Key를 선택합니다.
이때, 해당 parameter의 입력란은 파란색으로 변경됩니다. 그러므로, parameter의 입력란이 파란색으로 표시되는 해당parameter는 keyframe에 의해 animation되어 있다고 판단하면 됩니다. 이 때부터, nuke는 autokey mode로 전환됩니다. 일반적으로parameter의 값을 변경한 후, 해당 frame에 대한 keyframe을설정하는 작업을 하지만, autokey mode에서는 parameter의값만 변경하면 해당 frame에 자동적으로keyframe이설정되는 mode입니다.
특정parameter에 대해서만 keyframe을 설정하려면, 지금까지 설명한 방법을 사용하면 됩니다. 그러나, 해당 node에 있는 모든 parameter들에대해서 keyframe을 설정하려면, 해당 node의 properties panel 위에서 마우스 오른쪽 버튼을누르면 나타나는 팝업 메뉴에서 Set key on all knobs를 선택합니다.
* nuke에서 knob라는 용어가 생소할 수 있읍니다. knob란 parameter를 의미하는 용어입니다.
5. Keyframe을 설정할 frame으로 이동합니다.
6. Parameter의 값을 변경합니다(입력란에 직접 값을 입력하거나, slider를 사용해서). Nuke는 keyframe이 맨 처음에 추가될 때, 자동적으로 autokey mode로 전환되기 때문에, parameter의 값을 변경하면, 해당 frame에 자동적으로 keyframe이 설정됩니다.
7. 위의 5-6번 과정을 반복하여, 원하는 만큼의 keyframe을 설정합니다.
Parameter에설정되어 있는 keyframe들 중에서 단 하나의 keyframe만을제거하는 순서
1. 제거하길 원하는 keyframe이 설정되어 있는frame으로 이동합니다.
참고) keyframe이 설정된 frame은 timeline에서 파란색으로 표시됩니다.
2. Parameter의 오른쪽 끝에 있는 animation button을 클릭하면 나타나는 팝업 메뉴에서deletekey 메뉴를 선택합니다.
Parameter에설정되어 있는 모든 keyframe들을 제거하는 순서
1. Parameter의 오른쪽 끝에 있는 animation button을 클릭하면 나타나는 팝업 메뉴에서Noanimation을 클릭합니다.
Expression을 사용해 서로 다른 node(또는 동일 node)에 있는 서로 다른 parameter들을 서로 연결시켜, 하나의 parameter 값이 다른 parameter의 값을 변경시킬 수 있게 만들 수 있습니다. 그러나, 만약 parameter의 animation button을 클릭할 때, Link to라는 메뉴가 있는 경우,수동으로 직접 expression을 작성하지 않고도 서로 다른 parameter들을 연결시킬 수 있습니다.
아래의 순서는 RotoPaint node의 translate parameter를 tracker node의 특정 값과 연결시킴으로써, RotoPaint node의 translate parameter 값을 tracker node의 연결된 특정 값에 연관되도록 만드는 방법입니다.
1. RotoPaint node와 연결시킬 Tracker node를 만듭니다.
2. RotoPaint node의 properties panel에 있는 Transform tab 안의 translate parameter의 오른쪽 끝에 있는 animation button을 클릭합니다.
3. 나타난 팝업 메뉴에 있는 Link to > Tracker linking dialog를 선택합니다.
4. 나타난 창에서, tracker node 부분은 1번 과정에서 생성한 Tracker node를 선택하고, link to 부분은 바로 위의 tracker node 부분에서 선택한 Tracker node의 어떠한 속성과 연결할지를 지정하는 부분입니다. 이 부분을 설정한 후, Ok 버튼을 누릅니다.
|
2013년 1월 27일 일요일
랜더맨
text editor를 사용해 아래의 내용물을 작성 후, basic.rib 파일명으로 저장합니다.
#basic.rib - a minimal scene
Projection "perspective"
Display "min.tiff" "file" "rgba"
WorldBegin
Translate 0 0 5 Sphere 1 -1 1 360 WorldEnd
3Delight의 rendering 프로그램인 renderdl.exe를 사용해 해당 basic.rib를 rendering합니다
C:\>c:\util\3Delight\bin\renderdl.exe c:\work\basic.rib
결과 이미지
sphere가 흰색입니다. 이제, basic.rib 파일의 내용을 아래와 같이 수정하여 basic1.rib로 저장한 후 renderdl.exe로 rendering하여 sphere를 빨간색으로 rendering되도록 만들어보세요.
#basic1.rib - a minimal scene
Projection "perspective"
Display "" "framebuffer" "rgba"
WorldBegin
Translate 0 0 5 Color 1 0 0 Sphere 1 -1 1 360 WorldEnd |
ib 구문-(1) renderman
2013/01/12 19:01
|
앞의 테스트 샷에서 사용된 rib 파일의 내용물을 검토해 보겠읍니다.
#basic1.rib - a minimal scene
Projection "perspective"
Display "min.tiff" "file" "rgba"
Display "min.tiff" "file" "rgba"
WorldBegin
Translate 0 0 5
Color 1 0 0
Sphere 1 -1 1 360
WorldEnd
Translate 0 0 5
Color 1 0 0
Sphere 1 -1 1 360
WorldEnd
위의 코드에서
#로 시작되는 한 줄은 주석문으로써, renderer에서 해당 rib 파일을 rendering할 때, 무시되는 부분입니다.
Display "min.tiff" "file" "rgba" 는 rgba channel정보를 가진 min.tiff라는 이름의 파일을 생성합니다. 파일을 생성하지 않고, 모니터 화면으로만 rendering하려면, file 대신에 framebuffer를 사용하면 됩니다.
즉, Display "" "framebuffer" "rgba"
Projection 명령어는 어떠한 원근을 사용해서 rendering할 지를 지정하는 명령어입니다. 위의 코드에서의 Projection "perspective" 코드는 perspective projection을 사용해서 rendering하라는 것을 나타냅니다.
worldBegin 명령어와 worldEnd 명령어 사이에 renderer가 rendering할 작업을 지정하면 됩니다. 즉, worldBegin 명령어 전에 사용된 Projection 명령어와 Display 명령어는 renderer를 설정하는 명령어들입니다
rib 구문 -(2) renderman
2013/01/12 19:54
|
예제 구문
#구문 설명용 테스트 shot
Display "" "framebuffer" "rgba"
Projection "perspective"
WorldBegin
Translate 0 0 2
Translate -1 0 0
Sphere 1 -1 1 360
WorldEnd
Display "" "framebuffer" "rgba"
Projection "perspective"
WorldBegin
Translate 0 0 2
Translate -1 0 0
Sphere 1 -1 1 360
WorldEnd
위의 구문에서 이번에 설명할 명령어는 WorldBegin과 WorldEnd 명령어 사이에 있는 Translate 명령어입니다.
Translate 명령어는 transform 명령어들 중 하나입니다. transform 명령어들은 이 명령어 다음에 만들어진 모든 물체들에 가해지기 때문에 어떠한 물체를 만들기 전에 그 물체의 위치를 지정하는 transform 명령어를 먼저 사용해야 합니다.
위의 코드에서 Translate 0 0 2 과 Translate -1 0 0은 뒤에 나타나는 Sphere 명령어에 의해 만들어진 sphere를 뒤쪽으로 2unit 이동시키고 왼쪽으로 1unit만큼 왼쪽으로 이동시킵니다.
결과물)
예제 구문
#구문 설명용 테스트 shot
Display "" "framebuffer" "rgba"
Projection "perspective"
WorldBegin
Translate 0 0 2 ---- 1줄
Translate -1 0 0 ---- 2줄
Sphere 1 -1 1 360 --- - 3줄
Translate 1 0 0 ---- 4줄
Sphere 1 -1 1 360 ---- 5줄
WorldEnd
Display "" "framebuffer" "rgba"
Projection "perspective"
WorldBegin
Translate 0 0 2 ---- 1줄
Translate -1 0 0 ---- 2줄
Sphere 1 -1 1 360 --- - 3줄
Translate 1 0 0 ---- 4줄
Sphere 1 -1 1 360 ---- 5줄
WorldEnd
위의 구문에서 설명할 명령어는 Translate 명령어입니다. Translate명령어는 transform 명령어들 중 하나입니다. transform 명령어 이후에 만들어진 모든 물체들에 전부 가해집니다. 그래서,
1번 줄에 있는 Translate 명령어는 3번 줄에서 만들어진 Sphere와 5번 줄에서 만들어진 Sphere 둘 다를 뒤쪽으로 2 unit이동시킵니다. 2번 줄에 있는 Translate 명령어는 3번 줄에서 만들어진 Sphere와 5번 줄에서 만들어진 Sphere 둘 다를 왼쪽으로 1 unit이동시킵니다.
4번 줄에 있는 Translate 명령어는 5번 줄에서 만들어진 sphere에게만 영향을 미칩니다.
결론적으로 3번 줄에 만들어진 sphere는 1번 줄과 2번 줄에 있는 Translate 명령어들에 의해 영향을 받아서 뒤쪽으로 2unit 이동하고 왼쪽으로 1 unit이동하게 됩니다.
그러나, 5번 줄에 만들어진 sphere는 4번 줄에 있는 1번 줄과 2번 줄, 그리고 4번 줄에 있는 3개의 Translate 명령어들에 의해 영향을 받아서, 맨 처음 만들어진 위치에서 뒤쪽으로 2unit 이동합니다.
결과물)
rib 구문 - (3) renderman
2013/01/15 08:37
|
이번에는 TransformBegin 명령어와 TransformEnd 명령어에 대해서 설명하겠습니다.
바로 전의 코드에서
#구문 설명용 테스트 shot
Display """framebuffer" "rgba"
Projection "perspective"
WorldBegin
Translate 0 0 2
Translate -1 0 0 ---1
Sphere 1 -1 1 360 ---2
Translate 1 0 0 ---3
Sphere 1 -1 1 360 ---4
WorldEnd
결과물)
맨 처음에 만들어진 Sphere를 재위치시키기 위해서 ---1 줄의 코드를 Translate -1.5 0 0 로 변경하면아래 그림과 같이 두 번째 만들어지는 Sphere로 재위치하게 됩니다.
#구문 설명용 테스트 shot
Display """framebuffer" "rgba"
Projection "perspective"
WorldBegin
Translate 0 0 2
Translate -1.5 0 0
Sphere 1 -1 1 360
Translate 1 0 0
Sphere 1 -1 1 360
WorldEnd
결과물)
이 경우, 두 번째 Sphere를원래의 위치 그대로 두려면, 3번 줄의 Translate 1 0 0을Translate 1.5 0 0로 변경하여야 합니다.
#구문 설명용 테스트 shot
Display """framebuffer" "rgba"
Projection "perspective"
WorldBegin
Translate 0 0 2
Translate-1.5 0 0
Sphere 1 -1 1 360
Translate 1.5 0 0
Sphere 1 -1 1 360
WorldEnd
결과물)
이러한 경우, TransformBegin 명령어와 TransformEnd 명령어를 사용합니다.
TransformBegin 명령어와 TransformEnd 명령어 사이에 transform 종류의 명령어와object 명령어를 사용합니다.
TransformBegin 명령어는 이 명령어 바로 전까지의 모든transformation들을 기억하고 있습니다.
TransformEnd 명령어는 이 명령어가 사용되기 바로 전의 transformation 상태로 되돌아 갑니다.
아래의 코드를 가진 rib 파일을 만들어 이미지를 만들어 보세요.
#구문 설명용 테스트 shot
Display """framebuffer" "rgba"
Projection "perspective"
WorldBegin
Translate 0 0 2
TransformBegin
Translate -1 0 0
Sphere 1 -1 1 360
TransformEnd
TransfomBegin
Translate 1 0 0
Sphere 1 -1 1 360
WorldEnd
위의 코드는 맨 첫 번째 Sphere에 Translate 0 0 2와 Translate -1 0 0 2개의명령어를 가하게 됩니다 결과적으로 뒤쪽으로 2 unit 이동하고 왼쪽으로 1 unit 이동시키게 됩니다.
두 번째 Sphere는 Translate0 0 2와 Translate 1 0 0 2개의 명령어들을 가해져서, 결과적으로 뒤쪽으로 2 unit 이동하고 오른쪽으로 1 unit 이동하게 됩니다.
즉, TransformBegin 명령어와 TransformEnd 명령어는 특정 물체만을 이동시킬 경우 사용됩니다.
결과물)
[출처] rib 구문 - (3)|작성자 excentri
TransformBegin 명령어와 TransformEnd 명령어 사이에, 다른 또 하나의 TransformBegin 명령어와 TransformEnd 명령어가 사용된 경우를 살펴 보겠습니다.
#구문 설명용 테스트 shot
Display "" "framebuffer" "rgba"
Projection "perspective"
WorldBegin
#모든 object들을 뒤쪽으로 3 unit만큼 이동시킵니다.
Translate 0 0 3
#머리에 해당하는 sphere를 만듭니다.
Sphere 1 -1 1 360 //-------------1
TransformBegin
Translate 0 1.3 0
TransformBegin
Translate -0.75 0 0
Scale 0.5 0.5 0.5
Sphere 1 -1 1 360 //------------2
TransformEnd
TransformBegin
Translate 0.75 0 0
Scale 0.5 0.5 0.3
Sphere 1 -1 1 360 //------------3
TransformEnd
TransformEnd
WorldEnd
위의 구문에서 1번에서 만든 sphere는 z축으로 3 unit만 이동한 상태가 됩니다.
2번 sphere는 Translate 0 0 3과 Translate 0 1.3 0과 Translate -0.75 0 0 의 명령어들이 가해져서 결과적으로 z축으로 3 unit이동하고 y축으로 1.3 unit이동하고 x축으로 -0.75 unit 이동하게 됩니다. 그런 후, Scale 0.5 0.5 0.5 명령어가 가해져 원래의 반의 크기가 됩니다.
3번 Sphere는 Translate 0 0 3과 Translate 0 1.3 0과 Translate 0.75 0 0 의 명령어들이 가해져서 결과적으로 z축으로 3 unit 이동하고 y축으로 1.3 unit이동하고 x축으로 0.75 unit 이동하게 됩니다.
그런 후, Scale 0.5 0.5 0.5 명령어가 가해져 원래의 반 크기가 됩니다.
결과물)
|
.
피드 구독하기:
글 (Atom)