Height Map

¾Æ¿ôµµ¾î ¹æ½Ä¿¡¼­ ÁöÇüÀ» Çü¼ºÀ» ÇØÁÖ´Â ¹æ½ÄÀÌ´Ù. Áö±Ý ¿©±â¼­ ´Ù·ê ÇÁ·Î±×·¥Àº rawÆÄÀÏÀ̶ó´Â ÀÏ¹Ý À̹ÌÁö ÆÄÀϰú´Â ´Ù¸£°Ô ¾ÐÃàÀ» ÇÏÁö ¾Ê°í ÇöÀç À̹ÌÁö¿¡ ±í
ÀÌ Á¤º¸°¡ µé¾î°¡ ÀÖ´Â À̹ÌÁöÀÌ´Ù. ½±°Ô ÀΰøÀ§¼º »çÁø °°Àº°Ç È®½ÇÇÑ À̹ÌÁö¶ó±â º¸´Ù´Â ±×³É ÁöÇüÀÇ ³ô³·À̸¸À» °¡Áö°í ÀÖ´Â ±×¸²ÀÌ´Ù.

ÀÌÇØÇÏ±â ÆíÇÏ°Ô µÎ °³ÀÇ À̹ÌÁö¸¦ º¸¸é¼­ ¾ê±â¸¦ Çϵµ·Ï ÇÏÀÚ.

Áö±Ý ¾ê±âÇϰí ÀÖ´Â ÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇÒ bmpÆÄÀϰú ¿©±â ÁöÇü »ý¼º¿¡ »ç¿ëµÉ rawÆÄÀÏÀ» Æ÷Åä˜Þ¿¡¼­ jpg·Î ¹Ù²ã¼­ º¸¿©ÁÖ´Â °ÍÀÌ´Ù. ÁöÇü¿¡´Â ÀÌ Àüü bmpÀ̹ÌÁö
¸¦ Àß¶ó¼­ º¸¿©ÁÖ°Ô µÇ°í ±× Á¶±ÝÇÑ ³ª´²Áø °÷ÀÇ ÁöÇüÀÇ ³ô³·ÀÌ´Â rawÆÄÀϾȿ¡ ±× Á¤º¸°¡ µé¾î°¡ À־ »© ³»´Â °ÍÀÌ´Ù.

±×·³ ÀÌ ÁöÇü Á¤º¸¸¦ °¡Áö°Ô ÇÏ´Â rawÆÄÀÏÀº ¾î¶»°Ô ¸¸µé±î? ¿äÁòÀÇ µðÁöÅÐ Ä«¸Þ¶ó´Â ÀÌ·± À̹ÌÁö¸¦ »ý¼ºÀ» Çϴ°¡ º»´Ù. ¾ÈÇØºÁ¼­ Àß ¸ð¸£°ÚÁö¸¸...
¾Æ¹«Æ° ÀÌ°É »ç¿ëÇØ¼­ ÁöÇüÀ» »ý¼ºÀ» ÇÑ´Ù. ÀÌ ÇÁ·Î±×·¥¿¡¼­ µÇ´Â ±â´Éµé¿¡ ´ëÇØ¼­ ¸ÕÀú ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.

¼Ò½º¸¦ ´Ù¿î ¹Þ¾Æ º¼±î¿ä?   (½ÇÇà ¼Ò½º´Ù¿î, »ç¿ëÀ̹ÌÁö1´Ù¿î, »ç¿ëÀ̹ÌÁö2´Ù¿î)

1.ÁöÇüÀ» »ý¼ºÀ» ÇÑ´Ù.
2.¿ÍÀ̾î ÇÁ·¹ÀÓ ¸ðµå·Î ¸¶¿ì½º ¿À¸¥ÂÊ ¹öưÀ¸·Î Á¶ÀýÀº ÇÑ´Ù.
3.¸¶¿ì½º ¿ÞÂÊÀ» ´©¸£¸é ¸ÖƼ ÅØ½ºÃÄ ¸ÅÇÎÀÌ ÀÌ·ç¾îÁø´Ù.
4.¸ÖƼ ÅØ½ºÃÄ ¸ÅÇÎÀÌ ÀÌ·ç¾îÁø »óÅ¿¡¼­ ½ºÆäÀ̽º¹Ù¸¦ ´©¸£¸é µÎ ¹øÂ° ÅØ½ºÃÄ ¸ÅÇÎµÈ À̹ÌÁö°¡ ¶¥ÀÌ °¥¶óÁø °Íó·³ º¸ÀÌ°Ô ÇØÁִµ¥ ±×°É Á»´õ »ç½Ç°¨ÀÖ°ÔÇÑ´Ù.
5.½ºÄ«ÀÌ ¹Ú½º¸¦ ÀÔÈù´Ù.
6.ÃÊ´ç ÇÁ·¹ÀÓ¼ö¸¦ üũÇÑ´Ù.

