¡á 3D Engine

** Realtime Dynamic Level of Detail Terrain rendering with ROAM **
¿ø¹® : By Bryan Turner Gamasutra April 03, 2000
[¹ø¿ª : À̺À½Ä - 2000³â 4¿ù 20ÀÏ]

¸ñ Â÷
¢º Introduction to Terrain Visualization
¢º Explanation of Patch Class
¢º Roam Engine Qualifiers

ÀÌ ±ÛÀ» Seumas McNally¿¡°Ô ¹ÙĨ´Ï´Ù.
ÀÌ ±ÛÀÇ ³¡¿¡ ÀÖ´Â ¿¡Çʷα׸¦ ºÁ ÁÖ¼¼¿ä.

ÀÌ ±Û¿¡ °ü·ÃµÈ µ¥¸ð ÇÁ·Î±×·¥Àº ¿©±â¼­ ´Ù¿î ¹ÞÀ¸¼¼¿ä.

¸¹Àº »ç¶÷µé°ú ¸¶Âù°¡Áö·Î ³ª´Â ±¼°îÁø ¾ð´ö°ú °í¿äÇÏ¸ç µÎ·Á¿ò±îÁö ÀھƳ»´Â ¾Æ½½¾Æ½½ÇÑ Çù°îµéÀÇ »çÁøµéÀ» ±¸ÇÑ´Ù.
°ÔÀ̸ӷμ­ ÀÚ¿¬ÀÇ ¾Æ¸§´Ù¿òÀ» µå·¯³¾¼ö ¾ø´Ù´Â °ÍÀº ºÒÇàÇÑ ÀÏÀÌ´Ù.
ÇöÀçÀÇ À¯¸ÁÇÑ °ÔÀÓµéÁß ¼Ò¼ö¸¸ÀÌ ´«À» À§ÇØ ÀÌ·¯ÇÑ Ç⿬À» Á¦°øÇÑ´Ù.
(Tribes 1 & 2, Tread Marks, Outcast, Myth 1 & 2, and HALO).
ÀÌ·¯ÇÑ °ÔÀÓµéÀº »ïÂ÷¿ø ¾×¼Ç°ÔÀÓµéÀ» ½ºÅ丮¿Í µ¿ÀÛÀÌ ¿¬ÃâµÇ´Â ¹ÏÀ»¼ö ¾øÀ» Á¤µµ·Î µðÅ×ÀÏÇÑ ¼¼°è·Î ¿Å°Ü³õ´Â´Ù.

ÀÌ ±â»ç¿¡¼­ ³ª´Â Çϵå¿þ¾î¿¡ ÀÇÇØ °¡¼ÓµÇ´Â ÁöÇü¿£Áøµé°ú ÀÌ ¿£ÁøÀ» ±¸µ¿ÇÏ´Â ¾Ë°í¸®Áò¿¡ ´ëÇØ Á¶»çÇÒ °ÍÀÌ´Ù.
´ÙÀ½ ÇÁ·ÎÁ§Æ®¿¡¼­ ÁöÇüÀ» Ãß°¡ÇϰíÀÚ ÇÏ´Â »ç¶÷µéÀ» À§ÇÑ ½ÃÀÛÁ¡À¸·Î¼­ Ưº°È÷ ÇϳªÀÇ ¾Ë°í¸®ÁòÀ» Á¦°øÇÏ°í ³íÀÇÇÒ °ÍÀÌ¸ç ¸¶Áö¸·À¸·Î ÀÌ ¾Ë°í¸®ÁòÀ» ±¸ÇöÇÒ °ÍÀÌ´Ù.
³ª´Â µ¶ÀÚµéÀÌ Áß±ÞÁ¤µµÀÇ c++Áö½Ä°ú ÃÖ¼ÒÇÑ »ïÂ÷¿ø ·»´õ¸µ¿¡ ´ëÇÑ ÀϹÝÀûÀÎ Áö½ÄÀ» °¡Áö°í ÀÖ´Ù°í °¡Á¤ÇÏ°í ³íÀǸ¦ ½ÃÀÛÇÑ´Ù.

Intorduction to Terrain Visualization : ÁöÇü ½Ã°¢È­¿¡ ´ëÇÑ µµÀÔ(¼Ò°³).

