카테고리 없음

유니티로 수학배우기_좌표변환

zelkova 2021. 5. 25. 10:00

<목차로 돌아가기>

 

 

좌표변환(coordinate transformation)?

서로 다른 좌표사이에서 좌표를 변환하는 작업의 총칭.

행렬과 벡터를 곱해 그 결과로서 새로운 벡터로 변환하는 조작과 같다.

 

좌표변환은 3D 컴퓨터 그래픽스의 기초가 되는원리이다. 2D게임이라도 직교 좌표와는 다른 좌표계가 사용되거나, 일정한 법칙에 기초해 변형을 구현할 경우에는 좌표변환으로대응한다. 이외에도 로봇을 제어하는 등의  서로 다른 좌표계를 가진 복수의 요소를 제어할때 사용한다.

 

폴리곤의 형상을 나타내는 정점 데이터를 가리켜 수하의 기하학에서 따온 단어인 지오메트리라 부르는데, 이와 같은 폴리콘으로 만들어진 캐릭터를 3D 공간 내에 표시하려고 할 때 GPU에서 방대한 양의 좌표변환이 이루어진다.

 

일정한 규칙에 기초한 일련의 그리기 공정을 그래픽스 랜더링 파이프라인(graphics rendering pipeline)이라 한다.

이 공정은 보통 모델변환 -> 뷰 변환 -> 프로젝션 변환으로 동작한다.

 

모델 변환

공간의 로컬 좌표상의 좌표로부터 월드 좌표계상의 좌표로 변화하는 것이 모델 변환이다. 월드 좌표로 변환하므로 월드 변환이라고도 한다.

 

출처 : https://blog.goldface.kr/9

 

모델 각각의 로컬 좌표계는 원점의 위치가 월드 좌표계의 원점과 다를 수 있다. 로컬좌표계의 좌표축이 월드 좌표계의 좌표축과 다른 방향을 향할수도 있고, 로컬 좌표계의 길이 단위가 월드 좌표계의 길이단위와 다를 수도 있따.

 

이러한 좌표계의 차이를 해소하기 위해서 모델변환을 한다. 모델변환은 세가지의 변환요소로 구성된다.

- 평행이동.

- 회전(rotation)

- 스케일(scale)

 

 

유니티의 값을 보면

locaPosition, localRotation, localScale 프로퍼티로 접근할 수 있다.

이들의 월드 좌표계는 position, rotation, lossyScale프로퍼티로 접근할 수 있다.

 

최종적인 모델 변환 행렬 자체도 transform.localToWorldMatrix로 가져올 수 잇다.

GPU쪽에 넘겨지는 모델 변환행렬은 Render.localToWorldMatrix를 통해 가져올 수 있다.\

 

뷰 변환

모델 변환-> 월드 변환이 끝난 후 뷰 변환이 이루어진다.

카메라 공간을 가리켜 뷰 공간이라고 부르는데 월드 좌표계로 구성되는 월드공간에서는 게임 씬 안에 자의적으로놓인 부동의 원점 주위에 좌표계를 두었지만, 게임의 3D공간을 사용자가 실제로 표시할 때는 시점이 동적으로 변할 수 있다.

월드 공간 좌표에서 카메라를 중심으로 카메라 공간좌표로 변환해주어야 한다. 

출처 : https://blog.goldface.kr/9

카메라를 나타내는 Camera 클래스 자체도 월드 공간으로서의 씬 내에 존재하는 한 게임 오브젝트에 추가되고 월드 공간에서 Transform 프로퍼티를 가진다.

 

유니티에서 카메라가 사용하는 뷰 변환 행렬은 Camera 클래스의 WorldtToCameraMatrix로 가져올 수 잇다.

 

프로젝션 변환

뷰 좌표계 -> 프로젝션 변환

프로젝션이란 투영을 말하며 투영 변환이라고 한다.

위의 과정을 통하여 클립공간으로 바뀌는데 클립 공간은 뷰 좌표계중 일부를 클립하는(잘라내서 불필요한 부분을 제거하는) 역할을 한다.

