Vector 혹은 Matrix에서 4번째 요소가 의미하는것

수학, 물리학 등 게임 프로그래밍의 기반이 되는 이론에 관한 포럼입니다.

Moderator: 류광

Locked
비회원

Vector 혹은 Matrix에서 4번째 요소가 의미하는것

Post by 비회원 »

아 찾다찾다 못찾아서 질문 드립니다.

Vector3는 x, y, z 로 3D상의 좌표를 나타내는데
Vector4는 x, y, z, w 로 3D상의 좌표와 w가 있는데
W가 의미하는게 무엇인가요.?

Matrix4x4 에서 보면..

_41, _42, _43 은 왼손 좌표계일때 x y z를 의미하고
_14, _24, _34 는 오른손 좌표계일때 x y z를 의미하는 것으로 알고 있습니다.( 맞나요? )
그럼.. _44가 의미하는 것은 또 무엇인가요.??

답변 부탁드립니다.
비회원

아 글쓴이인데요

Post by 비회원 »

추가 질문 드립니다.

Vector4는 언제 쓰나요..??
wind0204
Posts: 10
Joined: 2005-09-23 23:21
Contact:

책을 추천해드리고 싶군요.

Post by wind0204 »

저는 요새 류광님이 번역하신 3D 게임 프로그래밍 & 컴퓨터 그래픽을 위한 수학 제 2판을 읽고있습니다. 이책 좋긴 좋은데 후반으로 넘어 갈수록 지옥입니다. 수학공부를 23살먹도록 안 하고 살던 놈인지라··· OTL (푸념)

다행히 w좌표는 쉬운 부분이라 기억이 납니다. :) 3D엔진에 4차원의 존재이유는 회전뿐만 아니라 이동도 담기 위해서라더군요··· (제가 정확히 알고 있는건지 모르겠네요. :roll: )

4x4행렬 M의 4번째열에 1.0 1.0 1.0과 마지막에 1.0을 넣고(4번째열의 모든 성분을 1.0)
V라는 4차원 위치벡터의 w좌표에 1을 넣고
MV
연산(M과 V의 곱)하면 연산결과로 나온 벡터는 V보다 x좌표축방향, y축,z축방향으로 1.0씩 이동합니다! (M이 크기변경이나 회전이나 반전까지 시킨다면 다르게 되겠지요. 회전등이 수행된 후 마지막에 +1.0씩 이동이 수행됩니다.)

재미있는건 두 위치벡터 P와 Q의 차인 벡터 P-Q는 w성분이 1-1= 0이 되겠고 4x4 행렬의 마지막열에 영향을 받지 않는다는 것이지요. 방향벡터로서의 role을 끝까지 해주게 됩니다. 방향을 나타내는 벡터가 이동을 해버리면 안되니까요. 이동하면 방향이 틀어지겠죠.

저는 이 4차원 넘버매직이 너무 멋있게 느껴졌습니다. 자세한 설명은 책을 사 보시면 되겠지만··· 절판이네요.
I've got this cat-pic<img src=http://kldp.org/files/pictures/picture-16716.jpg> from kedralynn.com. this picture is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 2.5 License
eternal
Posts: 14
Joined: 2009-06-20 08:22

Re: Vector 혹은 Matrix에서 4번째 요소가 의미하는것

Post by eternal »

w 성분은 동차좌표입니다.
동차좌표는 쉽게 말하면
3D에서 Transration을 표현하기 위함과 벡터와 포인터를 구분하기 위해서 사용하는 겁니다.

Vector4가 언제 쓰이는가에 대해서는 .. 항상 쓰고 있죠.

D3D는 기본적으로 4x4행렬이고 4x4 행렬과 곱할수 있는 벡터는 vector4 뿐입니다.
쉐이더를 하게 되면 벡터3로 받아서 벡터4로 바꿔줘서 씁니다.

그러나 왜 vector4를 실질적으로 잘 사용하지 않는가하면. vector3가 편하기 때문입니다.

vector4를 쓰지않아도 흔히 사용하는 D3D함수들중에 행렬과 벡터를 곱하는 Transformation 함수를 보게 되면 Normal(w = 0)과 Coord(w = 1)로 구분 합니다. 즉 vec3를 받아서 4x4행렬을 곱하되 마지막 성분을 함수가 임의로 넣어서 계산해주는 겁니다.
uhmgoon
Posts: 96
Joined: 2008-01-29 14:21

Post by uhmgoon »

저도 어렸을 때 (대략 고등학교 2학년때쯤) 그 4번째 성분이 대체 어떤 의미일까를 고민한 적이 있었습니다.
그때 제가 나름대로 만들어서 이해한 해석을 설명해보지요.

