Game!

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

------------------------------------------------------------------ 

이제 질문하신 부분에 대해서 이야기해 보도록 하겠습니다. 

D3DXVECTOR3 vA, vB; 
D3DXMATRIX mTransform; 

vB = D3DXVECTOR3(1, 1, 1); 
D3DXMatrixIdentity(&mTransform); 

D3DXVec3TransformNormal(&vA, &vB, &mTransform); 

이라는 식으로 했을 때 이것이 어떠한 결과를 낳으며 

행렬의 역할은 무엇인가에 대해서 질문하신 것 같습니다. 

이 함수는 기본적으로 위에서 설명했듯이 vB 가 위치를 나타내는 점이 아니라 

방향과 크기를 나타내는 벡터라는 가정을 하고 있습니다. 

또한 변환 행렬의 이동 성분은 무시하기 때문에 위의 함수가 최종적으로 반환하는 vA 는 

로컬 공간에서의 벡터에 회전 및 스케일 변환을 적용했을 때의 월드 공간에서의 벡터를 의미하게 됩니다. 

이러한 연산을 사용하는 것은 로컬에서의 법선 벡터가 변환 이후 

월드에서 어떤 방향과 크기를 가지는 지를 알아내야 하는 경우입니다. 

하지만 만약 이것이 점이라 가정하고 로컬 공간에서 mTransform 을 적용한 것 만큼 

월드 공간으로 이동시키고자 한다면 

D3DXVec3TransformNormal 이 아니라 D3DXVec3TransformCoord 를 사용해 줘야 합니다. 

그래야지 이동 성분이 평가가 되어서 월드 공간에서의 위치를 얻을 수 있겠죠. 

답변이 제대로 되었는지 모르겠지만... 도움이 되었으면 좋겠네요. 

즐플하세요.

'DirectX' 카테고리의 다른 글

[펌] 렌더링 파이프라인  (0) 2018.02.22
[DirectX] memory pool에서의 D3DPOOL_DEFAULT와 D3DPOOL_MANAGED  (0) 2016.03.16