LODÁöÇü ¾Ë°í¸®ÁòµéÀ» ÂüÁ¶ÇÏÁö ¾Ê°í ÁöÇü½Ã°¢È­(Terrain Visualization)ÀÇ ¼¼°è·Î ¶Ù¾îµé¼ö´Â ¾ø´Ù.
LOD¾Ë°í¸®ÁòÀº Á¤È®ÇÏ°Ô º¸À̱â À§ÇØ ÁöÇüÀÇ ¾î¶² ºÎºÐÀÌ ´õ ÀÚ¼¼ÇÏ°Ô º¸ÀÏ Çʿ䰡 ÀÖ´ÂÁö¸¦ °áÁ¤Çϱâ À§ÇØ °æÇèÄ¡ÀÇ ÁýÇÕÀ» »ç¿ëÇÑ´Ù.
ÀǽÉÇÒ ¹Ù ¾øÀÌ ¿©·¯ºÐÀº ¸¹Àº ÁöÇü¿¡ ´ëÇÑ ÂüÁ¶¹°°ú GPSµ¥ÀÌÅ͸¦ ±¸ÇÒ °ÍÀÌ´Ù.
ÀÌ·¯ÇÑ ¸ðµç °ÍµéÀº ±º¿ëÀÇ SimNet ¾îÇø®ÄÉÀ̼ǿ¡¼­ »ç¿ëµÇ¾úÁö¸¸ Áö±ÝÀº Á»´õ »ç¼ÒÇÑ ¸ñÀûÀ» À§ÇØ »ç¿ëµÇ°í ÀÖ´Ù.

ÁöÇüÀ» ·£´õ¸µÇϱâ À§ÇÑ ¸¹Àº ±â¼úÀû º¯È­µé Áß Çϳª´Â ÁöÇüÀÚü¿¡ Á¸ÀçÇÏ´Â ±â´ÉµéÀ» ÀúÀåÇÏ´Â ¹æ¹ýÀÌ´Ù.
³ôÀ̸Ê(height map)Àº »ê¾÷»óÀÇ Ç¥ÁØÀÌ´Ù.
°£´ÜÈ÷ ¸»ÇÏ¸é ³ôÀ̸ÊÀº ±× À§Ä¡¿¡¼­ÀÇ ÁöÇüÀÇ ³ôÀ̰ªÀ» ÀúÀåÇϰí ÀÖ´Â ÀÌÂ÷¿ø ¹è¿­ÀÌ´Ù.
Ãø·®±â»ç°¡ ÀÚ½ÅÀÇ °íµµ Ãø·®ÅøÀ» »ç¿ëÇÏ¿© °¢ »ç°¢ÇüÀ» ä¿î ±×·¡ÇÁ ¿ëÁö¶ó°í »ý°¢ÇÏÀÚ.
³ôÀÌÇʵå´Â ³ôÀ̸ÊÀ̶ó°íµµ ÇÑ´Ù.
³ª´Â ÀÌ µÎ ¿ë¾î¸¦ »óÈ£±³È¯ÀûÀ¸·Î »ç¿ëÇÒ °ÍÀÌ´Ù.

Overview of LOD Terrain Algorithms : LOD ÁöÇü ¾Ë°í¸®Áò¿¡ ´ëÇÑ °³¿ä.

LODÁöÇü ¾Ë°í¸®Áò¿¡ ´ëÇÑ ÁÁÀº °³¿ä´Â ¼¼ °³ÀÇ ³í¹®¿¡ Àß ³ªÅ¸³ª ÀÖ´Ù.
(1. Hoppe, 2. Lindstrom, 3. Duchaineau)

ù ¹øÂ° ³í¹®¿¡¼­ Hoppe´Â ¿©·¯ºÐÀÌ Á»´õ ¼¼¹ÐÇÑ ÁöÇüÀÌ ÇÊ¿äÇÒ ¶§ ÀÓÀÇÀÇ ¸Þ½¬¿¡ »ï°¢ÇüµéÀ» Ãß°¡ÇÏ´Â ´Ù¼Ò »õ·Ó°í ±ò²ûÇÑ ÀûÀÀÀû ¸Þ½¬¿¡ ±â¹ÝÇÑ ¾Ë°í¸®ÁòÀ» Á¦½ÃÇÑ´Ù.
ÀÌ ³í¹®Àº ÈǸ¢ÇÑ ÂüÁ¶¼­ÀÌÁö¸¸ ¿ì¸®ÀÇ ¿ä±¸¿¡´Â ´Ù¼Ò º¹ÀâÇÏ°í ¸¹Àº ¸Þ¸ð¸®¸¦ ¿ä±¸ÇÑ´Ù.

