|
|
|
|
|
|
Additional info
|
|
|
|
|
Latest Forum posts
|
|
|
|
|
Ads
|
|
|
|
|
|
|
|
|
|
|
|

À̹ø tutorial¿¡¼´Â ³ÐÀº ÁöÇü(landscape)À» ±×·Áº¸°Ú½À´Ï´Ù. Áö±Ý±îÁö´Â »ï°¢ÇüµéÀÇ ÁÂÇ¥°ªÀ» ÀÏÀÏÈ÷ ÁöÁ¤ÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇØ ¿Ô½À´Ï´Ù¸¸, ³ÐÀº ÁöÇüÀº ¼ö¹é, ȤÀº ¼öõ °³ÀÇ vertexµéÀ» ´Ù·ç¾î¾ß ÇϹǷΠ±×·± ¼öµ¿ÀûÀÎ ¹æ¹ýÀ¸·Î Ç¥ÇöÇϱâ´Â ¹«¸®°¡ ÀÖ½À´Ï´Ù. ÀÌÁ¦ºÎÅÍ´Â ÆÄÀÏÀÇ ³»¿ëÀ» Àоî¿À´Â ¹æ¹ýÀ¸·Î vertexµéÀÇ ÁÂÇ¥°ªÀ» ´Ù·çµµ·Ï ÇսôÙ.
À̹ø tutorial¿¡¼ ±×¸± ÁöÇüÀº 64*64ÀÇ ÁöÇüÀÔ´Ï´Ù. 4096°³ÀÇ vertex°¡ ÇÊ¿äÇÏ´Ï ²Ï ³ÐÀº ÁöÇüÀÌ µÇ°Ú³×¿ä. ÀÌÀü tutorialÀ» Âü°íÇØº¸¸é ÁöÇüÀ» ±×¸®´Âµ¥ ÀÖ¾î¼ xÃà, yÃà ÁÂÇ¥°ªÀº Ç×»ó ÀÏÁ¤ÇÑ °ªÀ» À¯ÁöÇÏ°Ô µÇ°í, »ç½Ç»ó ÁöÇüÀ» Ç¥ÇöÇϴµ¥ Àǹ̸¦ °¡Áö´Â °ªÀº zÃà ÁÂÇ¥°ªÀÓÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. 64*64 ÁöÇüÀÇ zÃà ÁÂÇ¥°ªÀ» Ç¥ÇöÇϱâ À§ÇØ ¿ì¸®´Â 64*64Å©±âÀÇ grayscale À̹ÌÁö ÆÄÀÏÀ» »ç¿ëÇÒ °ÍÀÔ´Ï´Ù. ÀÌ·± Á¾·ùÀÇ À̹ÌÁö¸¦ ÀϹÝÀûÀ¸·Î height mapÀ̶ó°í ºÎ¸£¸ç °¢ pixelÀÇ ¡®white value¡¯°¡ ¹Ù·Î zÃà ÁÂÇ¥°ªÀ» ÀǹÌÇÕ´Ï´Ù. ¡®white value¡¯´Â °ËÀº»ö(=0=00)°ú Èò»ö(=255=ff)»çÀÌÀÇ °ªÀÔ´Ï´Ù. ¿¹¸¦ µé¾î [5,5] pixelÀÌ °ËÀº»öÀ̶ó¸é »ö»ó°ªÀÌ 00À̹ǷΠ[x=5,y=5] À§Ä¡ÀÇ vertexÀÇ zÃà ÁÂÇ¥°ªÀº 0À̵˴ϴÙ. [10, 10] pixelÀÌ Èò»öÀ̶ó¸é »ö»ó°ªÀÌ 255À̹ǷΠ[x=10,y=10] À§Ä¡ÀÇ vertexÀÇ zÃà ÁÂÇ¥°ªÀº 255°¡ µË´Ï´Ù. ÀÌ·¸°Ô grayscale·Î zÃà ÁÂÇ¥°ª(³ôÀ̰ª)À» ³ªÅ¸³»´Â À̹ÌÁö°¡ °¡Àå ±âº»ÀûÀÎ height mapÀÌ¸ç ½ÇÁ¦·Î´Â grayscale À̹ÌÁö ¿Ü¿¡µµ ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î height mapÀ» Ç¥ÇöÇϰí ÀÖ½À´Ï´Ù.
¿ì¸®°¡ grayscale À̹ÌÁö¸¦ Á÷Á¢ ¸¸µå´Â ´ë½Å¿¡ ¿©±â¼´Â Reimer¾¾°¡ ¸¸µé¾îµÐ example À̹ÌÁö¸¦ »ç¿ëÇϵµ·Ï ÇսôÙ. ¹°·Ð Reimer¾¾ÀÇ example À̹ÌÁö ´ë½Å¿¡ ÀÚ½ÅÀÌ Á÷Á¢ 64*64 Å©±âÀÇ À̹ÌÁö¸¦ ¸¸µé¾î ½áµµ ÁÁ½À´Ï´Ù.
ÀÌÁ¦ »õ·Î¿î Windows Game ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇϰí ÇÊ¿äÇÑ ÆÄÀϵéÀ» ÀÌÀüÀÇ tutorial¿¡¼ º¹»çÇØ ¿É½Ã´Ù.
À̹ÌÁö ÆÄÀÏÀ» Àбâ À§ÇØ °¡Àå ¸ÕÀú ÇÒ ÀÏÀº namespace Ãß°¡ ÀÔ´Ï´Ù. ¿ì¸® ¸ðµÎ C#À» ÀÌ¹Ì ¾Ë°í ÀÖÀ¸´Ï ´ç¿¬ÇÏ°Ô ´À²¸Áú °Í ÀÔ´Ï´Ù.
using System.IO;
±×¸®°í ¿ì¸®´Â 64*64ÀÇ ÁöÇüÀ» Ç¥ÇöÇÒ °ÍÀ̹ǷΠ±âÁ¸ÀÇ µÎ Àü¿ª º¯¼ö, WIDTH¿Í HEIGHTÀÇ °ªÀ» º¯°æÇØ ÁݽôÙ.
int WIDTH = 64;
ÀÌÁ¦ ÆÄÀÏÀ» Àбâ À§ÇØ ±âÁ¸ÀÇ LoadHeightDataÇÔ¼öÀÇ ³»¿ëÀ» ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇսôÙ.
private void LoadHeightData() { heightdata = new int[WIDTH, HEIGHT]; FileStream fs = new FileStream("../../../XNA.raw", FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fs); for (int y = 0; y < HEIGHT; y++) { for (int x = 0; x < WIDTH; x++) { int height = (int)(br.ReadByte() / 50); heightdata[x, HEIGHT - 1 - y] = height; } } br.Close(); }
Äڵ忡¼ º¸¿©Áö´Â °Í°ú °°ÀÌ À̹ÌÁö ÆÄÀÏÀ» Àд ÄÚµå´Â C#ÀÇ ±×°Í°ú ÀüÇô ´Ù¸¥°ÍÀÌ ¾ø½À´Ï´Ù. µÎ ¹øÂ° ¶óÀκÎÅÍ raw À̹ÌÁö ÆÄÀÏÀ» ÀнÀ´Ï´Ù. À̹ÌÁö ÆÄÀÏÀÇ format¿¡´Â ¿©·¯ °¡Áö°¡ ÀÖ½À´Ï´Ù¸¸ ±»ÀÌ raw À̹ÌÁö¸¦ »ç¿ëÇÑ ÀÌÀ¯´Â raw formatÀº header°¡ Á¸Àç ÇÏÁö ¾Ê°í ¼ø¼öÇÏ°Ô data·Î¸¸ ±¸¼ºµÇ¾î ÀÖ¾î¼ ÆÄÀÏ ÀбⰡ ¸Å¿ì °£ÆíÇϱ⠶§¹®ÀÔ´Ï´Ù. ¿¹¸¦ µé¾î jpeg À̹ÌÁö´Â ¼Õ½ÇÇü ¾ÐÃà À̹ÌÁö À̹ǷΠµðÄÚµùÀÌ ÇÊ¿äÇϸç pixelÀÇ »ö»ó°ªµµ µðÄÚµù ÇÒ ¶§¸¶´Ù ¾à°£¾¿ ¿ÀÂ÷°¡ ÀÖÀ» ¼ö ÀÖÀ¸¹Ç·Î height map Ç¥Çö¿¡ Àß ¾²ÀÌÁö ¾Ê´Â À̹ÌÁö format ÀÔ´Ï´Ù. ´Ù¸¸ raw À̹ÌÁöÀÇ °æ¿ì ÁöÇüÀÇ Å©±â¿¡ ºñ·ÊÇØ¼ ÆÄÀÏÀÇ Å©±âµµ Áõ°¡ÇÑ´Ù´Â ´ÜÁ¡ÀÌ ÀÖ½À´Ï´Ù. ´Ù½Ã ÄÚµå·Î µ¹¾Æ¿Í¼, 4¹øÂ° ¶óÀÎÀº raw À̹ÌÁö¸¦ byteÇü½ÄÀ¸·Î Àбâ À§ÇÑ binary reader¸¦ »ý¼ºÇÏ´Â ÄÚµåÀÔ´Ï´Ù. ±×¸®°í ÃÑ 64*64¹ø, 4096¹ø data(=byte)¸¦ Àоî¿Í¼ ¹è¿ÀÇ ÇØ´ç À§Ä¡¿¡ °ªÀ» ÁöÁ¤ÇÕ´Ï´Ù. À̶§ Àоî¿Â byte¸¦ 50À¸·Î ³ª´©¾î ÁÖ´Â ÀÌÀ¯´Â ÇöÀç raw À̹ÌÁö data¸¦ ±×´ë·Î »ç¿ëÇÏ°Ô µÇ¸é ÃÖ´ë°ª°ú ÃÖ¼Ò°ª »çÀÌÀÇ Â÷ÀÌ ³Ê¹« Å©±â ¶§¹®ÀÔ´Ï´Ù. ÃÖ¼Ò°ªÀº 0À̰í ÃÖ´ë°ªÀº 255Àε¥ ÀÌ data¸¦ ±×´ë·Î zÃà ÁÂÇ¥°ªÀ¸·Î »ç¿ëÇÑ´Ù¸é ¹Ì°ü»ó º¸±â ¾È ÁÁ°ÚÁö¿ä. °Ô´Ù°¡ ÀÌ·¸°Ô ³Ê¹« ±Þ°ÝÇÑ °æ»ç¸¦ °¡Á®¼¾ß ÁöÇüÀ̶ó°í ºÎ¸£±âµµ Èûµé °Í ÀÔ´Ï´Ù. 50À¸·Î ³ª´©¾îÁÖ¸é zÃà ÁÂÇ¥°ªÀº ÃÖ¼Ò 0ºÎÅÍ ÃÖ´ë 5±îÁöÀÇ °ªÀ» °¡Áö¹Ç·Î ²Ï º¸±â ÁÁÀº ÁöÇüÀÌ ³ª¿Ã °Í °°½À´Ï´Ù. ´ÙÀ½À¸·Î À¯ÀÇÇØ¾ß ÇÒ Á¡Àº ¹è¿¿¡ data¸¦ ä¿ì´Â ¼ø¼ÀÔ´Ï´Ù. raw À̹ÌÁöÀÇ data´Â µÚÁýÇô¼(inversely) ÀúÀåµÇ¾î ÀÖ½À´Ï´Ù. ±×·¯¹Ç·Î ¹è¿¿¡ data¸¦ ÀúÀåÇÒ ¶§´Â ÆÄÀÏÀº À§¿¡¼ ¾Æ·¡·Î(top¡æbottom)À¸·Î ÀÐ¾î¼ ¹è¿ÀÇ ¾Æ·¡ºÎÅÍ À§·Î(bottom¡ætop)À¸·Î ÀúÀåÇØ¾ß ÇÕ´Ï´Ù. (heightdata[x, HEIGHT - 1 - y])
ÀÌÁ¦ ÁöÇüÀ» ±×¸± Áغñ´Â ¸ðµÎ ³¡³ ¼ÀÀÌÁö¸¸ ÀÌ´ë·Î ½ÇÇàÇϸé ÁöÇüÀÇ À§Ä¡¿Í Ä«¸Þ¶óÀÇ À§Ä¡ ¶§¹®¿¡ Àüü ÁöÇüÀÌ º¸ÀÌÁö ¾Ê½À´Ï´Ù. ¸ÕÀú, ÁöÇüÀÇ À§Ä¡¸¦ Á¤Áß¾ÓÀ¸·Î ¿Å°Üº¸°Ú½À´Ï´Ù. ÁöÇüÀÇ Á¤Áß¾ÓÀÌ ÁÂÇ¥°èÀÇ ¿øÁ¡(0.0f, 0.0f, 0.0f)ÀÌ µÇµµ·Ï º¯È¯µÈ ¿ùµå ÁÂÇ¥°è¸¦ »ý¼ºÇØ¾ß ÇÕ´Ï´Ù. DrawÇÔ¼öÀÇ ¿ùµå ÁÂÇ¥°è »ý¼º Äڵ带 ´ÙÀ½°ú °°ÀÌ º¯ÇüÇսôÙ.
Matrix worldMatrix = Matrix.CreateTranslation(-HEIGHT / 2, -WIDTH / 2, 0);
ÁöÇüÀÌ ÀÌÁ¦ ȸé Áß¾Ó¿¡ À§Ä¡ÇÏ°Ô µÇ¾úÀ¸´Ï Ä«¸Þ¶óÀÇ À§Ä¡¸¦ ¿Å°Ü º¾½Ã´Ù. SetupCameraÇÔ¼öÀÇ view matrix¿Í projection matrix »ý¼º ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇսôÙ.
Matrix viewMatrix = Matrix.CreateLookAt(new Vector3(0.0f, -40.0f, 60.0f), new Vector3(0.0f, -5.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f)); Matrix projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, Window.ClientBounds.Width / Window.ClientBounds.Height, 1.0f, 150.0f);
Ä«¸Þ¶óÀÇ À§Ä¡¸¦ µÚ·Î ¿Å°Ü¼ ´õ ³ÏÀº °ø°£À» ¹Ù¶óº¼ ¼ö ÀÖ°Ô Çß½À´Ï´Ù. ¿©±â¼ ÇѰ¡Áö À¯ÀÇÇÒ Á¡Àº ½Ã¾ß°¢ÀÌ ³Ð¾îÁø ¸¸Å projection matrixÀÇ ½Ã¾ß °Å¸® ¶ÇÇÑ Áõ°¡½ÃÄѼ ´õ ¸Ö¸®±îÁö º¼ ¼ö ÀÖ°Ô ÇØÁÖ¾î¾ß ÇÑ´Ù´Â Á¡ ÀÔ´Ï´Ù. ±âÁ¸ÀÇ ½Ã¾ß °Å¸®´Â 50.0f ¿´´Âµ¥, Áö±ÝÀº Ä«¸Þ¶ó¿Í ÁÂÇ¥°è ¿øÁ¡°úÀÇ °Å¸®°¡ 40.0f À̹ǷΠ±×´ë·Î µÎ¸é Ä«¸Þ¶ó¿Í 50.0f ÀÌ»óÀÇ °Å¸®¸¦ °¡Áö´Â °¡ÀåÀÚ¸® ºÎºÐÀº ȸ鿡 º¸ÀÌÁö ¾Ê°Ô µË´Ï´Ù. ½Ã¾ß °Å¸®¸¦ 150.0f Á¤µµ·Î ÃæºÐÈ÷ ´Ã·ÁÁݽôÙ. Matrix.CreatePerspectiveFieldOfViewÇÔ¼öÀÇ ¸¶Áö¸· parameter°¡ ½Ã¾ß °Å¸® ÀÔ´Ï´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº MSDNÀ» ÂüÁ¶ÇÏ±æ ¹Ù¶ø´Ï´Ù.
ÀÌÁ¦ µð¹ö±×(F5)۸¦ ´·¯ ½ÇÇà½ÃŰ¸é ¿ì¸®°¡ ¸¸µç 64*64ÀÇ ÁöÇüÀ» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù. Example·Î Á¦°øµÈ XNA.raw À̹ÌÁö¿Í ¿ì¸®°¡ ¸¸µç ÁöÇüÀÇ ¸ð½ÀÀ» ºñ±³Çغ¸°í, ±× ¿Ü¿¡µµ ´Ù¸¥ grayscale À̹ÌÁö¸¦ Àû¿ëÇÏ¿© ±× °á°ú¸¦ Á÷Á¢ È®ÀÎÇØ º¸±æ ¹Ù¶ø´Ï´Ù.
- Website design & XNA + DirectX code : Riemer Grootjans - ©2003 - 2008 Riemer Grootjans
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2007 - 2008 MVP Award DirectX - XNA
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Support this site -- any amount is welcome !
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|