n차원을 가지는 벡터와 행렬의 곱은 항상 n개의 좌표의 1차결합, 혹은 선형결합입니다. 고등학교때는 1차변환, 혹은 선형변환으로 배우죠. 그런데 이 선형변환으로는 상수항을 만들어낼 수 없다는 게 문제입니다.
x -> ax
(x,y) -> (ax+by, cx+dy)
(x,y,z) -> (ax+by+cz, dx+ey+fz, gx+hy+iz )
.....
이런 식으로 하나의 벡터를 그 벡터의 좌표끼리 섞어낸 다른 벡터로 대응시켜주는 거죠. 각각의 좌표를 섞어주기만 할 뿐 새로운 상수항을 만들어낼 수 없다는 게 특징입니다. 하지만 평행이동은 상수항을 필요로 합니다. 고등학교때는 선형변환으로 확대/축소, 회전, 찌그러뜨리기(skewing)의 조합을 표현할 수 있다고 배웠죠. 선형변환만으로는 평행이동을 만들어낼 수 없다는 것이 문제입니다.
평행이동을 위해서는 다음과 같은 대응관계가 필요합니다.
x -> ax + b
(x,y) -> (ax + by + c, dx + ey + f )
(x, y, z) -> (ax + by + cz + d, ex + fy + gz + h, ix + jy + kz + l )
이렇게 선형변환에 상수항이 첨가된 변환을 affine 변환이라고 하는데, 고등학교때는 이름은 안나오고 그냥 개념만 가르쳤던것 같습니다. (전 프랙탈 그래픽스에 관심이 좀 있어서 찾아본거 같네요) 하지만 어파인 변환의 문제는 단일 행렬로는 표현이 불가능하며, 따라서 합성하기가 용이하지 않다는 것이죠. 그래서 어파인 변환을 하나의 행렬로 표현하고자 한 결과가 동차좌표의 도입입니다.

동차좌표는 기본적으로 다루고자 하는 공간에 한 개의 차원을 더하여 계산한다는 것인데요, 2차원을 다룰 때, 평면상의 한 점 A을 선형변환만으로 평행이동하고자 한다면, 대략적으로 다음과 같은 과정을 거치게 되는 것이죠.
1. 2차원을 3차원으로 확장한다. 이때, 점A는 추가된 z축과 평행한 방향으로 무한히 뻗는 직선AA'으로 확장된다.
2. 확장된 공간을 찌그러뜨린다. 이때 AA'의 방향은 z축과는 특정한 각도로 기울어지게 된다.
3. 적당한 z좌표를 골라서 단면을 취한다. 이때 고르게 되는 z좌표는 찌그러뜨린 정도에 비례하게 된다.

동차좌표가 도입된 행렬을 통한 평행이동의 표현은 대략적으로 추가된 차원을 매개변수로 삼는 skewing 행렬의 꼴과 비슷합니다. x,y 평면상에서의 간단한 skewing 행렬은,
1 a
0 1
과 같이 표현할 수 있겠죠. 고등학교때 배우셨을 테니 익숙하실 겁니다. 그런데 재미있는 점은, 이 행렬에 (x, y) 벡터를 곱하면 이 벡터는 다음과 같은 벡터로 대응된다는 점입니다.
(x,y) -> ( x + ay, y)
여기서 y가 상수라고 가정한다면, x좌표만이 변수이므로 x좌표만 보면 평행이동한 결과가 나온다는 거죠.

마찬가지로, x,y,z 공간상에서의 간단한 skewing 행렬은
1 0 a
0 1 b
0 0 1
입니다. 역시 이 행렬에 (x, y, z)벡터를 곱하면
(x, y, z) -> ( x + az, y + bz, z )로 대응되며,
z를 상수라고 가정한다면 역시나 x,y 좌표만 보면 xy 평면상에서의 평행이동한 결과가 나오는 거죠.

그럼 (x, y, z, w ) 4차원 초공간에서의 간단한 skewing 행렬은,
1 0 0 a
0 1 0 b
0 0 1 c
0 0 0 1
이 되겠죠. DirectX SDK문서에서 많이 보던 꼴이죠? (물론 DX에서는 행벡터를 쓰므로 행렬을 전치해야 하겠죠)

각 상수 a,b,c는 찌그러뜨리는 정도를 나타내는, 일종의 비례상수인데 이 비례상수가 크면 원하는 결과를 얻기 위해서 원점에서 더 가까운 평면으로 잘라내야 하고, 비례상수가 작으면 원점에서 더 먼 평면으로 잘라내면 되는 점이 편리하다고 할 수 있겠죠. 이건 약속하기 나름입니다. 가장 윗 행렬의 예에서 x축 방향으로 1만큼 평행이동시키고 싶은데 식을 풀다보니 a가 0.25가 되는 것이 편리한 경우도 있을 수 있지 않겠습니까? 그럴때는 최종 결과를 얻기 위해 y를 4로 고정시키고 대입하면 되는 문제지요. 물론 우리는 편의를 위해 추가된 동차좌표는 항상 1로 고정하고 쓴다고 가정합니다. 그러면 최종결과를 따로 계산하지 않고 행렬의 값만 보고도 결과를 알 수 있는 편리함이 있겠죠.

정리하자면, 동차좌표는 원래의 좌표계와 어떤 일정한 비례관계가 성립하도록 추가된 좌표계입니다. 중요한 것은 비례관계죠. 값이 아니라 비율이 동일하다-는 것이 동차좌표(homogeneous coordinate)에서 동질성(homogeneous)이 의미하는 것이 아닐까-라고 생각합니다.

따라서 질문에 대한 답을 드리자면, 행렬 또는 벡터의 마지막 멤버는 동차좌표계를 찌그러뜨린 정도와 관련있는 값이라고 할 수 있겠군요. 우리는 편의를 위해 1.0이라고 가정하고 씁니다.
Locked