이 때 잘라버리는 부분은 카메라에서 보이지 않는 부분이다.

뷰 공간 상태라면 월드 공간에서 시점만 변환한 것이므로 그 상태로는 카메라 뒤쪽과 카메라에서 너무 멀어서 비치지 않는 부분 그리고 반대로 지나치게 가까운 부분의 오브젝트가 공간에 포함된다.

 

이 때 카메라에서 보이지 않는 부분을 삭제한 육면체 영역을 뷰 프러스텀(시야 절두체, view frustum)이라 한다.

 

시야 바깥쪽의 정점 정보를 버리고, 뷰 프러스텀을 정규 뷰 볼륨(canonical view volume)이라 하는, 각 정점 좌표가 정규화된 정육면체로 변환하는것이 바로 프로젝션 변환이다.

 

뷰 프러스텀 중 카메라에 가까운 쪽 평면을 근평면, 먼 쪽 평면을 원평면이라 한다. 카메라의 회각/시야각(field of view, FOV) 이 크면 클수록  근 평면과 원평면의 크기 비율 측면에서는 원평면이 더 커진다.

 

뷰 프러스텀을 무리하게 정육면체 모양으로 만든다면 정규 뷰 볼륨에서는 원평면에 가까워지면 가까워질수록 오브젝트의 응축도가 높아진다.

 

반대로 근평면에 가까워 질수록 비율적으로는 커진다.

 

멀리 이는 것일수록 작게 보이는, 일반적으로 3D다운 원근법 효과가 시뮬레이트 된다.

이런 프로젝션 변환방법을 원근투영이라고한다.

 

Camera의 Projection을 Perspective로 한 경우, Field of view는 수직 방향 화각, Clipping Planes는 근 편명과 원평면 각각의 시점으로 부터의 거리를 나타낸다. 

 

프러스텀 컬링 : 뷰 프러스텀 바같쪽의 오브젝트를 그릴 대상에서 제거하여 부하는 줄이는 방법

 

Camera 클래스의 layerCullDistances에 원평면의 거리와 다른 값을 제거 대상의 거리로 삼는 레이어를 설정해가능하고 

작어서 눈에 띄지 않는 오브젝트에 해당 레이어를 설정하여 제거하는 식으로 최적화가능

 

오클루전 컬링 : 프러스텀 컬링은 시야 밖의 오브젝트를 생략하지만 화면 내 오브젝트트에서 불필요한 겹쳐진 부분의 그리기 처리를 생략할 수 없다. 하지만 오클루전 컬링은 가능

 

겹쳐서 그려지는 부분은 유니티의 씬뷰에서 Overdraw 를 선택해서 볼 수 있따.

겹쳐진 부분은 밝게 표시된다.

 

 

Camera 컴포넌트의 Projection에는 Perspective 이외에 Orthographic도 지정할 수 있다. 

Orthographic은 직교투영에 의한 프로젝션 변환이다.

 

 

직교투영의 뷰 프로스텀은 직육면체 모양으로 근평면과 원평면의 크기에 차이가 없다.

요컨데 원근법의 효과는 나타나지 않고 시야각도 없다.

Orthographic을 선택하면 fieldOfView 프로퍼티가 무시되고 orthographicSize프로퍼티로서 직육면체의 수직방향으로 세로 절반의 크기를 지정할 수 있다

 

 

동차좌표계

3D에서는 기본적으로 3차원 좌표계지만 어떤 목적으로 4차원으로 확장이 가능합니다.

한 차원의 좌표를 추가한 좌표(n+1)로 표현하는것을 동차좌표계라고 합니다.

ex) (x,y,z,w)

설명글

 

 

일반적은 직교좌표계를 유클리드 기하학에서 사용한다면 동차 좌표계는 사영기하학 분야에서 사용하는 좌표계로 19세기에 뫼비우스가 발견했다.

사영기하학에서는 유클리드 기하학과 달리 평행선은 무한원점에서 교차한다고 생각한다. 투영 공간은 유클리드 공간에 무한원점에서 교차한다고 생각한다. 투영 공간은 유클리드 공간에 무한원점 집합을 추가한 공간이다.

 

