D3DXVec3TransformNormal 과 D3DXVec3TransformCoord 의 차이에 대해서
간단히 말씀드리도록 하겠습니다.
단순하게 말하자면 D3DXVec3TransformNormal 은 벡터를 변환하는 것이고
D3DXVec3TransformCoord 는 위치를 변환하는 것입니다.
벡터와 행렬을 곱하기 위해서는 행과 열이 같은 차수여야 한다는 것을
알고 계실 것입니다. 예를 들어서
[x, y, z] 라는 3차원 벡터가 존재하는데 D3D 에서는 4x4 행렬을 곱하게 됩니다.
이러한 벡터를 행렬과 연산을 할 때는 차수를 맞춰줘야지 곱할 수 있게 됩니다.
즉 3차 벡터를 마치 1x4 행렬 혹은 4x1 행렬인 것처럼 만들어 주어야
4x4 행렬과 곱하는 것이 가능하다는 것이죠.
D3DXVec3TransformNormal 은 [x, y, z] 를 [x, y, z, 0] 으로 만들고
D3DXVec3TransformCoord 는 [x, y, z] 를 [x, y, z, 1] 로 만들어서 연산을 합니다.
물론 결과는 [Rx, Ry, Rz] 형태인 3차원 벡터로 반환하게 되죠.
그런데 마지막에 0 이 붙느냐 1 이 붙느냐가 어떤 의미인지 궁금하실 것 같습니다.
Direct3D 에서 사용하는 행렬의 마지막 열 성분은 위치 변환(Translation)을 의미하고 있습니다.
즉 다음과 같은 형태를 띠고 있습니다.
| _11 _12 _13 Tx |
| _21 _22 _23 Ty |
| _31 _32 _33 Tz |
| _41 _42 _43 1 |
여기에서 _xx 식으로 표기한 부분은 회전과 크기 변환에 대한 부분입니다.
이것을 D3DXVec3TransformNormal 을 위해 만들어낸 행렬과 연산을 해 봅시다.
| _11 _12 _13 Tx | | x |
| _21 _22 _23 Ty | | y |
| _31 _32 _33 Tz | | z |
| _41 _42 _43 1 | | 0 |
이것을 연산할 때 Tx, Ty, Tz 요소는 0 과 곱해지게 된다는 것을 알 수 있습니다. 즉 다시 말해 변환 행렬의 이동 성분이 반영되지 않는다는 것입니다.
다음으로 D3DXVec3TransformCoord 를 위해 만들어낸 행렬과 연산을 해 봅시다.
| _11 _12 _13 Tx | | x |
| _21 _22 _23 Ty | | y |
| _31 _32 _33 Tz | | z |
| _41 _42 _43 1 | | 1 |
Tx, Ty, Tz 요소들은 1과 곱해지기 때문에 변환 행렬의 이동 성분이 반영되고 있음을 알 수 있습니다.
'수학 (Mathematics) > 3D수학' 카테고리의 다른 글
d3dx9math.h 수학적 함수들 수학적 설명 (0) | 2012.11.02 |
---|---|
언프로젝션과 픽킹 (0) | 2012.11.02 |
D3DXVec3TransformCoord & D3DXVec3Transform 둘의 차이는 w 로 나누었는가의 차이 (0) | 2012.11.02 |
D3DXVec3TransformNormal 과 D3DXVec3TransformCoord 의 차이 (0) | 2012.10.31 |
원점에서 두 점을 잇는 선사이의 각도, 즉 두 벡터 사이의 각도 0~360범위로 구하기. (0) | 2012.10.27 |