(ver12.html) Z-UPÀ¸·Î ÁÂÇ¥ ¹Ù²Ù±â1À» ¼öÁ¤ÇÏ¿´´Ù.
±×·¡ÇÈ ÆÄÀÌÇÁ ¶óÀο¡¼ º¯È¯¼ø¼´Â ´ÙÀ½°ú °°´Ù.
Á¤Á¡
|
-->
|
¿ùµå Çà·Ä
|
-->
|
Ä«¸Þ¶ó Çà·Ä
|
-->
|
Åõ¿µ Çà·Ä
|
-->
|
ȸé
|
·ÎÄÃ ÁÂÇ¥°è
|
|
¿ùµå ÁÂÇ¥°è
|
|
ºä ÁÂÇ¥°è
|
|
ÇÁ·ÎÁ§¼Ç ÁÂÇ¥°è
|
|
ºäÆ÷Æ® ÁÂÇ¥°è
|
´ÙÀÌ·ºÆ® XÁÂÇ¥°è¸¦ Z-UPÀ¸·Î ¹Ù²Ü·Á¸é Ä«¸Þ¶ó Çà·Ä, Áï, ºä º¯È¯°ú °ü·ÃÀÖ´Ù.
|
|
±×¸² A
|
±×¸² B
|
ºä º¯È¯À̶õ, ¿ùµå º¯È¯µÈ ÁÂÇ¥¸¦ Ä«¸Þ¶ó Áß½ÉÀÇ ÁÂÇ¥·Î º¯È¯ ÇÏ´Â °ÍÀ» ¸»ÇÑ´Ù. ±×¸² A´Â ¿ùµå Çà·ÄÀÌ°í, ±×¸² B´Â Ä«¸Þ¶ó°¡ Áß½ÉÀÌ µÇ´Â ºä ÁÂÇ¥°èÀÌ´Ù.
´ÙÀÌ·ºÆ® XÀÇ ¿Þ¼Õ ÁÂÇ¥°è Y-UPÀ» ±âÁØÀ¸·Î ¾Ë¾Æº»´Ù. ºä ÁÂÇ¥¸¦ ±¸ÇÒ·Á¸é Ä«¸Þ¶óÀÇ À§Ä¡¸¦ ³ªÅ¸³»´Â À̵¿ Çà·Ä°ú, Ä«¸Þ¶óÀÇ ÁÂÇ¥°è¸¦ ³ªÅ¸³»´Â ÁÂÇ¥°è º¯È¯ Çà·ÄÀÌ ÇÊ¿äÇÑ´Ù.
ºäÁÂÇ¥¸¦ ±¸ÇÏ´Â ½ÄÀº ¾Æ·¡¿Í °°´Ù.
ºä ÁÂÇ¥ = ¿ùµå ÁÂÇ¥ X À̵¿ Çà·Ä X ÁÂÇ¥°è º¯È¯ Çà·Ä
C : Ä«¸Þ¶ó À§Ä¡ Ä«¸Þ¶ó À§Ä¡¸¦ ¿øÁ¡À¸·Î º¯È¯ ÇÏ·Á¸é, Ä«¸Þ¶ó À§Ä¡¸¦ »«´Ù.
R: XÃà ÁÂÇ¥°è Ä«¸Þ¶óÀÇ ¿À¸¥ÂÊ ¹æÇâÀÌ´Ù.
U: YÃà ÁÂÇ¥°è Ä«¸Þ¶óÀÇ UPÀ» ³ªÅ¸³½´Ù.
F: ZÃà ÁÂÇ¥°è Ä«¸Þ¶óÀÇ ¾ÕÀ» ³ªÅ¸³½´Ù.
|
À̵¿ Çà·Ä
|
|
ÁÂÇ¥°è º¯È¯ Çà·Ä
|
|
[x', y', z', 1] =
|
[x, y, z, 1] X
|
1
|
0
|
0
|
0
|
X
|
Rx
|
Ux
|
Fx
|
0
|
0
|
1
|
0
|
0
|
Ry
|
Uy
|
Fy
|
0
|
0
|
0
|
1
|
0
|
Rz
|
Uz
|
Fz
|
0
|
-Cx
|
-Cy
|
-Cz
|
1
|
0
|
0
|
0
|
1
|
°áÇÕ ¹ýÄ¢À» Àû¿ë Çϸé
[x', y', z', 1] = [x, y, z, 1] X
|
Rx
|
Ux
|
Fx
|
0
|
Ry
|
Uy
|
Fy
|
0
|
Rz
|
Uz
|
Fz
|
0
|
-(CxRx + CyRy + CzRz)
|
-(CxUx + CyUy + CzUz)
|
-(CxFx + CyFy + CzFz)
|
1
|
¸¶Áö¸·À¸·Î ´ÙÀ½°ú °°Àº ½ÄÀÌ ³ª¿Â´Ù.
[x', y', z', 1] = [x, y, z, 1] X
|
Rx
|
Ux
|
Fx
|
0
|
Ry
|
Uy
|
Fy
|
0
|
Rz
|
Uz
|
Fz
|
0
|
-dot( C , R )
|
-dot( C, U)
|
-dot( C, F )
|
1
|
(Âü°í·Î ³»ÀûÀº ±³È¯¹ýÄ¢ÀÌ ¼º¸³ÇϹǷΠ-dot( R, C ), -dot( U, C ), -dot( F, C )¿Í °°´Ù.
´ÙÀÌ·ºÆ®XÀÇ MatrixLookAtLH(), MatrixLookAtRH()¸¦ ±¸ÇöÇÑ ¸Þ½îµåÀÌ´Ù.
void CGraphics::MatrixLookAtLH(D3DXMATRIX* pOut, D3DXVECTOR3 *pEye, D3DXVECTOR3* pAt, D3DXVECTOR3* pUp)
{
D3DXMATRIX& mat = *pOut; D3DXVECTOR3& eye = *pEye;
D3DXVECTOR3& at = *pAt; D3DXVECTOR3& up = *pUp;
D3DXVECTOR3 xaxis, yaxis, zaxis;
zaxis = at - eye;
D3DXVec3Normalize(&zaxis, &zaxis);
D3DXVec3Cross(&xaxis, &up, &zaxis);
D3DXVec3Normalize(&xaxis, &xaxis);
D3DXVec3Cross(&yaxis, &zaxis, &xaxis);
D3DXMatrixIdentity(&mat);
mat._11 = xaxis.x; mat._12 = yaxis.x; mat._13 = zaxis.x;
mat._21 = xaxis.y; mat._22 = yaxis.y; mat._23 = zaxis.y;
mat._31 = xaxis.z; mat._32 = yaxis.z; mat._33 = zaxis.z;
mat._41 = -dot(&xaxis, &eye); mat._42 = -dot(&yaxis, &eye); mat._43 = -dot(&zaxis, &eye);
}
//------------------------------------------------------------------------------------------
void CGraphics::MatrixLookAtRH(D3DXMATRIX* pOut, D3DXVECTOR3 *pEye, D3DXVECTOR3* pAt, D3DXVECTOR3* pUp)
{
D3DXMATRIX& mat = *pOut; D3DXVECTOR3& eye = *pEye;
D3DXVECTOR3& at = *pAt; D3DXVECTOR3& up = *pUp;
D3DXVECTOR3 xaxis, yaxis, zaxis;
zaxis = eye - at;
D3DXVec3Normalize(&zaxis, &zaxis);
D3DXVec3Cross(&xaxis, &up, &zaxis);
D3DXVec3Normalize(&xaxis, &xaxis);
D3DXVec3Cross(&yaxis, &zaxis, &xaxis);
D3DXMatrixIdentity(&mat);
mat._11 = xaxis.x; mat._12 = yaxis.x; mat._13 = zaxis.x;
mat._21 = xaxis.y; mat._22 = yaxis.y; mat._23 = zaxis.y;
mat._31 = xaxis.z; mat._32 = yaxis.z; mat._33 = zaxis.z;
mat._41 = -dot(&xaxis, &eye); mat._42 = -dot(&yaxis, &eye); mat._43 = -dot(&zaxis, &eye);
}
|
´ÙÀÌ·ºÆ® XÀÇ Y-UPÀ» 3DSMAX ÁÂÇ¥°è·Î ¹Ù²Ü·Á¸é ÁÂÇ¥°è º¯È¯Çà·ÄÀ» ¾î¶»°Ô ÇØ¾ß Çϴ°¡? 3DSMAX¿Í ´ÙÀÌ·ºÆ® XÀÇ ÁÂÇ¥ Â÷ÀÌ´Â ¾Æ·¡¿Í °°´Ù..
¶óÀ̺귯¸®
|
RIGHT(XÃà)
|
UP(YÃà)
|
FORWARD(ZÃà)
|
3DSMAX |
X
|
Z
|
-Y
|
Directx3D |
X
|
Y
|
Z
|
D3D ÁÂÇ¥°è¸¦ 3DSMAX ÁÂÇ¥°è·Î ¹Ù²Ù±â Àü¿¡ ¿Þ¼Õ ÁÂÇ¥°è¸¦ ¿À¸¥¼Õ ÁÂÇ¥°è ±×¸²À» ´Ù½Ã Çѹø º¸ÀÚ. ¿Þ¼Õ ÁÂÇ¥°è¿Í ¿À¸¥¼Õ ÁÂÇ¥°èÀÇ Â÷ÀÌÁ¡Àº zÁÂÇ¥°èÀÇ ¹æÇâ¿¡ ÀÖ´Ù. ForwardÃàÀÇ ¹æÇâÀÌ ¹Ý´ëÀÌ´Ù. ±×·¡¼ -Y°¡ µé¾î°£´Ù.
D3D --> 3DSMAX ÁÂÇ¥°è ¹Ù²Ù±â
XÃà º¤ÅÍ
|
YÃà º¤ÅÍ
|
ZÃà º¤ÅÍ
|
1
|
0
|
0
|
0
|
0
|
-1
|
0
|
1
|
0
|
|
±×·¯¹Ç·Î 4X4 Çà·ÄÀº
|
1
|
0
|
0
|
0
|
0
|
0
|
-1
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
1
|
|
À§ÀÇ Çà·Ä½ÄÀ» ¹ÙÅÁÀ¸·Î MatrixLookAtRH() ¸Þ½îµå¿Í ºñ½ÁÇÑ ¿ªÇÒÀ» ÇÏ´Â SetCameraRH() ¸Þ½îµå¸¦ ¸¸µé¾ú´Ù.
void CGraphics::SetCameraRH(D3DXMATRIX* pOut, D3DXVECTOR3 *pEye)
{
D3DXMATRIX& mat = *pOut;
D3DXMatrixIdentity(&mat);
mat._11 = 1.0f; mat._12 = 0; mat._13 = 0.0f;
mat._21 = 0.0f; mat._22 = 0; mat._23 = -1.0f;
mat._31 = 0.0f; mat._32 = 1; mat._33 = 0.0f;
mat._41 = -pEye->x; mat._42 = -pEye->y; mat._43 = -pEye->z;
}
|
Çà·Ä Àû¿ë ~~~~~~
Z-UPÀ¸·Î ¼öÁ¤Çϱâ À§ÇØ ¹Ù²ï ºÎºÐÀº ´ÙÀ½°ú °°´Ù.
application.cpp
bool CApplication::PostGraphics() { //~~~ »ý·« ~~~ pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); //~~~ »ý·« ~~~ }
|
Äøµ ¸ðµå¸¦ D3DCULL_CCW¿¡¼ D3DCULL_CW·Î ¹Ù²Ù¾ú´Ù. ¾ÕÀ¸·Î ¹Ú½º¸¦ ±×¸±¶§´Â ±×¸®´Â ¹æÇâÀ» ¹Ý½Ã°è ¹æÇâÀ¸·Î ±×¸°´Ù.
graphics.cpp
void CGraphics::SetupCamera() { D3DXMATRIX matProj; D3DXMATRIX matCameraView; D3DXVECTOR3 cameraTarget; D3DXVECTOR3 cameraPos;
// Set where camera is viewing from cameraPos.x = 0.0f; cameraPos.y = -15.0f; cameraPos.z = 0.0f;
// Set what camera is looking at cameraTarget.x = 0.0f; cameraTarget.y = 0.0f; cameraTarget.z = 0.0f;
// Setup Camera View MatrixLookAtRH( &matCameraView, &cameraPos, &cameraTarget, &D3DXVECTOR3( 0.0f, 0.0f, 1.0f ) );
m_pDevice->SetTransform( D3DTS_VIEW, &matCameraView );
// Setup Projection RECT rect; GetClientRect(m_hWnd, &rect); float width = (float)rect.right, height = (float)rect.bottom; D3DXMatrixPerspectiveFovRH(&matProj, D3DX_PI/4, width/height, 1.0f, 500.0f); m_pDevice->SetTransform( D3DTS_PROJECTION, &matProj ); }
|
Z-UPÀ̶ó Ä«¸Þ¶ó¸¦ ZÃàÀÌ ¾Æ´Ï¶ó YÃàÀ¸·Î -15¸¸Å À̵¿ÇÑ´Ù. ¿À¸¥¼Õ ÁÂÇ¥°è D3DXMatrixLookAtRH()·Î ¹Ù²Ù°í Ä«¸Þ¶ó UP-Vector 0, 0, 1·Î ¹Ù²Û´Ù. Åõ¿µ Çà·Äµµ ¿À¸¥¼Õ ÁÂÇ¥°è D3DXMatrixPerspectiveFovRH()·Î ¹Ù²Û´Ù.
testapp.cpp
void InitDirectionalLight() { //~~~ »ý·« ~~~ vecDir = D3DXVECTOR3(0.5f, 0.5f, -0.1f); //~~~ »ý·« ~~~ }
bool CTestApp::PostGraphics() { CApplication::PostGraphics();
//¹öÅؽº ¹öÆÛÀÇ y, z °ªÀ» ¹Ù²Û´Ù.
//³ë¸Ö ¹öÆÛÀÇ ³ë¸Ö°ªµµ ¹Ù²Ù´Ù.
//À妽º ¹öÆÛÀÇ À妽º ¸®½ºÆ®¸¦ Äøµ¸ðµå¿¡ µû¶ó Àç Á¤·ÄÇÑ´Ù.
}
|
InitDirectionalLight()¿¡¼ ¶óÀÌÆ®ÀÇ ¹æÇâµµ Z-UP¿¡ µû¶ó ¼öÁ¤ÇÑ´Ù. ¹öÅؽº ¹öÆÛ, ³ë¸Ö ¹öÆÛ´Â y, z °ªÀ» ¼·Î ¹Ù²Û´Ù. Äøµ ¸ðµå°¡ ¹Ù²î¾ú±â ¶§¹®¿¡ , À妽º ¹öÆÛÀÇ »ï°¢Çü ¸®½ºÆ®¸¦ ½Ã°è ¹Ý´ë ¹æÇâÀ¸·Î µ¹¸°´Ù.
testapp.cpp
void CTestApp::Render() { D3DXMATRIX matTranslation, matRot, matWorld; D3DXMatrixTranslation( &matTranslation, 0.0f, m_cameraRef.wheel * 2.0f, 0.0f); D3DXMatrixRotationYawPitchRoll( &matRot, 0.0f, D3DXToRadian(-m_cameraRef.fRotateY), D3DXToRadian(-m_cameraRef.fRotateX)); IDirect3DDevice9 * pDevice = m_pGraphics->GetDevice();
m_pTexture->SetTexture( pDevice); m_pMaterial->SetMaterial(pDevice);
matWorld = matRot * matTranslation; pDevice->SetTransform( D3DTS_WORLD, &matWorld); m_pRenderer->Render(pDevice, *m_pMesh); }
|
ÈÙ ¸¶¿ì½º¸¦ ¿òÁ÷ÀÏ ¶§, Y ÃàÀÌ Àû¿ë µÇ¾î¾ß ÇϹǷΠY°ª°ú Z°ªÀ» ¹Ù²Û´Ù. ȸÀü¿ª½Ã ¹Ù²Û´Ù.
ÂüÁ¶) http://zho.pe.kr/doc/ConvertMaxCamToD3DCam.htm
¼Ò½º:
À§ÀÇ ¼Ò½º¸¦ ¼³¸íÇÑ ¼Ò½º: view.zip
2008.10.20 ¾÷µ¥ÀÌÆ® »çÇ×: À§¼Ò½º¸¦ SetRightHandCoordinate() ¸Þ½îµå¿¡ ÀÇÇÑ ¿À¸¥¼Õ, ÁÂÇ¥°è ¼³Á¤À¸·Î 01_007.zipÀ¸·Î ¹Ù²Þ
01.008 ¹öÀü ¾÷µ¥ÀÌÆ® (2008.11.16) LMatrix, RMatrix, MyQuaternion Ŭ·¡½º Ãß°¡ 01_008.zip
01.10 ¹öÀü ¾÷µ¥ÀÌÆ® (2008.11.29) LMatrx, RMatrix Ŭ·¡½º ¼öÁ¤ 01_10.zip
01.20 ¹öÀü ¾÷µ¥ÀÌÆ® (2008.11.30) MyCamera¸¦ ÅëÇØ View, Projection Matrix Á¦¾î, CGraphics Ŭ·¡½ºÀÇ MatrixLookAtRH, MatrixLookAtLH ¸Þ½îµå Á¦°Å 01_20.zip
|