무한원점은 직사광으로도 이용된다. 동차 좌표로 나타냈을 때 일반적인 점광원은 (x,y,z,1)에 위치하지만 직사광은 무한원점인 (x,y,z,0)에서 씬에 내리쪼는 빛으로 생각하므로 광원의 좌표의 네 번째 성분이 0인지 아닌지 조사하면 직사광인지 점광원인지 알 수 있따.

 

클립 좌표계는 동차좌표계의 4차원 벡터로서 표현되므로, 이를 좌표변환으로 생성하기 위한 행렬은 4x4행렬이어야 한다.

따라서 변환할 좌표는 처음부터 동차좌표계의 4차원 벡터로 표현해두는 것이 좋다.

 

유니티 에서는 UnityEngine -> Matrix4x4의 정의 안에 MultiplyPoint를 찾아도 된다.

public vector3 MultiplyPoint(Vector3 v)
{
   Vector3 result;
   result.x = this.m00 * v.x + this.m01 * v.y + this.m02 * v.z + this.m03;
   result.y = this.m10 * v.x + this.m11 * v.y + this.m12 * v.z + this.m13;
   result.z = this.m20 * v.x + this.m21 * v.y + this.m22 * v.z + this.m23;
   float num = this.m30 * .x + this.m31 * v.y + this.m32 * v.z + this.m33;
   num = 1/ num;
   result.x *= num;
   result y *= num;
   result z *= num;
   return result;
}

 

 

변환종류

▷ 선형 변환

두 개의 집합 V와 W가 있을 때, V의 임의의 요소 v에 W의 요소 w를 단 하나 대응시키는 규칙적인 대응관계f가 있으면, f를 V에서 W로의 사상(map)이라고 하고 다음처럼 나타낸다.

f : V -> W

 

사상 중에서도 다음처럼 자기 자신에게 사상하는 것을 변환이라고 한다.

f : V -> V

 

변환f가 선형 변환이려면, 임의의 백터 u, v와 스칼라 n에 관해 다음과 같은 성질을 ㅁ나족해야 ㅎ나다.

f(u+v) = f(u) + f(v)

f(nv) = nf(v)

또한, 영벡터 0에 대해서는 다음처럼 f(0) = 0이다.

f(0) = f(0+0) = f(0) + f(0)

여기에서 다음과 같은 선형 변환의 특징을 알 수 있다.

- 직선은 변환해도 직선이다.

- 변수 정점간의 상대적인 거리의비율은 변화하지 않는다.

- 서로 평행인 직선은 변환해도 평행이다.

- 영벡터는 변환해도 영벡터다.

 

▷  벡터와 정방행렬의 곱은 다음처럼 나타낼 수 있다.

(u + v ) M  = uM + vM

따라서

f(u+v)= f(u)+f(v)

또한 (nv)M= n(vM)은 곧 f(nv) = nf(v)와 같으므로, 벡터와 정방행렬의 곱은 선형 변환이라고 할 수 있다.

또한 선형변환의 행렬은 M은 가역행렬로, 서로의곱은 단위행렬 I가 된다.

여기서, 모델 변환을 할 때 구성요소로서 나타낸 변환이 선형 변환에 들어맞는지 살펴보자

- 평행이동

- 회전

- 스케일

 

평행이동은 좌표축을 따라 x방향으로 얼마, y방향으로 얼마 , z방향으로 얼마를 이동시키는 변환이다.

회전은 회전축을 정하고, 축의 주변을 특정각도로 도는 변환이다. 스케일은 어떤 스칼라를 곱으로 성분을 스칼래배 하는 변환이다.

 

▷ 아핀변환

선형 변환만으로는 평행이동을 표현할 수 없으므로, 평행이동도 ㅎ마께 표현하기 위해 아핀변환이라는 개념이 도입됬다.

아핀 변환 a는 선형 변환 f와 벡터 u,v를 이용해 다음과 같이 나타낸다.

