ij¸¯ÅÍ À̸§ Ç¥½Ã

ij¸¯ÅÍ ¸Ó¸®À§¿¡ µû¶ó ´Ù´Ï´Â À̸§À» Ç¥½ÃÇÏ´Â ¹æ¹ý¿¡´Â  2°¡Áö°¡ ÀÖ´Ù. ºôº¸µå ÆÇÀ» ¸Ó¸® À§¿¡ ºÙÀÌ´Â ¹æ¹ýÀÌ ÀÖ°í, ¶Ç Çϳª´Â ¸Ó¸® À§¿¡ 2D ¹æ½ÄÀÇ UI¸¦ ºÙÀÌ´Â ¹æ¹ýÀÌ ÀÖ´Ù.

ºôº¸µå ÆÇÀº 3D·Î ó¸®Çϱ⠶§¹®¿¡ ÆùÆ®°¡ ¸Ö¸®ÀÖÀ¸¸é ÀÛ°Ô º¸ÀÌ°í °¡±îÀÌ °¡¸é Å©°Ô º¸ÀδÙ.
2D·Î ó¸®ÇÏ´Â ¹æ½ÄÀº °Å¸®¿Í °ü°è¾øÀÌ ÆùÆ®°¡ ÀÏÁ¤ÇÑ Å©±â·Î º¸ÀÌÁö¸¸ º®µÚ¿¡ °¬À» ¶§µµ ij¸¯ÅÍ À̸§ÀÌ º¸¿© º¸±â¿¡ ÁÁÁö ¾Ê´Ù.

ÀÌ Àå¿¡¼­ ó¸®ÇÏ´Â °ÍÀº ÆùÆ®¿¡ ±íÀÌ°ªÀ» ³Ö¾î¼­ ij¸¯ÅÍ°¡ º®µÚ¿¡ °¡¸é ij¸¯ÅÍ À̸§ÀÌ ¼ûµµµµ·Ï ó¸®ÇÑ´Ù.

"Hello World!"¶ó´Â ¹®ÀÚ¿­À» 2D·Î ±×¸®°í ÀÖÁö¸¸  ±íÀÌ°ªÀ» °¡Áö°í Àֱ⠶§¹®¿¡ ÁÖº¯ ¹è°æ¿¡ ÀÇÇØ °¡·ÁÁø´Ù.
ÀÌ°ÍÀ» ó¸®Çϱâ À§ÇÑ ±âº» 󸮴 ´ÙÀ½ ¼ø¼­·Î ÁøÇàÇÑ´Ù.

 

< D3DXSprite, D3DXFONT¸¦ ÅëÇÑ ÆùÆ® Ãâ·Â ¹æ½Ä >

D3DXFONT¿Í D3DXSprite¸¦ Á¶ÇÕÇÏ¿© ÆùÆ®¸¦ Ãâ·Â ÇÑ´Ù. D3DXFONT·Î DrawText½Ã ½ºÇÁ¶óÀÌÆ® ÇÚµéÀ» ÁöÁ¤ÇØÁØ´Ù. ½ºÇÁ¶óÀÌÆ®¸¦ ÅëÇÏ¿© ÆùÆ®¸¦ ±×¸®¸é D3DXSprite::SetTransform() ¸í·ÉÀ» ÅëÇØ ÁÂÇ¥¸¦ À̵¿ ÇÒ ¼ö ÀÖ´Ù.
D3DXMatrixTranslation( &world, 100, 100, 0 )¿¡¼­ º¸¸é ½ºÅ©¸° ÁÂÇ¥ x=100, y=100À¸·Î À̵¿ ½ÃÅ´À» ¾Ë¼ö ÀÖ´Ù.

ÄÚµå´Â ´ÙÀ½ÀÇ ¼ø¼­·Î ¸¸µé¸é µÈ´Ù.
1. ½ºÇÁ¶óÀÌÆ® »ý¼º
2. ½ºÇÁ¶óÀÌÆ® ·»´õ¸µ
3. ½ºÇÁ¶óÀÌÆ® ¼Ò¸ê

//1. ½ºÇÁ¶óÀÌÆ® »ý¼º

LPD3DXFONT          g_pNameFont = NULL;  //ÆùÆ®¿ë

ID3DXSprite*        g_pSprite = NULL;    //½ºÇÁ¶óÀÌÆ®

 

void CreateSprite( IDirect3DDevice9* pd3dDevice )

{

    D3DXCreateFont(pd3dDevice, 20, 0, FW_BOLD, 0,
                  FALSE, DEFAULT_CHARSET,

                  OUT_DEFAULT_PRECIS, DEFAULT_QUALITY,
                  DEFAULT_PITCH | FF_DONTCARE,TEXT("±Ã¼­"),
                  &g_pNameFont);

    D3DXCreateSprite( pd3dDevice, &g_pSprite );

}

 

//2. ½ºÇÁ¶óÀÌÆ® ·»´õ¸µ

void RenderSprite( IDirect3DDevice9* pd3dDevice, D3DXMATRIX* pMat )

