ÇÁ·¹ÀÓ »ç¿ë Çϱâ

»ùÇà ÇÁ·Î±×·¥À» ½±°Ô »ç¿ëÇϱâ À§ÇØ DX ÇÁ·¹ÀÓÀ» ¸¸µé¾úÁö¸¸ ½Ã°£ÀÌ ¾î´ÀÁ¤µµ Áö³ª°í ³ª¼­
³ªµµ Âg±ò¸°´Ù. ±×·¡¼­ °£´ÜÇÏ°Ô ÇÁ·¹ÀÓÀ» »ç¿ëÇÒ ¼ö ÀÖ´Â ¿¹¸¦º¸ÀÌ°Ù´Ù.
±×¸®°í °£´ÜÇÏ°Ô, ¸¶¿ì½º ÈÙ¿¡ ´ëÇÑ Ã³¸® ¼öÁ¤°ú ¹öÀüÀ» µµÀÔ ÇÏ¿´´Ù.

ÇÁ·¹ÀÓÀ» »ç¿ëÇϱâ À§ÇØ ¸ÕÀú ÇÒ ÀÏÀº CApplciationÀ» »ó¼ÓÇÑ testapp.h, testapp.cpp ÆÄÀÏÀ» ¸¸µç´Ù.
¾Æ·¡ÀÇ °¡»ó ÇÔ¼öµéÀ» »ó¼ÓÇÑ´Ù.

½ÇÁ¦ ¿¹¸¦ º¸À̱â À§ÇØ ÁÖÀüÀÚ¿Í Directional Light¿Í ÅؽºÃÄ ·»´õ¸µÇÑ´Ù.

testapp.h

protected:

    virtual bool ProcessKey(HWND hWnd, WPARAM wKey);

    virtual bool PostGraphics();

    virtual void Cleanup();

    virtual void Render();

    virtual void Update();

testapp.cpp

bool CTestApp::PostGraphics()

{

    return true;

}

//---------------------------------------------------------------------------------

void CTestApp::Cleanup()

{

    CApplication::Cleanup();

}

//---------------------------------------------------------------------------------

void CTestApp::Update()

{

}

//---------------------------------------------------------------------------------

void CTestApp::Render()

{

}

//---------------------------------------------------------------------------------

bool CTestApp::ProcessKey(HWND hWnd, WPARAM wKey)

{

    return CApplication::ProcessKey(hWnd, wKey);

}

 

ÁÖÀüÀÚ ±×¸®±â

    //1. ¼±¾ð

    ID3DXMesh* m_pTeapotMesh;

 

 

    //2. »ý¼º

    IDirect3DDevice9 * pDevice = m_pGraphics->GetDevice();

    D3DXCreateTeapot(pDevice, &m_pTeapotMesh, 0);

 

 

    //3. ·»´õ¸µ

    m_pTeapotMesh->DrawSubset(0);

 

    //4. ÇØÁ¦

    if(m_pTeapotMesh)

    {

        m_pTeapotMesh->Release();

        m_pTeapotMesh = 0;

    }

¼Ò½º Äڵ常À¸·Îµµ ½±°Ô ÀÌÇØ°¡ °¥ °ÍÀÌ´Ù.

ÁÖÀüÀÚ¿¡ Directional Light ºñÃß±â

void CTestApp::InitDirectionalLight()

{

    IDirect3DDevice9 * pDevice = m_pGraphics->GetDevice();

 

    D3DLIGHT9 light;

    ZeroMemory( &light, sizeof(light) );

    light.Type = D3DLIGHT_DIRECTIONAL;

 

    D3DXVECTOR3 vecDir;

    vecDir = D3DXVECTOR3(0.0f, 0.0f, 1.0f);

    D3DXVec3Normalize((D3DXVECTOR3*)&light.Direction, &vecDir );

 

    // set directional light diffuse color

    light.Type  = D3DLIGHT_DIRECTIONAL;

    light.Diffuse = D3DXCOLOR( 1.f, 1.f, 1.f, 1.f );

    light.Ambient = D3DXCOLOR( 0.f, 0.f, 0.f, 1.f );

 

    pDevice->SetLight( 0, &light );

    pDevice->LightEnable( 0, TRUE );

    pDevice->SetRenderState( D3DRS_LIGHTING, TRUE );

    pDevice->SetRenderState( D3DRS_ZENABLE,  TRUE );

    //Ambient Light ¼³Á¤

    pDevice->SetRenderState(D3DRS_AMBIENT, 0x00202020);

 

 

    D3DMATERIAL9 mtrl;

    ZeroMemory( &mtrl, sizeof(mtrl) );

    mtrl.Diffuse = D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f );

    mtrl.Ambient = D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f );

 

    pDevice->SetMaterial( &mtrl );

    pDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);

    //·»´õ¸µÀü¿¡ ¹öÅؽºÀÇ ³ë¸»°ªÀ» Á¤±ÔÈ­

    //pDevice->SetRenderState(D3DRS_NORMALIZENORMALS, TRUE);

}

¿©±âµµ ¼Ò½º¸¦ º¸¸é¼­ °³ÀÎÀûÀ¸·Î ÀÌÇØÇϱ⠹ٶõ´Ù.