a(v) = f(v) + u

벡터 u가 있으므로 영벡터의 평행이동 결과가 반드시 영벡터여야만 할 필연성은 없다. 그 밖의 선형 변환의 특징은 두 아핀 변환에 합성되어 포함된다. 따라서 모델 변환에 필요한 다음 3가지 변호나은 아핀 변환으로 다 표현할 수 있다.

- 평행이동

- 회전

- 스케일

 

또한 게임에서는 그다지 등장하지 않지만, 직사각형을 평행사변형으로 하는 진단(shear)이라는 편환도 아핀 변환에 속한다.

 

▷ 리지드바디 변환

아핀 변환에서 스케일을 제외한 변환(요컨대 회전과 평행이동)은 유클리드변환, 등거리변환, 또는 리지드바디 변환이라고 한다.

 

▷ 투영변환

원근 투영변환을 생각해보면, 가까이 있는 것은 크게 보이고 멀리 있는 것은 작게 보이므로, 본래 평행인 도로의 폭이 멀어질수록 좁아지는 것처럼 변환된다. 다시 말해 평행인 직선이 변환 후에는 평행이 아니다. 따라서 원근 투영 변환은 아핀 변환의 요건을 만족하지 못하므로 아핀변환이 아니다.

 

원근 투영변환은 투영변환이라는 변환에 속한다. 투영변환은 아핀 공간을 포함하는, 더 넓은 공간인 투영 공간 내의 변환으로 이미 설명한 거섳럼 동차좌표계를 도입하여 표한할 수 있다. 또한 아핀 변환은 투영 변환의 일부이다.

 

투영변환은 기하학적으로는 동일 선상의 네 개의 점 ABCD간의 선분으로 복비 또는 교차비라는 비율이, 변환후에도 변화하지 않는 변환으로 정의된다

 

대체로 선부느이 비율과 각도가 보존되지 않는 아핀 변환보다 더욱 조건이 완화된 변환이 바로 투영변환이다.

 

 

좌표변환의 행렬 표현

1. 평행이동

아래의 행렬이 있다고 생각할 때

좌표축으로 이동하는 방법은 4x1 행렬을 더하면 될 것이다.

하지만 유니티에서는 조합해 다룰 수 있는 장점이 있기 때문에 곱셈으로 변환한다.

 

요컨데, v의 각 성분에 백터의 성분을 더한 4X4행렬 T를 원하는 것이다.

행렬의 덧셈이라면 4x1 행렬을 더해야 하지만, 곱셈이라면 다른 곱셈으로 표현할 수 있는 변환과 조합해 다룰 수 있다는 장점이 있다.

 

4x1에서 4x4행렬로 표현하려면 어떻게 해야할가?

우선 결과벡터x 성분은 T의 1행째와 v의 내적이므로, 1을 1행 1열에 넣으면 된다.

y성분에 결과벡터 y

z성분에 결과벡터 z

w성분에 1을 넣으면 행렬이 표현된다.

여기에 결과벡터에 T행렬을 더하려면 아래와 같이 나타낼 수 있다.

따라서, 평행이동의 좌표변환을 나타내는 행렬 T는 다음과 같이 나타낼 수 있다.

이처럼 평행이동을 하려면 3x3행렬로는 부족하고 동차좌표를 이용해서 벡터를 4차원으로 확장한 후에 4x4행렬과 곱한다.

 

유니티에서는 좌표변환을 게산할 것까지도 없이, Transform의 translate 메서드를 사용하면 오브젝트를 평행이동시킬 수 있다.

 

2. 회전

회전은 다음과 같이 2가지 변수로 규정된다.

 - 어느 축을 회전할 것인가.

 - 회전 각도는 어느 정도인가

 

우선은 z축을 회전하는 것으로 하고 회전 각도에 따라 변환 전과 변환 후의 벡터가 어떻게 되어야 하는지 생각해보자.

 

 