{

    if( g_pSprite == NULL )

        CreateSprite( pd3dDevice );

 

    D3DXMATRIX world;

    D3DXMatrixTranslation( &world, 100, 100, 0 );

    g_pSprite->SetTransform( &world );

    g_pSprite->Begin( D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE );//2D

    RECT rectTemp = { 0, 0, 200, 30};

    g_pNameFont->DrawText(g_pSprite, L"Hello World!", -1, &rectTemp, 0,
                               D3DCOLOR_COLORVALUE(1, 0, 0, 1) );//0xFFFF0000);

    g_pSprite->End();

}

 

//3. ½ºÇÁ¶óÀÌÆ® ¼Ò¸ê

SAFE_RELEASE(g_pNameFont);

SAFE_RELEASE(g_pSprite);

 

< D3DXSprite::SetTransform()À» ÀÌ¿ëÇÑ ±íÀÌ°ª Ç¥½Ã >

2D¿¡ Åõ¿µµÈ ÁÂÇ¥¸¦ D3DXMatrixTranslation()¿¡ ³Ö´Â´Ù. Áï,

D3DXMatrixTranslation( &world, scrPos.x, scrPos.y, scrPos.z )¿¡¼­ scrPos.x, scrPos.y´Â ½ºÅ©¸° ÁÂÇ¥¸¦ scrPos.z¿¡´Â 0¿¡¼­ 1»çÀÌÀÇ ±íÀÌ °ªÀ» ³Ö°í D3DXSprite::SetTransform() ÇÏ¸é ½ºÅ©¸° ÁÂÇ¥¿Í ±íÀÌ°ªÀÌ Àû¿ëµÇ¼­ ¿øÇÏ´Â °á°ú¸¦ ¾òÀ»¼ö ÀÖ´Ù.

 

GetScreenPos()¿Í WorldToScreen()´Â °°Àº °á°ú°ªÀ» ¹ÝȯÇÏ´Â ÇÔ¼öÀÌ´Ù.

 

void RenderSprite( IDirect3DDevice9* pd3dDevice, D3DXMATRIX* pMat )

{

    if( g_pSprite == NULL )

        CreateSprite( pd3dDevice );

 

    D3DXMATRIX world;

    D3DXVECTOR3 scrPos;

 

    D3DXMATRIX* pLightMat = g_LCamera.GetWorldMatrix();

    D3DXVECTOR3 pos = D3DXVECTOR3( pLightMat->_41, pLightMat->_42, pLightMat->_43 );

 

#if  0

    //3D Ç¥½Ã

    scrPos = GetScreenPos( pd3dDevice, pos );

#else

    //3D Ç¥½Ã

    WorldToScreen( pd3dDevice, scrPos, pos );

#endif

    D3DXMatrixTranslation( &world, scrPos.x, scrPos.y, scrPos.z );

    g_pSprite->SetTransform( &world );

    g_pSprite->Begin( D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE );

    RECT rectTemp = { 0, 0, 200, 30};

    g_pNameFont->DrawText(g_pSprite, L"Hello World!", -1, &rectTemp, 0,
                                  D3DCOLOR_COLORVALUE(1, 0, 0, 1) );

    g_pSprite->End();

}

 

< ¿ùµå ÁÂÇ¥¸¦ ½ºÅ©¸° ÁÂÇ¥·Î º¯È¯ 1>

¿ùµå ÁÂÇ¥¸¦ ½ºÅ©¸° ÁÂÇ¥·Î º¯È¯Çϴ ù ¹ø° ¹æ¹ýÀÌ´Ù.
¿ùµå ÁÂÇ¥¸¦ ºä Çà·Ä X ÇÁ·ÎÁ§¼Ç Çà·Ä¿¡ ÀÇÇؼ­ º¯È¯ÇÏ¸é °¡·Î, ¼¼·Î, ±íÀÌ´Â 0~1»çÀÌÀÇ °ªÀ» °¡Áö°Ô µÈ´Ù.  
pooint.x¿Í point.y´Â ½ºÅ©¸° ÁÂÇ¥·Î º¯È¯½ÃÅ°°í, z°ªÀº ±×´ë·Î ¹ÝȯÇÑ´Ù.

D3DXVECTOR3 GetScreenPos( IDirect3DDevice9* pd3dDevice, D3DXVECTOR3& pos )

{

    D3DXMATRIX matView = *g_VCamera.GetViewMatrix();

    D3DXMATRIX matProj = *g_VCamera.GetProjMatrix();

    D3DXMATRIX mat = matView * matProj;

 

    D3DXVECTOR3 point;

    D3DXVec3TransformCoord( &point, &pos, &mat );

 

    const D3DSURFACE_DESC* pBackBufferSurfaceDesc = DXUTGetD3D9BackBufferSurfaceDesc();

    float width = (float)pBackBufferSurfaceDesc->Width;

    float height = (float)pBackBufferSurfaceDesc->Height;


    //x, y¸¦ ½ºÅ©¸° ÁÂÇ¥·Î º¯È¯

    point.x = (  point.x + 1 ) * width  / 2;

    point.y = ( -point.y + 1 ) * height / 2;

 

    return point;

}

 