±×·³ ¾î¶»°Ô ÇØ¼­ ÁöÇüÀ» »ý¼ºÀ» ÇÏ´ÂÁö¸¸ ¿©±â¼­ ´Ù·ç°í ´Ù¸¥ ºÎºÐÀº ¼Ò½º¸¦ º¸¸é¼­ ¾Ë¾Æ¼­ ÀÌÇØÇϱ⠹ٶø´Ï´Ù.

LoadRawFile("Terrain.raw", MAP_SIZE * MAP_SIZE, g_HeightMap); //¸ÕÀú À̺κÐÀÌ Áö±Ý »ç¿ëµÉ raw°¡ Terrain.rawÀε¥ ±×°É ÀÐ¾î µéÀϸ¸Å­ÀÇ Å©±â¸¦
                           //BYTE g_HeightMap[MAP_SIZE * MAP_SIZE]·Î Àâ¾Æ ³õÀº ¸Þ¸ð¸®¿¡ Áý¾î ³Ö´Â´Ù. 16*16ÀÇ °ÝÀÚÅ©±â·Î Àâ¾Æ ³Ö´Â´Ù.

1024 *1024

     16*16

 

 

 

 

 

 

 

 

 ÀÌ ±×¸²À» ÀÌÇØ¸¦ ÇÒ ¼ö°¡ ÀÖ³ª¿ä? ±×´Ñ±î rawÆÄÀÏÀÌ 1024*1024Àε¥ ÀÌ·¸°Ô °ÝÀÚ·Î ³ª´²¼­ °¡·Î64°³, ¼¼·Î64°³·Î ¸¸µé¾îÁشٴ °ÍÀÌ´Ù.

±×·³ rawÆÄÀÏÀ» ÀÐ¾î µé¿©¼­ ±×°É °¡Áö°í ÅØ½ºÃÄ ¸ÅÇÎÀ» ÇÒ ¼ö ÀÖ°Ô ÁÂÇ¥¸¦ Àâ¾Æ ÁÖ´Â °ÍÀÌ´Ù.

void RenderHeightMap(BYTE pHeightMap[]) //ÁöÇü ÁÂÇ¥¸¦ »ý¼ºÇÏ°í ±× ÁÂÇ¥¿¡ ¸Â°Ô ÅØ½ºÃÄ ¸ÅÇÎÀ» ÇÑ´Ù.
{
        int X = 0, Y = 0;                               
        int x, y, z;                                    
        bool bSwitchSides = false;
        if(!pHeightMap) return;         

        glBindTexture(GL_TEXTURE_2D, g_Texture[0]); //ÅØ½ºÃÄ ¸ÅÇÎÀ» ÇÒ ÅØ½ºÃÄ À̸§À» ÁöÁ¤..
        //ÀÌ ¾Æ·¡ ºÎºÐÀº 1¿¡¼­´Â °¢ ŸÀÏÀ» Quads·Î Çߴµ¥ GL_TRIANGLE¿Í ´Þ¸® GL_TRIANGLE_STRIP¹æ¹ýÀº »ç°¢ÇüÀ» ±×¸®´Âµ¥ 4Á¡¸¸À¸·Î µÇ¹Ç·Î
        //¼Óµµ¸¦ ÈξÀ ³ôÀϼö°¡ ÀÖ´Ù. ¿©±â¼­ ¸Þ¸ð¸® °ø°£À» ´õ Â÷Áö ¾Ê´Â°Ô ´õ ¼Óµµ´Â Àß ³ª¿À°Å´Ù. ·£´õ¸µ ¼Óµµ·Î ÆÇ´ÜÇϴµ¥ ¾ÆÁ÷Àº ±× ºÎºÐ±îÁö´Â...

        glBegin( GL_TRIANGLE_STRIP );                   
        for ( X = 0; X <= MAP_SIZE; X += STEP_SIZE )
        {
                if(bSwitchSides) //¹Ý´ëÀÇ ·»´õ ¹æ¹ýÀÌ´Ù. ³¡¿¡¼­ ¿À´Â°Í°ú 0ºÎÅÍ ½ÃÀÛÇØ¼­ ·»´õÇÏ´Â ¹æ¹ýÀÌ´Ù.
                {       
                        for ( Y = MAP_SIZE; Y >= 0; Y -= STEP_SIZE )
                        {               
                                x = X;                                                  
                                y = Height(pHeightMap, X, Y );
                                //y´Â ÀоîÁø °ª¿¡ ÀÇÇØ¼­ º¯Çϴµ¥ rawÆÄÀÏÀ» ºÐ¼®À» ¸øÇؼ­ ÀÌÇØ°¡ µÇÁú ¾Ê´Â´Ù.  
                                z = Y;                                                   
                                SetTextureCoord( (float)x, (float)z );
                                glVertex3i(x, y, z);            

                                x = X + STEP_SIZE;
                                y = Height(pHeightMap, X + STEP_SIZE, Y );
                                z = Y;
                                SetTextureCoord( (float)x, (float)z );
                                glVertex3i(x, y, z);                    
                        }
                }
                else
                {       
                        for ( Y = 0; Y <= MAP_SIZE; Y += STEP_SIZE )
                        {               
                                x = X + STEP_SIZE;
                                y = Height(pHeightMap, X + STEP_SIZE, Y );
                                z = Y;
                                SetTextureCoord( (float)x, (float)z );
                                glVertex3i(x, y, z);

                                x = X;                                                  
                                y = Height(pHeightMap, X, Y );  
                                z = Y;                                                  
                                SetTextureCoord( (float)x, (float)z );
                                glVertex3i(x, y, z);            
                        }
                }
                bSwitchSides = !bSwitchSides;
        }
        glEnd();
}