Á» ´õ ¿ì¸®ÀÇ ½ºÅ¸ÀÏ¿¡ °¡±î¿î µÎ ¹øÂ° ³í¹®¿¡¼­ LindstromÀº ÁöÇüÀÇ Á¶°¢(Patch)À» Ç¥ÇöÇϱâ À§ÇØ »ç¿ëµÇ´Â ÄõµåÆ®¸®¶ó°í ÇÏ´Â ±¸Á¶Ã¼¸¦ Á¦½ÃÇÑ´Ù.
ÄõµåÆ®¸®´Â ³ôÀÌ ¸Ê¿¡ ´ëÇÑ ±Ù»ç°ªÀ» »ý¼ºÇϱâ À§ÇØ ÁöÇüÀ» Àç±ÍÀûÀ¸·Î ºÐÇÒÇÑ´Ù.
ÄõµåÆ®¸®´Â ¾Æ·¡ÀÇ ¾Ë°í¸®Áò°ú ¸¹Àº ¼³°è¿øÄ¢À» °øÀ¯Çϰí ÀÖÀ¸¸ç ¾ÆÁÖ °£´ÜÇϰí È¿À²ÀûÀÌÁö¸¸ ¾Æ·¡ÀÇ ³í¹®Àº Ãß°¡ÀûÀÎ º¸³Ê½º¸¦ Á¦°øÇÑ´Ù.

¸¶Áö¸·À¸·Î ¼¼ ¹øÂ° ³í¹®¿¡¼­ Duchaineau´Â ÀÌÁø »ï°¢Çü Æ®¸®(Binary Triangle Tree)¿¡ ±â¹ÝÇÑ ¾Ë°í¸®Áò(Real-time Optimally Adapting Meshes: ROAM)À» Á¦½ÃÇÑ´Ù.
¿©±â¿¡¼­ °¢ ÆÐÄ¡´Â ´Ü¼øÈ÷ (¿ìÃøÀÇ) À̵ »ï°¢ÇüÀÌ´Ù. »ï°¢ÇüÀÇ Á¤Á¡¿¡¼­ ÀÌ »ï°¢ÇüÀÇ ºøº¯ÀÇ ÁßÁ¡À» ºÐÇÒÇÏ¸é µÎ °³ÀÇ »õ·Î¿î À̵(¿ìÃø) »ï°¢ÇüÀ» ¸¸µç´Ù.
ÀÌ·¯ÇÑ ºÐÇÒÀº Àç±ÍÀûÀÌ¸ç ¿øÇÏ´Â µðÅ×ÀÏ ¼öÁØ¿¡ À̸¦ ¶§ ±îÁö Àڽijëµåµé¿¡ ´ëÇØ ¹Ýº¹µÈ´Ù.

¿¬±¸ ±â°£Áß ROAM ¾Ë°í¸®ÁòÀº ±× °£°á¼º°ú È®À强 ¶§¹®¿¡ ³ªÀÇ ´«±æÀ» ²ø¾ú´Ù.
ºÒÇàÈ÷µµ ÀÌ ³í¹®Àº ¾ÆÁÖ Âª°í ±¸ÇöÀ» À§ÇÑ ÈùÆ®·Î ÃÖ¼ÒÇÑÀÇ ÀÇ»çÄÚµå(pseudo code)¸¸À» Á¦°øÇÑ´Ù.
±×·¯³ª ÀÌ ±â¹ýÀº ¾ÆÁÖ ±âº»ÀûÀÎ ¼öÁØ¿¡¼­ºÎÅÍ °ÅÀÇ ¿¬¼ÓÀûÀÎ ´Ü°è·Î ¾ÆÁÖ Áøº¸µÈ ÃÖÀûÈ­±îÁö ±¸ÇöÇÒ¼ö ÀÖ´Ù.
°¢°¢ÀÇ ´Ü°è´Â °è¼ÓÇϱâ Àü¿¡ À¯È¿È­µÉ¼ö ÀÖÀ¸¹Ç·Î µµ¿òÀÌ µÈ´Ù.
¶ÇÇÑ ROAMÀº ¾ÆÁÖ ºü¸£°Ô ºÐÇÒÇÏ¸ç ³ôÀ̸ÊÀ» µ¿ÀûÀ¸·Î °»½ÅÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù.

