반응형

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과 곱해지기 때문에 변환 행렬의 이동 성분이 반영되고 있음을 알 수 있습니다.

반응형

+ Recent posts