원점에서의 거리가 r인 점P를 z축 둘레로  Θ만큼 회전시켜 P'의 위치로 움직이는 조작을 생각해 볼 때 P의 좌표는 (r cos(a), rsin(a), 0)이다. 마찬가지로 점 P'의 좌표는 (r cos(a+Θ), r sin(a+Θ),0)이 된다.

덧셈정리를 활용하면..

행렬을 이용해서 표현하면.

 Rz는 다음처럼된다.

 

x축의 회전결과

y축의 회전결과

즉 Vx, Vy, Vz가 차례대로 순회한다.

x,y,z 축에서 회전 이동을 위한 행렬을 정리하면 다음과 같다.

회전행렬의 경우 4행째와 4열째는 항상 같으므로, 실제로는 3x3행렬로 충분하다.

각 열은 회전 이전 좌표축에서 회전 이후 좌표를 나타낸다.

각 행은 회전 이후 좌표축에서 회전 이전 좌표를 나타낸다.

 

회전행렬 R은 특수직교행렬이다.

어느 행과 열을 벡터를 추출해도 벡터의 크기는 1이 된다.

|R| = 1도 성립한다.

 

회전 행렬을 직교행렬이므로 단순히 전치하면 변환을 나타내는 역행렬을 얻을 수 있다. 

 

경합이 성립하므로 행렬의 곱셈을 이용하는 좌표 변환의 경우 역행렬은 본래 변환을 없애는 역변환으로 기능한다.

 

 

3. 스케일

대상 벡터의 각 성분에 배율을 곱해주기만 하면 된다.

3x3 행렬에서 행렬식은 각 행 또는 각 열을 각 변으로 하는 평행육면체의 체적과 같았다.

따라서, 원점을 지나는 정규화된 단위벡터인 기저벡터를 길이 1인 각 변으로 가지는 정육면체를 나타내는 벡터(1,1,1)에 이 스케일 변환 행렬 S를 서로 곱하면, 원점과 결가의 벡터로 구성되는 평행육면체의 체적은 S의 행렬식의 값과 같다.

 

|A||B| = |AB|

그 행렬은 리지드바디 변환만을 포함하는 행렬임을 알 수 있다.

 

각 행또는 각 열의 벡터가 선형 종속이고 체적이 0인 평면이 되어버리므로, 3차원 입체에서 2차원 평면도로 변환하는 특정 투영 변환이 변환 행렬에 포함되어 있음을 의미한다. 그러한 변환 행렬은 각 행 또는 각 열 벡터 중 선현 독립인 것의 수를 나타내는 계수가 2 이하가 된다.

 

행렬식이 -1이라면 그 변환은 반사 변환(Reflection)으로, 왼쪽 좌표계에서 오른손 좌표계, 오른손 좌표겡서 왼손 좌표계로, z축을 반대로 하는 효과가 있다.

 

행렬 A, B와 단위행렬 I에 관해 행렬식은 다음과 같은 성질이 있다.

| A | | B | = |AB|

|I| = 1

 

따라서, 변한행렬 M이 역행렬을 가지는 경우는 아래와 같다.

4. 모델변환

이동, 회전, 스케일을 행렬로 표현할 수 있게 되었으므로, 이들 세가지를 이용하여 모델 변환 행렬을 구성할 수 있다.

 

