삼각형, 사각형 흥미있게 잘 그리다가.. 갑자기 이게 무슨 소리입니까?

OpenGL에서 도형을 그리기 위해 우리는 정점을 입력해왔고, 정점 하나는 (x, y, z) 였습니다.
기본적으로 정점은 위치를 표현하지만 그 외에도 다른 속성을 갖습니다.

세개의 값을 바로 Vector라는 개념입니다.

벡터(Vector)

벡터란 크기와 방향을 가지는 양을 말합니다. (힘, 속도, 이동 등)

다음과 같은 그림은 원점으로부터 하나의 정점까지의 방향을 나타내고 있습니다.

원점으부터 하나의 정점(50,50,0)까지의 방향이 벡터의 방향이고,
원점으로부터 정점까지의 길이가 벡터의 크기를 나타냅니다.

Note : 벡터는 크기와 방향만 같으면 같은 벡터입니다.

단위벡터(Unit Vector)

선형대수학에서 단위벡터는 그 크기가 정확히 1인 벡터입니다. 
단위 벡터는 방향만 필요하고 크기는 필요 없을 때 주로 쓰입니다.
모든 벡터는 정규화(normalization) 과정을 거쳐서 단위 벡터로 만들어 줄 수 있습니다.

벡터의 정규화
단위벡터 v = 벡터 v / 벡터 v의 크기

단위벡터를 구하는 이유는 벡터의 길이가 공식에 나오는 경우 그길이가 1이면 공식이 단순해 지기 때문입니다. 예를들어 게임속 캐릭터가 움직여야 하는경우, 케릭터의 위치 벡터에 이동 벡터를 더하면 최종적으로 케릭터가 이동될 위치를 구할 수 있습니다.

단위벡터 및 간단한 벡터연산 예제에 대해 자세히 알고 싶다면 링크를 클릭해주세요.

벡터는 3D그래픽스에서 매우 중요한 개념이기때문에 GLSL에서도 기본적으로 지원합니다. 예를들어 vec3는 부동소수점 (x,y,z)를 의미하고, vec4는 부동소수점 (x,y,z,w)를 의미합니다.
w가 생소할 수 있는데 이는 벡터를 동차좌표로 만들기 위함입니다.

Homogeneous Coordinates(동차좌표)

동차좌표는 n차원의 사영공간(projective space)을 n+1개의 좌표로 나타내는 좌표계인데, 
일반적으로 w는 1이며 나중에 x, y, z 값이 w로 나뉩니다. 결과적으로 x, y, z값이 그대로 남습니다.

그렇다면 동차좌표를 왜 쓰는것일까요?

3차원 그래픽스에서는 (x, y, z) 트리플렛이 정점의 위치를 뜻하기도 했지만, 앞서 말했던 벡터처럼 방향을 의미하기도 합니다. 이 두가지가 개념이 다른것인데 어떤것은 위치고 어떤것은 방향인지 항상 기억을 해야하고 잘못 계산하기라도 하면 혼돈의 카오스 입니다.

그래서 이 두개를 같이 쓸수 있도록 한차원 높여 생각한게 동차좌표입니다.

w=1 이면, (x,y,z,1)는 공간상에서의 위치
w=0 이면, (x,y,z,0)는 방향

이해가 가지 않더라도 표의 내용은 꼭 기억하시길 바랍니다.

동차좌표를 쓰는 또다른 이유는 대부분의 경우 지오메트리의 버텍스 위치를 정의하기위해 OpenGL에 저장하고 보내는 값은 (x,y,z)면 충분합니다. 대부분의 방향 벡터도 예를들면 표면 법선 벡터(surface normal;라이팅 계산을 위해 표면에 대해 수직인 방향을 가리키는 벡터)도 3요소 벡터면 충분하다. 하지만 이제 매트릭스의 세계로 들어가면 3D벡터를 4×4 변환 행렬에 곱하여 변환할 경우가 생깁니다. 4×4행렬에는 반드시 4요소 벡터를 곱해야 합니다.

다시 정리하자면,

동차좌표는 방향과 점을 구분시켜주고, 4×4 매트릭스 연산 때문에 필요합니다.

Homogeneous Coordinates에 대한 좀 더 자세한 설명은 링크를 참조해주세요

카테고리: Graphics

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.