< ¿ùµå  ÁÂÇ¥¸¦ ±íÀÌ ¹öÆÛ °ªÀ¸·Î º¯È¯ >

D3DXVec3Project()¸¦ ÀÌ¿ëÇؼ­ ¿ùµå ÁÂÇ¥¸¦ 2D ÁÂÇ¥·Î Åõ¿µÇÏ°í ÀÖ´Ù.

D3DXVECTOR3* WorldToScreen( IDirect3DDevice9* pDevice, D3DXVECTOR3 &vScreenCoord, D3DXVECTOR3 vWorldLocation )

{

    D3DVIEWPORT9 viewPort;

    D3DXMATRIX matProj, matView, identity;

    pDevice->GetViewport( &viewPort );

    D3DXMatrixIdentity( &identity );

 

    //ºä, ÇÁ·ÎÁ§Æ®, ºäÆ÷Æ® ¼³Á¤

    matView = *g_VCamera.GetViewMatrix();

    matProj = *g_VCamera.GetProjMatrix();

    const D3DSURFACE_DESC* pBackBufferSurfaceDesc = DXUTGetD3D9BackBufferSurfaceDesc();

    viewPort.Width = (float)pBackBufferSurfaceDesc->Width;

    viewPort.Height = (float)pBackBufferSurfaceDesc->Height;

 

#if   0

    D3DXVec3Project( &vScreenCoord, &vWorldLocation, &viewPort, &matProj, &matView, &identity );

#else   

    //D3DXVec3Project() °°Àº °ªÀÌ ³ª¿Â´Ù. ¼Ò¼öÁ¡ ¾Æ·¡ 3ÀÚ¸® Â÷ÀÌÀÇ ¿ÀÂ÷°¡ ³­´Ù.

    Vec3Project( &vScreenCoord, &vWorldLocation, &viewPort, &matProj, &matView, &identity );

#endif

 

    if(vScreenCoord.z >= 0 && vScreenCoord.z <= 1)

        return &vScreenCoord;

    return NULL;

}

 

< D3DXVec3Project ±¸ÇöÇغ¸±â >

D3DXVec3Project() API¿¡ ´ëÇؼ­ ÀÚ¼¼ÇÏ°Ô ¾Ë¾Æº¸ÀÚ.

// Project vector from object space into screen space

D3DXVECTOR3* WINAPI D3DXVec3Project(
             D3DXVECTOR3 *pOut,
             CONST D3DXVECTOR3 *pV,
             CONST D3DVIEWPORT9 *pViewport,

             CONST D3DXMATRIX *pProjection,
             CONST D3DXMATRIX *pView,
             CONST D3DXMATRIX *pWorld);

¿ÀºêÁ§Æ® ÁÂÇ¥¸¦ 2D·Î Åõ¿µÇÏ´Â D3D  APIÀÌ´Ù.
Ä«¸Þ¶ó ºäÆ÷Æ®¿Í ÇÁ·ÎÁ§¼Ç Çà·Ä, ºä Çà·Ä, ¿ùµå Çà·ÄÀ» ³Ñ°ÜÁÖ¸é pv ÁÂÇ¥¸¦ 2D¿¡ Åõ¿µÇؼ­ pOut·Î º¯È¯ÇÑ´Ù.
¸®ÅÏ°ª pOut.z °ªÀÌ 0 ~ 1 »çÀÌ¿¡ ÀÖÀ¸¸é È­¸é¾È¿¡ ÀÖ´Â °æ¿ìÀÌ´Ù.

Vec3Project´Â D3DXVec3Project()¸¦ Á÷Á¢ ±¸ÇöÇÑ°ÍÀÌ´Ù.

/*

D3DXVec3Project(Out, V, Viewport, Proj, View, World)

a = (Vx, Vy, Vz, 1)

b = a×World×View×Proj

c = b⁄bw

Outx = ViewportX + ViewportWidth*(1+cx)/2

Outy = ViewportY + ViewportHeight*(1-cy)/2

Outz = ViewportMinZ + cz*(ViewportMaxZ-ViewportMinZ)

*/

D3DXVECTOR3* Vec3Project( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV, CONST D3DVIEWPORT9 *pViewport,

      CONST D3DXMATRIX *pProjection, CONST D3DXMATRIX *pView, CONST D3DXMATRIX *pWorld)

{

    D3DXVECTOR4 a = D3DXVECTOR4( pV->x, pV->y, pV->z, 1 );

    D3DXMATRIX  mat = (*pWorld) * (*pView) * (*pProjection);

    D3DXVECTOR4 b;   D3DXVec4Transform( &b, &a, &mat );

    D3DXVECTOR3 c = b / b.w;

 

    pOut->x = pViewport->X + pViewport->Width * (1+c.x)/2.0f;

    pOut->y = pViewport->Y + pViewport->Height * (1-c.y)/2.0f;

    pOut->z = pViewport->MinZ + c.z * (pViewport->MaxZ - pViewport->MinZ);

    return pOut;

}

´Ù¿î·Îµå: font_test.zip