//ÀÌ ºÎºÐÀÌ RenderScene()ºÎºÐ¿¡¼­ Ä«¸Þ¶ó°¡ ¹Ù´Ú¿¡ ¸ø µé¾î°¡°Ô ÇØÁÖ´Â ºÎºÐÀÌ´Ù. Æò¸éÀÇ ¹æÁ¤½ÄÀ» »ç¿ëÇѴٴµ¥ ¿©±â¼± ¾Æ´Ï´Ù.

CVector3 vPos     = g_Camera.Position();
CVector3 vNewPos    = vPos;
if(vPos.y < Height(g_HeightMap, (int)vPos.x, (int)vPos.z ) + 10) //yÃà°úÀÇ °Å¸®°¡ 10¾È¿¡ µé¾î°¡°Ô µÇ¸é Ä«¸Þ¶óÀÇ À§Ä¡¸¦ ³»·Á¿Â ¸¸Å­ ¿Ã·ÁÁÖ´Â °ÍÀÌ´Ù.
{
  vNewPos.y = (float)Height(g_HeightMap, (int)vPos.x, (int)vPos.z ) + 10;
  float temp = vNewPos.y - vPos.y;

  CVector3 vView = g_Camera.View();
  vView.y += temp;
  g_Camera.PositionCamera(vNewPos.x,  vNewPos.y,  vNewPos.z,    vView.x, vView.y, vView.z,      0, 1, 0);               
}

ÀÌ·± ½ÄÀ¸·Î Ãæµ¹ 󸮸¦ ÇÏ´Â°Ç ¹®Á¦°¡ ÀÖÀ» ¼ö ÀÖ´Ù. ÁöÇü¿¡ ´ëÇØ¼­ ¸¹Àº ºÎºÐ¿¡ ´ëÇØ¼­ ´Ù 󸮸¦ ÇØÁà¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. 3D¿£ÁøÀ» ¸¸µå´Âµ¥ Ç×»ó »ý°¢ÇØÁà¾ß
ÇÏ´Â ºÎºÐÀÌ ¾ó¸¶³ª »¡¸®, Àû°Ô ¸Þ¸ð¸® °ø°£À» »ç¿ëÀ» ÇÏ°í ¶Ç °è»êÀ» ÇØ¼­ Ãæµ¹Ã³¸®µçÁö ·£´õ¸µ ¼Óµµ¸¦ Çâ»ó ½ÃÄÑ Áà¾ßÇÏ´ÂÁöÀÇ ¿©ºÎ¸¦ »¡¸®ÇØÁÖ´Â °ÍÀε¥...

ÀÌ·± °è»ê ¹æ¹ýÀ¸·Î´Â Á¼Àº °ø°£¿¡¼­´Â »ó°üÀÌ ¾øÁö¸¸ ÀÌ ÁöÇü°ú »ó°üÀÌ ¾ø´Â ¾î¶² ¿ÀºêÁ§Æ®¿¡ ´ëÇÑ Ãæµ¹ 󸮴 ¶Ç ´Ù¸¥ ¹æ¹ýÀ» »ç¿ëÇØ¾ß ÇϹǷΠ¹®Á¦°¡ ÀÖÀ» ¼ö
ÀÖ´Ù.

¸ÖƼ ÅØ½ºÃĸµÀ» ÇÏ´Â ºÎºÐ¿¡µÎ Ãß°¡µÇ´Â ¼Ò½º°¡ Àִµ¥ ±× ºÎºÐ¿¡ ´ëÇØ¼­´Â ¼Ò½º¸¦ ´Ù¿îÀ» ¹Þ¾Æ¼­ Çѹø ½ÇÇàÇØ º¸±¸ ±× ¼Ò½º ºÎºÐ¿¡ ³»¿ëÀ» ÆÄ¾ÇÇϸé ÁÁÀ» µí ½Í
´Ù. ±×·¯±¸ gametutorial¿¡¼­ Height Map1,2¸¦ ´Ù¿î ¹Þ¾Æ¼­ ³»¿ëÀ» º¸½Ã´Â°Ô ´õ ÀÌÇØ¸¦ µ½´Âµ¥ È¿°úÀûÀÏ °ÍÀÌ´Ù.