위의 내용을 번역한다.
----------------------------------------------------------------------------
7.2 Camera Math
이전 레슨에서 이야기 했듯이, WebGL에서 카메라는 항상 원점에 위치해 있어서 -Z축을 바라본다. 프로그래머의 일은 이러한 정지해 잇는 카메라 앞에서 scene을 움직이는 변환을 만들어야 한다. 만약 너가 이것이 어떻게 처리되는지 이해한다면 좀 더 창의적인 카메라 작업을 수행할 수 있을 것이다. 이번 레슨은 camera transformation 뒤에 있는 수학을 설명한다. 카메라가 어떻게 정의되는지 알아보자.
A Camera Definition
카메라는 위치와 local 좌표계로 정의된다. 우리는 일반적으로 카메라의 위치를 "eye" position이라고 부른다. 카메라의 local 좌표계는 세 개의 직교하는 축 u, v, n으로 정의된다. 만약 한 카메라가 원점에서 -Z축을 바라보며 위치해 잇다면, 그러면 u는 x축과 일치하고, v는 y축과, n은 z축과 일치한다. 이것은 다음과 같이 요약된다.
u --> x v --> y n --> z
우리는 카메라를 한 개의 global point와 세 개의 vector를 명시하는 12 개의 값으로 명시할 수 있다.
eye = (eye_x, eye_y, eye_z) // the location of the camera u = <ux, uv, uz> // points to the right of the camera v = <vx, vy, vz> // points up from the camera n = <nx, ny, nz> // points backwards; -n is the center of view
u, v, n 벡터들은 상대적인 방향을 정의한다. 왜냐하면 그것들은 eye의 위치와 관련된 한 방향을 가리키고 있기 때문이다.
Moving a Camera to its Default Location and Orientation
카메라 정의가 주어진다면, 만약 우리가 카메라를 global origin으로 옮기고 그 카메라의 축들을 global axes에 정렬시키는 transformation을 만들 수 잇다면, 그러면 우리는 이 transformation을 scene에 있는 모든 model에 적용할 수 있다. 이것은 카메라 앞에 있는 scene을 움직일 것이다.
이 작업은 쉽게 두 개의 별개의 transformation을 사용하여 성취된다.
- 첫 번째, 카메라를 원점으로 움직여라
- 두 번째, 카메라를 카메라의 local 좌표계 축을 global 축에 정렬시키도록 회전해라.
행렬 형식에서, 우리는 다음의 것을 가지게 된다. 거기에서 첫 번 째 연산은 chained transform들의 오른쪽 변에 있는 것이다.
translateToOrigin transform은 만들기 쉽다. 왜냐하면 우리는 eye location을 알기 때문이다. 그 변환은
rotateToAlign transformation은 동등히 간단하다. (우리는 이 변환을 아래에서 만들 것이다.) 그 변환은
그러므로 카메라를 원점으로 움직이고 축을 정렬시키는 transformation은
곱하기 부호를 클릭하여 행렬 수학을 해보아라. 이것은 모든 3D 컴퓨터 그래픽스를 위해 사용되는 표준 Camera transformation 이다. (실제로, 모든 오른손 좌표계 3D 컴퓨터 그래픽스에 대해서만)
Deriving the Rotation Transform
카메라의 축들을 global axes에 정렬시키는 회전 행렬에 대해서 더욱 자세히 봐보자. u 축이 global x축에 대응되고, v 축이 global y축ㄱ에, n 축이 global z축에 대응된다는 것을 기억하자. 도한 어떤 임의의 축에 대한 일반 회전은 transformation matrix 의 왼쪽 상단의 3x3 위치에서 소수값을 요구한다는 것을 기억하자. 그러므로, 그 요구되어지는 회전 행렬은 다음의 세 가지 방정식을 만족해야만 한다.
u -> x 이거나 <ux, uy, uz>는 <1, 0, 0>으로 매핑된다.
v -> y 이거나 <vx, vy, vz>는 <0, 1, 0>으로 매핑된다.
z -> z 이거나 <nx, ny, nz>는 <0, 0, 1>으로 매핑된다.
우리는 모든 세 방정식을 만족시키는 하 나의 transform이 필요하다. 행렬 곱이 작동하는 방식 때문에, 이러한 세 가지 다른 방정식을 이렇게 한 개의 방정식으로 합치는 것이 가능하다.
세 개의 별 개의 방정식에 있는 벡터들이 단일 행렬의 열들이 되었다는 것에 주목해라. rotation matrix를 만들어 내기 위해서, 우리는 그 알려진 행렬의 역행렬을 방정식의 양쪽에 곱할 필요가 있다.
그러고나서
이것은 다음으로 소거된다.
카메라의 로컬 좌표계를 global 좌표계로 일치시키기 위해 필요한 rotation matrix는
수학자들은 한 행렬의 열들이 서로 직교하는 벡터들이라면 그러한 행렬의 역행렬은 그것의 전치행렬과 같다는 것을 입증했다. 우리의 행렬의 열들은 직교한다 왜냐하면 그 열들은 유효한 오른손 좌표계 시스템을 정의하기 때문이다. 오른손 좌표계에서 각 축은 다른 두 개의 축에 대해 직각이다. 그러므로, 그 역행렬은 얻기에 쉽다. 너는 단순히 행과 열을 교환하면 된다.
------------------------------------------------------------------------------------------------
드디어 왜 회전행렬이 이렇게 구성되는지를 이해했다.
대부분의 튜토리얼에서 이렇게 구체적으로 보여주지 않고 단순히 회전행렬이
어떤 형태로 있어야 하는지만 보여준다.
우리는 3D 그래픽스가 Fake 가상이라는 것을 알아야 한다.
우리의 window에서 보여지는 것은 (0,0,0)에서 -z축을 향하여 보여지는 것알 뿐인데,
scene이 카메라에 움직임에 따라 scene이 바뀌는 것일 뿐이다.
따라서, 카메라가 (2,0,3)에 있으면 scene을 (-2, 0,-3) 여기로 먼저 translate 해야한다.
그리고 카메라에서 어떤 target이 있으면 그 target에 대해 forward, right, up을 구하고 그 forward, right, up을 이용하여 global axis에 맞게 회전을 시켜주면 된다.
댓글 없음:
댓글 쓰기