게임 빌보드 매트릭스 _11, _13, _31, _33
빌보드 매트릭스 구성은
m_matBill._11 = matView._11; (카메라)
m_matBill._13 = matView._13;
m_matBill._31 = matView._31;
m_matBill._33 = matView._33;
zMatrixInverse( &m_matBill, NULL, &m_matBill );
m_matBill 을
빌보드용 오브젝트의 회전 매트릭스로 대체하여 사용
결과로는
빌보드 오브젝트는
항상 카메라 정면만을 바라보게 Y축 회전을 한다
m_matBill 구성을 좀더 파고들어 보자
_11, _13, _31, _33 에는 실제 어떤 값이 들어가 있을까?
우리가 카메라뷰 구성에 많이 사용하는 LookAt 함수를 살펴보자
/*ㅣ
D3DXMatrixLookAtLH(Out, Eye, At, Up)
v = Normalized(At?Eye)
r = v*Up
u = v*r
r.x u.x v.x 0
r.y u.y v.y 0
r.z u.z v.z 0
?dot(r,Eye) ?dot(u,Eye) ?dot(v,Eye) 1
D3DXMatrixLookAtLH의 실제 구현을 코드로 보면
D3DXVECTOR3 CameraView = *pAt - *pEye;
D3DXVec3Normalize (&CameraView, &CameraView);
D3DXVECTOR3 CameraRight;
D3DXVec3Cross (&CameraRight, pUp, &CameraView);
D3DXVec3Normalize (&CameraRight, &CameraRight);
D3DXVECTOR3 CameraUp;
D3DXVec3Cross (&CameraUp, &CameraView, &CameraRight);
D3DXVec3Normalize (&CameraUp, &CameraUp);
D3DXMATRIX matView;
//
matView._11 = CameraRight.x;
matView._21 = CameraRight.y;
matView._31 = CameraRight.z;
matView._41 = -D3DXVec3Dot(CameraRight, CameraPosition);
matView._12 = CameraUp.x;
matView._22 = CameraUp.y;
matView._32 = CameraUp.z;
matView._42 = -D3DXVec3Dot(CameraUp, CameraPosition);
matView._13 = CameraView.x;
matView._23 = CameraView.y;
matView._33 = CameraView.z;
matView._43 = -D3DXVec3Dot(CameraView, CameraPosition);
matView._14 = 0.0;
matView._24 = 0.0;
matView._34 = 0.0;
matView._44 = 1.0;
*/
즉, 결과는
matView._11 = CameraRight.x; //축기준벡터x
matView._13 = CameraView.x; //방향벡터x
matView._31 = CameraRight.z; //축기준벡터z
matView._33 = CameraView.z; //방향벡터z
기준과 방향 벡터 -> 회전정보 -> 회전값
이때의 벡터들,
x, z 회전값은 모든축 회전이 적용된 결과값들이다
m_matBill._11 = matView._11;
m_matBill._13 = matView._13;
m_matBill._31 = matView._31;
m_matBill._33 = matView._33;
zMatrixInverse( &m_matBill, NULL, &m_matBill );
m_matBill 를
역행렬 변환하면,
x, z 축 회전값은 완전 무효화되고,
x, z 축 회전값속에 포함되어 있던, y 축 회전값만이 남는
방식이라고 대충 이해가 가는듯 한데,
좀더 확실히 이해하기위해
파고들어가려면,
역행렬 변환 과정도 살펴보고
카메라뷰 매트릭스와
역행렬변환이 끝난 m_matBill 의 요소 값을
비교해봐야할듯 하다
일단 여기서 패스~