¿©±â¿¡¼­ Á¦½ÃÇÏ´Â ¾Ë°í¸®ÁòÀº Tread Marks (http://www.TreadMarks.com) ¸¦ º»µû¼­ ¸¸µé¾ú´Ù.
¼ö¼® ÇÁ·Î±×·¡¸Ó Seumas McNally´Â °³³ä¿¡¼­ºÎÅÍ ¿Ï¼º±îÁö ÈûÀÌ µÇ¾î ÁÖ¾ú´Ù.
´õ ÀÚ¼¼ÇÑ »çÇ×Àº ³¡ºÎºÐÀÇ "Acknowledgment" ¶õÀ» º¸¶ó.

Introduction to the ROAM Implementation : ROAM ÀÇ ±¸Çö¿¡ ´ëÇÑ µµÀÔ.

ÀÌ ¾ÆÅ°ºê¿¡ ÀÖ´Â ÄÚµå´Â ºñÁÖ¾ó C++6.0À¸·Î ÀÛ¼ºµÇ¾úÀ¸¸ç ·»´õ¸µÀ» À§ÇØ ¿ÀÇÂÁö¿¤À» »ç¿ëÇÑ´Ù.
³ª´Â OpenGL¿¡ ´ëÇØ¼­´Â »ý¼ÒÇÏÁö¸¸ ÀÌ ÇÁ·ÎÁ§Æ®ÀÇ ÀÌ·¯ÇÑ Ãø¸éµéÀ» Á¤È®ÇÏ°Ô ÄÚµùÇϱâ À§ÇØ °¡´ÉÇÑ ¸ðµç ¹æ¹ýµéÀ» »ç¿ëÇß´Ù.
¿£ÁøÀÇ ¼³°è¿Í ±¸Çö¿¡ °üÇÑ Á¶¾ðÀ̳ª Ãæ°í´Â ¾ðÁ¦³ª ȯ¿µÇÑ´Ù.

ÀÌ ÇÁ·ÎÁ§Æ®´Â ÀÌ ±â»ç¿¡¼­´Â ¼³¸íÇÏÁö ¾ÊÀº ¸î °³ÀÇ ÆÄÀϵéÀ» °®°í ÀÖ´Ù.
ÀÌ·¯ÇÑ ÆÄÀϵéÀº À¯Æ¿¸®Æ¼ ·çƾ°ú WIN32ÇÏ¿¡¼­ OpenGLÀ» ½ÇÇà½Ã۴µ¥ ÇÊ¿äÇÑ ÀϹÝÀûÀÎ ¾îÇø®ÄÉÀÌ¼Ç ¿À¹öÇìµåÀÌ´Ù.
¿ÀÁ÷ "ROAMSimple.cpp"¿Í ±× Çì´õ ÆÄÀϸ¸À» ÀÌ ±â»ç¿¡¼­ °ËÅäÇÑ´Ù.

ROAM Source Explanation: ROAM ¼Ò½º ¼³¸í.

³ª´Â Á¶°¨µµÀûÀÎ °üÁ¡¿¡¼­ ÀÌ ¾Ë°í¸®ÁòÀ» ¼Ò°³ÇÏ°í °³º°ÀûÀÎ ºÎºÐµéÀÌ ¾î¶»°Ô »óÈ£ÀÛ¿ëÇÏ´ÂÁö¿¡ ´ëÇØ ³íÀÇÀÇ ÃÊÁ¡À» ¸ÂÃâ °ÍÀÌ´Ù.

* ³ôÀÌ¸Ê ÆÄÀÏÀº ¸Þ¸ð¸®¿¡ ·ÎµåµÇ¸ç LandScapeŬ·¡½ºÀÇ ÀνºÅϽº¿Í ¿¬°áµÈ´Ù.
¿©·¯°³ÀÇ LandScape°´Ã¼´Â ¹«ÇÑÇÑ Å©±âÀÇ ÁöÇüÀ» ¸¸µé±â À§ÇØ ¸µÅ©µÉ¼ö ÀÖ´Ù.

* »õ·Î¿î LandScape¿ÀºêÁ§Æ®´Â ·ÎµåµÈ ³ôÀ̸ÊÀÇ ºÎºÐµéÀ» »õ·Î¿î PatchŬ·¡½º °´Ã¼·Î ºÐÇÒÇÒ¼ö ÀÖ´Ù.
ÀÌ ´Ü°èÀÇ ¸ñÀûÀº µÎ°¡ÁöÀÌ´Ù.

1. ÀÌ ¾Ë°í¸®ÁòÀÇ ³ª¸ÓÁö ºÎºÐ¿¡¼­ »ç¿ëµÈ Æ®¸®±¸Á¶´Â ±íÀÌ¿¡ µû¶ó Áö¼öÀûÀÎ Å©±â·Î ·¥ÀÇ »ç¿ë·®À» ´Ã¸°´Ù.
µû¶ó¼­ ÀÛÀº ¿µ¿ªÀ» À¯ÁöÇÏ´Â °ÍÀº ±× ±íÀ̸¦ Á¦ÇÑÇÏ´Â °ÍÀÌ´Ù.

2. ³ôÀ̸ÊÀÇ µ¿Àû°»½ÅÀ» À§Çؼ­´Â º¯°æµÈ Áö¿ª¿¡ ´ëÇÑ ÆíÂ÷Æ®¸®(Variance Tree)¸¦ ¿ÏÀüÇÏ°Ô ´Ù½Ã °è»êÇØ¾ß ÇÑ´Ù.
¾ÆÁÖ Å« ÆÐÄ¡ÀÇ °æ¿ì ½Ç½Ã°£ ¾îÇø®ÄÉÀ̼ǿ¡¼­ °è»êÇϱ⿡´Â ³Ê¹« ´À¸®´Ù.

* °¢°¢ÀÇ Patch°´Ã¼´Â ¸Þ½¬ ±Ù»çÈ­(ºÐÇÒ)¸¦ À§ÇØ È£ÃâµÈ´Ù.
ÆÐÄ¡´Â ½ºÅ©¸°»ó¿¡ Ç¥½ÃµÉ Æ®¶óÀ̾ޱÛÀÇ ¾Ï½ÃÀûÁÂÇ¥(x, y, z¿Í °°Àº ¸í½ÃÀû ÁÂÇ¥°¡ ¾Æ´Ô)¸¦ ÀúÀåÇÏ´Â ÀÌÁø »ï°¢ÇüÆ®¸®ÀÌ´Ù.
³í¸®ÀûÀÎ ¹æ½ÄÀ¸·Î ¹öÅØ½ºµéÀ» ÀúÀåÇÔÀ¸·Î½á ROAMÀº Æ®¶óÀ̾ޱ۴ç 36¹ÙÀÌÆ® ÀÌ»óÀÇ ·¥ »ç¿ë·®À» Àý¾àÇÑ´Ù.
ÁÂÇ¥°ªµéÀº ·»´õ¸µ°úÁ¤ÀÇ ÀϺημ­ È¿À²ÀûÀ¸·Î °è»êµÈ´Ù.

* ºÐÇÒÀÌ ³¡³­ÈÄ ¿£ÁøÀº ÀÌÀü ´Ü°è¿¡¼­ »ý¼ºµÈ ÀÌÁø »ï°¢ÇüÆ®¸®¸¦ ¼øÈ¸ÇÑ´Ù.
ÀÌ Æ®¸®³»ÀÇ ¸®ÇÁ³ëµå(ÀÙ³ëµå- Â÷Àϵå³ëµå¸¦ °®Áö ¾Ê´Â ³ëµå)´Â ±×·¡ÇÈ ÆÄÀÌÇÁ¶óÀÎÀ» ÅëÇØ Ãâ·ÂµÉ Çʿ䰡 ÀÖ´Â Æ®¶óÀ̾ޱ۵éÀÌ´Ù.
»ï°¢ÇüµéÀÇ ÁÂÇ¥´Â ¼øÈ¸ µµÁß Áï¼®¿¡¼­ °è»êµÈ´Ù.

Height Map File Format : ³ôÀÌ¸Ê ÆÄÀÏÇü½Ä.

³ª´Â Çà¿ì¼±Çü½ÄÀ¸·Î ÀúÀåµÈ 8ºñÆ®ÀÇ ³ôÀÌ »ùÇÃÀ» ´ã°í ÀÖ´Â rawÆÄÀÏÀ» ÀоîµéÀÌ´Â °¡Àå ´Ü¼øÇÑ ¹æ¹ýÀ» ÅÃÇß´Ù.
ÀÌ´Â ³» ÇÁ·Î±×·¥¿¡¼­´Â Á¤È®ÇÑ ÆÄÀÏ Æ÷¸ËÀÌ´Ù.
³ôÀ̸ÊÀº ¾ðÁ¦³ª ¸Þ¸ð¸®¿¡ Á¸ÀçÇÑ´Ù.
"°í±ÞÁÖÁ¦"¶õ¿¡¼­ Á»´õ Å« µ¥ÀÌÅÍÁýÇÕ¿¡ ´ëÇØ ÀÌ ¾Ë°í¸®ÁòÀ» È®ÀåÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ³íÀÇÇÒ °ÍÀÌ´Ù.

Binary Triangle Tree : ÀÌÁø »ï°¢Çü Æ®¸®.

ÁöÇü¸Þ½¬¸¦ Ç¥ÇöÇϱâ À§ÇØ °Å´ëÇÑ »ï°¢ÇüÁÂÇ¥ÀÇ ¹è¿­À» ÀúÀåÇÏ´Â ´ë½Å ROAM¾Ë°í¸®ÁòÀº ÀÌÁø »ï°¢Çü Æ®¸®¶ó°í ÇÏ´Â ±¸Á¶Ã¼¸¦ »ç¿ëÇÑ´Ù.
ÀÌ ±¸Á¶Ã¼´Â ÁöÇüÀ» »ï°¢ÇüÇ÷Ô(ÀÛÀº »ï°¢Çü ¿µ¿ª)µé·Î ºÐÇÒÇÏ´Â Ãø·®ÀÚÀÇ °á°ú·Î º¼¼ö ÀÖ´Ù.
ÀÌ·¯ÇÑ Ç÷ԵéÀÇ ¼ÒÀ¯ÀÚµéÀº ³í¸®ÀûÀ¸·Î ¼­·Î¸¦ ÀÌ¿ôÇÏ´Â °ü°è(ÁÂ, ¿ì, ÀÌ¿ôµî)·Î º»´Ù.
¸¶Âù°¡Áö·Î ¾î¶² ¼ÒÀ¯ÀÚ°¡ »ó¼ÓÀ» ÅëÇØ ÁöÇüÀ» ÁÖ¸é ÀÌ ÁöÇüÀº µÎ °³ÀÇ Â÷Àϵå»çÀÌ¿¡¼­ µ¿µîÇÏ°Ô ºÐÇҵȴÙ.

ÀÌ·¯ÇÑ À¯Ã߸¦ ´õ È®ÀåÇϱâ À§ÇØ Ç÷ÔÀÇ ¿ø¼ÒÀ¯ÀÚ´Â ÀÌÁø »ï°¢ÇüÆ®¸®ÀÇ ·çÆ®³ëµåÀÌ´Ù.
´Ù¸¥ ¿ø¼ÒÀ¯ÀÚ´Â ±×µéÀÌ ¼ÒÀ¯ÇÑ Æ®¸®ÀÇ ·çÆ®³ëµåÀÌ´Ù.
LandScapeŬ·¡½º´Â Áö¿ªÀûÀÎ ÁöÇüµî·Ï±â¿Í °°Àº ¿ªÇÒÀ» ÇÑ´Ù.
Áï Ç÷ԵéÀÇ ¿ø¼ÒÀ¯ÀÚ¸¦ ÃßÀûÇÏ°í ¾î¶² Ç÷ÔÀÌ ¿©±â¿¡ ¼ÓÇÏ´ÂÁö¸¦ ±â·ÏÇÑ´Ù.
ÀÌ·¯ÇÑ µî·ÏÀº ¶ÇÇÑ ºÎ¸ð¿¡¼­ Â÷Àϵå±îÁö ¸ðµç »ó¼Ó°ü°è¸¦ ±â·ÏÇÑ´Ù.
´õ ¸¹Àº Â÷Àϵ带 »ý¼ºÇϸé ÇÒ¼ö·Ï ÁöÇüÀº Á»´õ ¸¹ÀÌ Á¶»çµÈ´Ù.
Á» ´õ ±Ù»çÈ­°¡ ÇÊ¿äÇÑ ¿µ¿ªÀÇ °æ¿ì ±× ¿µ¿ª¿¡¼­ÀÇ Àα¸(Â÷ÀϵåÀÇ ¼ö)¸¦ ´Ã¸²À¸·Î¼­ ¿øÇÏ´Â Á¤µµÀÇ µðÅ×ÀÏÀ» ¾òÀ»¼ö ÀÖ´Ù.
¿¹Á¦·Î < figure 1 >À» ÂüÁ¶Ç϶ó.

Figure 1. Bindary triangle tree structure levels 0~3

ÀÌÁø »ï°¢ÇüÆ®¸®´Â TriTreeNode±¸Á¶Ã¼¿¡ ÀÇÇØ Ç¥ÇöµÇ¸ç ROAMÀ» À§ÇØ ÇÊ¿äÇÑ ´Ù¼¸°¡ÁöÀÇ ±âº»ÀûÀÎ °ü°èµéÀ» ÃßÀû À¯ÁöÇÑ´Ù.

ÀÌ·¯ÇÑ °ü°èµé¿¡ ´ëÇÑ Ç¥ÁØÀûÀÎ °üÁ¡Àº < figure 2 >¸¦ ÂüÁ¶Ç϶ó.

struct TriTreeNode {
¡¡¡¡¡¡¡¡ TriTreeNode *LeftChild; // Our Left child
¡¡¡¡¡¡¡¡ TriTreeNode *RightChild; // Our Right child
¡¡¡¡¡¡¡¡ TriTreeNode *BaseNeighbor;
¡¡¡¡¡¡¡¡ ¡¡¡¡ // Adjacent node, below us
¡¡¡¡¡¡¡¡ TriTreeNode *LeftNeighbor;
¡¡¡¡¡¡¡¡ ¡¡¡¡ // Adjacent node, to our left
¡¡¡¡¡¡¡¡ TriTreeNode *RightNeighbor;
¡¡¡¡¡¡¡¡ ¡¡¡¡ // Adjacent node, to our right
};

Figure 2. Basic binary triangle with children and neighbors.

³ôÀ̸ÊÀ» À§ÇÑ ¸Þ½¬ ±Ù»ç°ªÀ» »ý¼ºÇÒ ¶§ ¿ì¸®´Â ¿øÇÏ´Â µðÅ×ÀÏ ·¹º§¿¡ µµ´ÞÇÒ¶§±îÁö Æ®¸®¿¡ Â÷ÀÏµå ³ëµåµéÀ» Àç±ÍÀûÀ¸·Î Ãß°¡ÇÑ´Ù.
ÀÌ·¯ÇÑ ´Ü°è°¡ ³¡³ª¸é ÀÌ Æ®¸®´Â ´Ù½Ã ¼øÈ¸µÇ°í À̹ø¿¡´Â ½ÇÁ¦ÀûÀÎ ½ºÅ©¸°»óÀÇ Æ®¶óÀ̾ޱ۷μ­ ¸®ÇÁ³ëµåµéÀ» ·»´õ¸µÇÑ´Ù.
ÀÌ·¯ÇÑ ÀÌÁßÆÐ½º¹æ½ÄÀº ±âº»ÀûÀÎ ¿£ÁøÀÌ µÇ¸ç ¸Å ÇÁ·¹ÀÓ¸¶´Ù ¸®¼ÂµÇ¾î¾ß ÇÑ´Ù.
Àç±ÍÀû¹æ¹ýÀÇ ÁÁÀºÁ¡ Áß ÇѰ¡Áö´Â ¾î¶² ¹öÅØ½º´ç µ¥ÀÌÅÍ(per Vertex Data)µµ ÀúÀåÇÏÁö ¾Ê´Â´Ù(¹öÅØ½º¿¡ °ü·ÃµÈ ¾î¶² µ¥ÀÌÅ͵µ ÀúÀåÇÏÁö ¾ÊÀ½(?))´Â Á¡Àε¥ ÀÌ´Â ·¥ÀÇ »ç¿ë·®À» ÁÙÀϼö ÀÖ´Ù.

»ç½Ç TriTreeNode±¸Á¶Ã¼´Â ³Ê¹« ÀÚÁÖ »ý¼ºµÇ°í ÆÄ±«µÇ¹Ç·Î °¡Àå È¿À²ÀûÀÎ ¹æ¹ýÀ¸·Î ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ´Â °ÍÀº ¹Ýµå½Ã ÇÊ¿äÇÏ´Ù.
¶ÇÇÑ ¿©±â¿¡´Â ÀÌ·¯ÇÑ ±¸Á¶Ã¼µéÀÌ ¼ö¸¸°³°¡ ÀÖÀ¸¹Ç·Î ÇϳªÀÇ ¿©ºÐÀÇ Æ÷ÀÎÅ͵µ ¾öû³ª°Ô ¸¹Àº ¸Þ¸ð¸®¸¦ ¿ä±¸ÇϰԵȴÙ.
TriTreeNode±¸Á¶Ã¼´Â Á¤Àû ¸Þ¸ð¸® Ç®(pool)¿¡¼­ ÇÒ´çµÇ¸ç µû¶ó¼­ µ¿ÀûÀÎ ¸Þ¸ð¸®ÇÒ´çÀÇ ¿À¹öÇìµå¸¦ ÇÇÇÒ¼ö ÀÖÀ¸¸ç »óŸ¦ ¸®¼¼ÆÃÇÏ´Â ºü¸¥ ¹æ¹ýÀ» Á¦°øÇÑ´Ù.

Figure 3. Typical patch of terrain. From left to right,
Wireframe (overhead view), Lit, and Textured

Explanation of LandScape Class : LandScape Ŭ·¡½ºÀÇ ¼³¸í.

LandScapeŬ·¡½º´Â ÁöÇü·»´õ¸µÀÇ Áö°Ü¿î ¼¼ºÎ»çÇ׿¡ ´ëÇÑ °í¼öÁØÀÇ Ä¸½¶È­·Î µ¿ÀÛÇÑ´Ù.
¾îÇø®ÄÉÀ̼ÇÀÇ °üÁ¡¿¡¼­ ÁöÇüÀº ¸î°¡ÁöÀÇ °£´ÜÇÑ ¼Â¾÷ÇÔ¼ö¸¦ È£ÃâÇÑ ÈÄ¿¡ ½ºÅ©¸°»ó¿¡ ³ªÅ¸³ª¾ß ÇÑ´Ù.
¿©±â¿¡ LandScapeŬ·¡½º Á¤ÀÇÀÇ Áß¿äÇÑ ºÎºÐÀÌ ÀÖ´Ù.

class Landscape {
public:
¡¡¡¡void Init(unsigned char *hMap);
¡¡¡¡¡¡¡¡ // Initialize the whole process
¡¡¡¡void Reset();
¡¡¡¡¡¡¡¡ // Reset for a new frame
¡¡¡¡void Tessellate();
¡¡¡¡¡¡¡¡ // Create mesh approximation
¡¡¡¡void Render();
¡¡¡¡¡¡¡¡ // Render current mesh static
¡¡¡¡TriTreeNode *AllocateTri();
¡¡¡¡¡¡¡¡ // Allocate a new node for the mesh

protected:
¡¡¡¡static int m_NextTriNode;
¡¡¡¡¡¡¡¡ // Index to the next free TriTreeNode
¡¡¡¡static TriTreeNode m_TriPool[];
¡¡¡¡¡¡¡¡ // Pool of nodes for tessellation
¡¡¡¡Patch m_aPatches[][];
¡¡¡¡¡¡¡¡ // Array of patches to be rendered
¡¡¡¡unsigned char *m_HeightMap;
¡¡¡¡¡¡¡¡ // Pointer to Height Field data
};

LandScapeŬ·¡½º´Â Ä¿´Ù¶õ Á¤»ç°¢ Ç÷Եé(Á¤»ç°¢Çü ¿µ¿ª)À» °ü¸®ÇÏ¸ç °¢ÀÚ ÀÚ½ÅÀÇ Ç÷ÔÀ» °¡Áø ´Ù¸¥ LandScape °´Ã¼¿Í µ¿ÀÛÇÑ´Ù.
ÀÌ·¯ÇÑ ¼³°è´Â Á»´õ Å« ÁöÇüÀ» ºÒ·¯µéÀÌ°í ½ÍÀ» ¶§ À¯¿ëÇÏ´Ù.
ÃʱâÈ­°úÁ¤¿¡¼­ ³ôÀÌ ¸ÊÀº Á»´õ °ü¸®°¡ ¿ë¾ÆÇÑ Á¶°¢µé·Î ºÐÇÒµÇ¸ç »õ·Î¿î Patch°´Ã¼·Î µÈ´Ù.
ÀÌ·¯ÇÑ Á¶°¢µéÀº PatchŬ·¡½º°¡ µÇ¸ç ¿ì¸®°¡ °¡Àå ¸¹Àº ½Ã°£À» ¼ÒºñÇÏ´Â ¸Å½áµåµé°ú ¿¬°áµÈ´Ù.

ÀÌ ÇÔ¼öÀÇ ´Ü¼ø¼ºÀ» ÁÖ¸ñÇ϶ó.
LandScapeŬ·¡½º´Â Ưº°È÷ ¿äÁò À̿밡´ÉÇÑ Çϵå¿þ¾î z¹öÆÛ¸µÀÇ ÀÌÁ¡ÀÌ ÁÖ¾îÁö´Â ·»´õ¸µ ÆÄÀÌÇÁ¶óÀο¡ ½±°Ô Àû¿ëÇÒ¼ö ÀÖµµ·Ï ¼³°èµÇ¾ú´Ù.
ÀÌ µ¥¸ð¸¦ ´õ °£´ÜÈ÷ ÇÏ°Ô Çϱâ À§ÇØ ¸î°¡ÁöÀÇ Àü¿ªº¯¼öµéÀÌ »ç¿ëµÈ´Ù.

¢º Explanation of Patch Class