Z-UPÀ¸·Î ÁÂÇ¥ ¹Ù²Ù±â2

ver 1.05  : ÀÚü Ä«¸Þ¶ó ºä

(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