로컬 좌표계상의 위치 벡터 v에 대해 스케일 S, 회전 R, 평행이동 T의 각 좌표 변환을 차례대로 적용해서 월드 좌표계의 위치 벡터 v`를 얻고자 한다면 다음과 같은 행렬 계산을 하게된다.

결합법칙을 이용하면 아래와 같이 변환 가능하다.

 

즉, 미리TRS를 계산 모델 변환 행렬 M = TRS가 있으면 M을 곱하여 모델 공간에 속한 대량의 정점 정보에 똑같이 모델변환을 저용할 수 있다는 것이다.

 

모델변환을 포함한 지오메트리 파이프라인 스테이지에도 사용 가능하다.

모델 변환 행렬 M, 뷰 변환 행렬V, 프로젝션 변환 행렬 P가 있을 때 다음처럼 나타낼 수 있다.

지오메트리 파이프라인 전체의 좌표 변환 행렬은 PVM이라는 세 개의 행렬의 곱으로 구할 수 잇는 하나의 행렬이 된다.

셰이더 언어 Cg에서는 ShaderLab의 내장 변수 UNITY_MATRIX_MVP로서, 혹은 다른 셰이더언어 GLSL에서는 gl_ModelViewProjectionMatrix로 참조할 수 있다. 

 

 

5. 기저변환

모델 변환행렬을 정리하면 아래와 같다.

이 변환된 분해해서 추출할 수 있을가?

평행이동은 합성되어 하나의 행렬로 정리된 후에도 추출하기 쉽다. 

4열째의 위에서부터 세개의 요소가 평행이동의 요소이다.

이 부분은 다른 아핀 변환의 영향을 받지 않으므로 행렬의 곱셈을 일일이 하지 않고, 직접 모델 변환 행렬의 해당 요소에 값을 넣기만 하면 평행이동을 추가할 수 있다.

 

스케일은 행렬 M안의 벡터에 주목하면 그 크기를 계산할 수 있다.

여기서, 회전행렬은 특수지교행렬이므로

따라서 다음과 같다.

이처럼 평행이동과 스케일이 구해지면 행렬 M에서 그들을 제거한 회전행렬R을 구할 수 있다.

 

모델변환 행렬은 결국 기저변환을 하는 것이다. 

기전 변환은 좌표의 변환이고, 좌표계의 변환이기도 한다.

 

월드 좌표계 쪽에서 보면, 어던 모델 좌표계의 기저벡터를 월드 좌표계로 나타낸 벡터를 알고 싶을 때, 모델 변환 행렬의 열ㅇ르 가져오기만 하면된다.

모델 변홚은 각각의 모델에 따라 달라지는 상대적인 변환으로, 모델별로 모델변환 행렬이 있다. 

 

따라서 모델을 제작할 때 모델 좌표어딘가의 축 쪽을 향하도록 결정하고 만들면, 모델변환 행렬을 참조하기만 해도 월드 공간 내에서의 모델의 방향을 알 수 있어 도움이 도니다.

 

정리하자면

모델 좌표게에서 보면 : 월드 좌표계의 기저벡터

월드 좌표계에서 보면 : 모델 좌표계의 기저벡터

 

 

6. 뷰변환

월드 좌표계의 좌표축을 카메라의 좌표축으로 이동하는 것을 말한다.

뷰변환을 행하려면 2가지 좌표변환이 필요하다.

1. 월드 좌표계의 좌표축을 카메라가 있는 위치로 평행이동

2. 이동한 좌표축을 카메라 방향에 맞춰 회전

 

사전에 주어진 조건은 카메라의 시선의 끝점 P와 본래 월드 좌표계에서의 카메라의 위쪽을 나타내는 벡터 U이다.

 

카메라의 위치 C가 월드 좌표계에서 (Cx, Cy, Cz)에 있다고 하면 이 좌표가 새로운 원점 (0,0,0)이 되므로, 이때 평행이동 행렬 T는 다음과 같다.

카메라 방향으로 회전을 나타내는 행렬을 구해보면 카메라가 바라보는 시점 끝점을 P라고 할 때 카메라 좌표게는 오른손 좌표계이므로 시선의 배후가 z축의 양의 방향이다. 따라서 P에서 C로 향하는 벡터를 정규화하여 단위벡터로 하면 뷰 좌표계의 z축의 기저벡터 Z를 얻을 수 있다.

뷰 좌표계의 x축의 기저벡터 X를 구하려면 X는 Z와 U라는 두 벡터에 수직인 벡터이므로, Z와 U의 외적(오른손 좌표계)을 구해 Z처럼 정규화하면 된다. 그럼 뷰 좌표게의 y축의 기저벡터Y는 X와 Z의 외적으로부터 마찬가지로 구할 수 있다.

여기서 월드 좌표계에서 x축의 단위벡터(1,0,0,1)에서 월드 좌표계상에서의 벡터X로 변환하는 행렬은 다음과 같다.

 

Y와 Z축도 비슷하다.

위의 X, Y, Z축을 전부 만족하는 것은 다음과 같다.

실제로는 X가 새로운 뷰 좌표게예서의 x축의 단위벡터(1,0,01)이 되는 조작을 원하므로, 이 행렬의 역행렬이 목표로 하는 행렬이다.

회전행렬은 직교행렬이라 단순히 전치하면 역행렬을 얻을 수 있으므로, 카메라 방향으로의 회전을 나타내는 행렬R은 다음과 같다.

월드 좌표계의 벡터 v에서 뷰 좌표계의 벡터 v`를 구해보면

