34.htm 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <!--
  2. demo.design 3D programming FAQ
  3. Idea, texts, screenshots:
  4. Andrew A. Aksyonoff,
  5. shodan@chat.ru
  6. Web-design, illustrations:
  7. Andrey Samoilov,
  8. asy@sense.simbirsk.su
  9. -->
  10. <html>
  11. <head>
  12. <title>demo.design 3D programming FAQ. Удаление невидимых частей. Порталы.</title>
  13. <link rel=stylesheet href="../style.css" type="text/css">
  14. </head>
  15. <script language="javascript">
  16. <!--//
  17. browser = navigator.appName;
  18. version = parseFloat(navigator.appVersion);
  19. if (browser == "Netscape" && version >= 3.0) { jsenabled = 1; } else
  20. if (browser == "Microsoft Internet Explorer" && version >= 3.0) { jsenabled = 1; } else { jsenabled = 0; }
  21. function swap(img,ref) { if (jsenabled) {document.images[img].src = ref;} }
  22. function loadtocache(img,ref) { cache[img] = new Image(); cache[img].src = ref; }
  23. if (jsenabled) {
  24. cache = new Array();
  25. loadtocache(0,"../img/xdl.gif");
  26. loadtocache(1,"../img/xfaq.gif");
  27. loadtocache(2,"../img/xlinks.gif");
  28. loadtocache(3,"../img/xauthor.gif");
  29. loadtocache(4,"../img/xe.gif");
  30. loadtocache(5,"../img/xprev.gif");
  31. loadtocache(6,"../img/xnext.gif");}
  32. //-->
  33. </script>
  34. <body bgcolor=white><center>
  35. <!-- Title -->
  36. <img src="../img/b.gif" width=500 height=1 alt=""><br>
  37. <img src="../img/t.gif" width=500 height=1 alt=""><br>
  38. <img src="../img/b.gif" width=500 height=1 alt=""><br>
  39. <img src="../img/t.gif" width=500 height=2 alt=""><br>
  40. <table width=500 cellpadding=0 cellspacing=0 border=0>
  41. <td><img src="../img/t.gif" width=5 height=1 alt=""><a href="../main.htm" onmouseover="swap('logo','../img/xe.gif');" onmouseout="swap('logo','../img/e.gif');"><img src="../img/e.gif" name=logo width=60 height=50 hspace=10 border=0 alt=" в самое начало "></a></td>
  42. <td><p class=pagetitle><img src="../img/t.gif" width=265 height=1 alt=""><br>demo.design<br>3D programming FAQ</td>
  43. <td align=center><p class=navy><a href="../download.htm" onmouseover="swap('dl','../img/xdl.gif');" onmouseout="swap('dl','../img/dl.gif');"><img src="../img/dl.gif" name=dl width=40 height=40 border=0 hspace=5 alt=" download "></a><br>download</td>
  44. <td align=center><p class=navy><a href="../links.htm" onmouseover="swap('links','../img/xlinks.gif');" onmouseout="swap('links','../img/links.gif');"><img src="../img/links.gif" name=links width=40 height=40 border=0 hspace=5 alt=" коллекция линков "></a><br>links</td>
  45. <td align=center><p class=navy><a href="../author.htm" onmouseover="swap('author','../img/xauthor.gif');" onmouseout="swap('author','../img/author.gif');"><img src="../img/author.gif" name=author width=40 height=40 border=0 hspace=5 alt=" автора! "></a><br>author</td>
  46. </table>
  47. <img src="../img/t.gif" width=500 height=4 alt=""><br><img src="../img/b.gif" width=500 height=1 alt=""><br>
  48. <!-- Head -->
  49. <table width=500 cellpadding=0 cellspacing=10 border=0><td><div align=justify>
  50. <p class=title>
  51. <img src="../img/b3.gif" width=70 height=70 align=left hspace=0 alt="">
  52. <img src="../img/t.gif" width=5 height=70 align=left hspace=0 alt="">
  53. УДАЛЕНИЕ НЕВИДИМЫХ ЧАСТЕЙ<br>3.4. Порталы
  54. <!-- Article -->
  55. <p>Этот метод предназначен для т.н. indoor environments - в буквальном переводе
  56. "комнатная среда"; это как бы внутренность какого-то здания. В качестве
  57. примера могут служить Doom, Quake.
  58. <p>В этом случае сцена составляется из комнат. Комнаты связаны друг с другом
  59. какими-то проходами - дверями, окнами, чем угодно. На каждый такой проход
  60. вешается обычный полигон, называемый порталом. Для отрисовки сцены достаточно
  61. нарисовать текущую комнату вместе с тем, что из нее видно. Но то, что из нее
  62. видно, может быть видно *только* через порталы.
  63. <p>Таким образом, для отрисовки всей сцены мы просто берем и рисуем текущую
  64. комнату, используя любые методы удаления невидимых частей (например, алгоритм
  65. художника и отброс нелицевых граней). А если в процессе отрисовки нам
  66. встречается полигон, помеченный как портал, то мы рисуем комнату, которую
  67. видно через этот портал, причем отсекаем ее уже по проекции этого портала.
  68. <p>Как обычно, кусок кода для уяснения:
  69. <pre class=source>
  70. // ...
  71. void drawRoom(int roomID, polygon *clipArea) {
  72. int i;
  73. for (i = 0; i < rooms[roomID].numFaces; i++)
  74. drawFace(&rooms[roomID].face[i], clipArea);
  75. }
  76. void drawFace(polygon *face, polygon *clipArea) {
  77. polygon *newClipArea;
  78. if (face->isPortal) {
  79. if (isVisible(face, clipArea) {
  80. newClipArea = clipPolygon(face, clipArea);
  81. drawRoom(face->destinationRoom, newClipArea);
  82. }
  83. } else drawClippedPolygon(face, clipArea);
  84. }
  85. // ...
  86. drawRoom(currentRoom, fullScreen);
  87. // ...
  88. </pre>
  89. <p>Здесь функция isVisible(face, clipArea) возвращает false, если грань face и
  90. область отсечения clipArea не пересекаются; функция clipPolygon возвращает
  91. пересечение полигонов face и clipArea (то есть отсекает face в clipArea и
  92. наоборот); fullScreen - полигон размером с экран (или любую нужную область
  93. отрисовки).
  94. <p>В природе есть Alpha 2 - готовый engine, использующий порталы и написанный на
  95. TMT Pascal, причем, что приятно, доступный в исходниках. Скачать его когда-то
  96. было можно с <a href="http://www.geocities.com/CapeCanaveral/5402/">
  97. http://www.geocities.com/CapeCanaveral/5402</a>. Есть, впрочем,
  98. надежда, что найти этот engine особых проблем не составит.
  99. <p>Осталось упомянуть, что несмотря на то, что в изложенной форме метод и требует
  100. возможности отрисовки произвольной грани, отсеченной в произвольную грань,
  101. можно обойтись и отсечением по bounding box проекции портала.
  102. </div>
  103. </td></table>
  104. <!-- Bottom Navigation -->
  105. <img src="../img/b.gif" width=500 height=1 alt=""><br><img src="../img/t.gif" width=500 height=2 alt=""><br>
  106. <table width=500 cellpadding=0 cellspacing=0 border=0>
  107. <td><img src="../img/t.gif" width=5 height=1 alt=""><a href="../main.htm" onmouseover="swap('logo2','../img/xe.gif');" onmouseout="swap('logo2','../img/e.gif');"><img src="../img/e.gif" name=logo2 width=60 height=50 hspace=10 border=0 alt=" в самое начало "></a></td>
  108. <td><p class=pagetitle><img src="../img/t.gif" width=265 height=1 alt=""><br>demo.design<br>3D programming FAQ</td>
  109. <td align=center><p class=navy><a href="33.htm" onmouseover="swap('prev','../img/xprev.gif');" onmouseout="swap('prev','../img/prev.gif');"><img src="../img/prev.gif" name=prev width=40 height=40 border=0 hspace=5 alt=" предыдущая статья "></a><br>previous</td>
  110. <td align=center><p class=navy><a href="../content.htm" onmouseover="swap('faq','../img/xfaq.gif');" onmouseout="swap('faq','../img/faq.gif');"><img src="../img/faq.gif" name=faq width=40 height=40 border=0 hspace=5 alt=" содержание "></a><br>content</td>
  111. <td align=center><p class=navy><a href="35.htm" onmouseover="swap('next','../img/xnext.gif');" onmouseout="swap('next','../img/next.gif');"><img src="../img/next.gif" name=next width=40 height=40 border=0 hspace=5 alt=" следующая статья "></a><br>next</td>
  112. </table>
  113. <img src="../img/t.gif" width=500 height=4 alt=""><br>
  114. <img src="../img/b.gif" width=500 height=1 alt=""><br>
  115. <img src="../img/t.gif" width=500 height=1 alt=""><br>
  116. <img src="../img/b.gif" width=500 height=1 alt=""><br>
  117. </center></body>
  118. </html>