ÁÖÀÇ) ÇÁ·¹ÀÓ¿¡¼­ ÈÙ¸¶¿ì½º¸¦ ¿òÁ÷À̸é Scale Matrix¿¡ ÀÇÇØ È®´ë Ãà¼Ò¸¦ Çϴµ¥, È®´ë ½Ãų¼ö·Ï ÁÖÀüÀÚ°¡ įįÇØÁö°í ÀÖ´Ù.  ¿ì¼± ÀÌÀ¯ÀÎÁö ¸ô¶ó¼­ Á¶»çÇغ¸´Ï, È®´ë Ãà¼Ò°¡ ÀÖ´Â °æ¿ì ³ë¸Ö°ªÀÌ ºñÁ¤±ÔÈ­ µÇ±â ¶§¹®¿¡ ¾Æ·¡ÀÇ ÄÚµå·Î ÀçÁ¤±ÔÈ­ ½ÃÄÑ¾ß ÇÑ´Ù.

   pDevice->SetRenderState(D3DRS_NORMALIZENORMALS, TRUE);

D3DRS_NORMALIZENORMALS·Î ¸Å ÇÁ·¹ÀÓ¸¶´Ù ÀçÁ¤±ÔÈ­ ÇÏ°Ô µÇ¸é ¼Óµµ ÀúÇÏ°¡ Àֱ⠶§¹®¿¡
È®´ë, Ãà¼Òº¸´Ù´Â Ä«¸Þ¶ó À§Ä¡¸¦ ¹Ù²Ù°Å³ª, ¸ðµ¨À» À̵¿ÇÏ¿© È®´ë Ãà¼Ò¸¦ Ç¥ÇöÇϴ°ɷΠ¼öÁ¤ ÇÏ¿´´Ù.

±×¸®°í ÇÁ·¹ÀÓÀÇ ¹öÀü ¹øÈ£¸¦ ºÙÀ̱â·Î Çß´Ù.

application.h¿¡ ´ÙÀ½°ú °°ÀÌ ¹öÀü Ãß°¡

//application.h
//ver 0.77

 

½ºÄÉÀÏÀ» ¸Þ½¬ À̵¿À¸·Î ¼öÁ¤

±âÁ¸ ÄÚµå

void CTestApp::Render()

{

    D3DXMATRIX   matScale, matRot, matWorld;

    D3DXMatrixScaling( &matScale, m_cameraRef.fScale, m_cameraRef.fScale, m_cameraRef.fScale);

    D3DXMatrixRotationYawPitchRoll( &matRot, D3DXToRadian(m_cameraRef.fRotateX), D3DXToRadian(m_cameraRef.fRotateY), 0.0f );

 

    matWorld = matScale * matRot;

 

    IDirect3DDevice9 * pDevice = m_pGraphics->GetDevice();

    pDevice->SetTransform(D3DTS_WORLD, &matWorld);

 

    ........

}

¼öÁ¤µÈ ÄÚµå

oid CTestApp::Render()

{

    D3DXMATRIX   matTranslation, matRot, matWorld;

    D3DXMatrixTranslation( &matTranslation, 0.0f, 0.0f, m_cameraRef.wheel * 2.0f);

    D3DXMatrixRotationYawPitchRoll( &matRot, D3DXToRadian(m_cameraRef.fRotateX), D3DXToRadian(m_cameraRef.fRotateY), 0.0f );

    IDirect3DDevice9 * pDevice = m_pGraphics->GetDevice();

 

    matWorld = matRot * matTranslation;

    pDevice->SetTransform( D3DTS_WORLD, &matWorld);

 

    ........

}

 

Ä«¸Þ¶ó°¡ Y-UPÀ̱⠶§¹®¿¡, Z°ª¿¡ ÀÇÇØ È®´ë, Ãà¼Òó·³ º¸ÀÌ°Ô²û ¼öÁ¤Çß´Ù.
CameraReference ±¸Á¶Ã¼ÀÇ fScale ¸â¹ö º¯¼ö¸¦ wheel º¯¼ö·Î ¼öÁ¤ÇÏ¿´´Ù.

ÁÖÀüÀÚÀÇ Å©±â ¶§¹®¿¡ void CGraphics::SetupCamera()¸Þ½îµåÀÇ Ä«¸Þ¶ó À§Ä¡¸¦ -15·Î ¼öÁ¤ÇÑ °Í ¹Û¿¡ ¾ø´Ù.

¸¶¿ì½º·Î ȸÀüÇÒ ¶§, ÁÂÇ¥ Ãà°ú Á¤È®ÇÏ°Ô ÀÏÄ¡ÇÏÁö ¾Ê´Â´Ù. (¹ö±× T.T)
ÁÖÀüÀÚ¿¡ ÅؽºÃĸ¦ ÀÔÈ÷´Â °ÍÀº D3DXCreateTeapot()·Î ¸Þ½¬ »ý¼º½Ã ÅؽºÃÄ ÁÂÇ¥°¡ ¾ø±â ¶§¹®¿¡ ºÒ°¡´ÉÇÑ°Í °°´Ù. ¸¸¾à¿¡ °¡´É ÇÏ´Ù¸é ¿¬¶ô ÇØÁֱ⠹ٶõ´Ù.