뷰 변환행렬 V는 다음과 같다.

V열의 4열 각 요소는 R의 각 행벡터인 X,Y,Z와 T의 열벡터 -C와의 내적이 되므로 결국 뷰 변환 행렬V는 다음과 같다.

7. 원근투영변환

뷰변환 다음에는 프로젝션 변환이다.

프로젝션 변환 중 원근투영변환은 근평면과 원평면 사이의 뷰 프러스텀 내부 정점을 정규화 디바이스 좌표 범위내로 옮기는 변환이었다.

실제로는 옮겨진 정점의 x좌표와 y좌표는 대상의 정점과 카메라를 서로 연결하는 선이 뷰 프로스텀의 근평면과 교차하는 점의 위치에 투영된다.

 

운점으로부터 근평면까지의 거리를 n, 원점으로부터 원평면까지의 거리를 f라고 한다. z축이 뷰 프러스텀과 반대쪽으로 뻗어가므로 근평면과 원평면의 z의 값은 가각 -n, -f다.

 

뷰 좌표계에서 D에 있는 정점은, 원점과 D를 잇는 직선과 근평면과의 교점 N의 위치에 투영된다. 근평면의 상하 양 끝인 y좌표는 b <= x <=t 범위 안에 있다.

 

b와 t의 값은 카메라 각토가 Θ라면 n tanΘ로 구할 수 있다.

근평면의 양끝인 x좌표는 l <= x <=r 범위 안에 있다. l과 r의 값은 근 평면의 수직 방향 크기가 최종적인 스크린의 아스펙트비에 의존한다.

 

P와 뷰좌표의 원점을 연결하는 직선은 1차원의 ㅎ마수이므로 다음과 같이 나타낼 수 있다.

 y = ax + b

 

xz 평면이면, 원점과 교차하므로 b=0, D의 좌표에서  a= Dx/Dz다. 여기서 알고 싶은 것은 Nx이므로 x = -1으로해서 다음과 같아진다.

마찬가지로 yz 평면에서는 다음처럼 된다.

여기서 Nx, Ny값에 주목하면 양쪽 모두 -Dz로 나누어져 잇ㄱ, 프로젝션 변환의 결과인 클립 좌표계의 w성분은 -Dz로, D의 z좌표에 의존해 변화한다는 것을 알 수 있다. 그러한 w성분을 생성할 수 있는 프로젝션 변환행렬 P는 다음처럼 구성해야 한다.

 

8. 직교투영변환

근평면과 원평면이 서로 다른 뷰 프러스텀이 아닌 단순한 직육면체다.

 

 

9. 등각투영변환

등각투영은 3D 정점 변환 파이프라인의 일부는 아니지만, 2D게임 개발에 사용되는 유용한 변환이다.

쿼터뷰 게임에 많이 사용된느데, 시뮬레이션 게임 등 필드를 조감하는 형태의 게임에서 이용도니다.

 

등각투영은 직교투영과 마찬가지로 평행투영의 일종이지만, 좌표축끼리의 각도가 모두 120도라는 특징이 있다.

 

백그라운드 그래픽스 처리를 2D로 하면서도 3D와 유사해 보이게 하는 기법으로 1980년대 초부터 활용되었다.

 

유니티에서는 등각투영방식으로 보여지는 방법은.

 

Rotation = x축은 약35도, y축으로 45도

x축의 기울기를 구하는 공식은 아래와 같다.

반응형