31.htm 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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.1. Отброс нелицевых граней
  54. <!-- Article -->
  55. <p>Пусть у нас есть объект, внутри которого камера заведомо не окажется. Обычно
  56. такие объекты составляют большую часть или всю сцену. Тогда для каждой грани
  57. мы можем увидеть только одну ее сторону - лицевую. Грань - плоскость, она
  58. делит все 3D пространство на два полупространства. Так вот, лицевую сторону
  59. видно только из одного полупространства, из того, в которое "смотрит" нормаль
  60. к этой грани, направленная *из* объекта. Проверив, в какое полупространство
  61. попадает камера, можно сразу определить, является ли грань лицевой (то есть,
  62. может ли камера увидеть лицевую сторону этой грани) и надо ли ее рисовать.
  63. <p>Пусть грань имеет вершины v1, v2, v3 и нормаль (nx,ny,nz). Тогда уравнение
  64. плоскости, в которой она лежит, будет иметь вид
  65. <p class=expression>nx*x+ny*y+nz*z+d = 0.
  66. <p>d находим из того факта, что v1 в плоскости лежит:
  67. <p class=expression>nx*v1.x+ny*v1.y+nz*v1.z+d = 0,<br>
  68. d = -(nx*v1.x+ny*v1.y+nz*v1.z).<br>
  69. <p>Функция nx*x+ny*y+nz*z+d принимает положительные значения по одну сторону от
  70. плоскости, отрицательные по другую и равна нулю на самой плоскости. Точка
  71. (v1.x+nx,v1.y+ny,v1.z+nz) лежит, очевидно, в том полупространстве, откуда
  72. грань видно. Значение функции (назовем ее функцией видимости) в этой точке
  73. равно
  74. <p class=expression>nx*(v1.x+nx)+ny*(v1.y+ny)+nz*(v1.z+nz)+d =<br>
  75. nx*(v1.x+nx)+ny*(v1.y+ny)+nz*(v1.z+nz)-(nx*v1.x+ny*v1.y+nz*v1.z) =<br>
  76. nx*nx+ny*ny+nz*nz > 0.<br>
  77. <p>Таким образом, если значение функции в какой-то точке больше нуля, то грань
  78. из этой точки потенциально видна. Нас интересует видимость грани из нашей
  79. камеры, а камера у нас зафиксирована в точке (0,0,-dist). Таким образом,
  80. получаем, что грани, для которых
  81. <p class=expression>-nz*dist-(nx*v1.x+ny*v1.y+nz*v1.z) < 0,
  82. <p>или, что равносильно,
  83. <p class=expression>nz*dist+nx*v1.x+ny*v1.y+nz*v1.z > 0,
  84. <p>заведомо не видны и время на их обработку и отрисовку тратить не стоит.
  85. <p>Отдельный вопрос - как считать нормали к граням. Точнее, как выбрать одну
  86. из двух нормалей, которая будет смотреть из объекта. Обычно эта проблема
  87. решается еще на этапе построения 3D моделей - например, пакет 3D Studio
  88. записывает вершины граней в порядке A-B-C так, чтобы векторное произведение
  89. BA*CA и было нормалью. Еще один способ - выбрать внутренную точку для объекта
  90. (либо вручную, либо взять его центр тяжести, либо еще как-нибудь - методов
  91. может быть придумано сколько угодно) и использовать ее: если для этой точки
  92. функция видимости положительна, то есть грань якобы видна, то надо поменять
  93. знак nx, ny и nz.
  94. <p>Осталось отметить, что для выпуклых объектов этот метод полностью решает
  95. задачу об удалении невидимых частей. Для невыпуклых же он позволяет быстро и
  96. просто сократить число граней, подлежащих дальнейшей проверке на видимость и
  97. собственно отрисовке.
  98. </div>
  99. </td></table>
  100. <!-- Bottom Navigation -->
  101. <img src="../img/b.gif" width=500 height=1 alt=""><br><img src="../img/t.gif" width=500 height=2 alt=""><br>
  102. <table width=500 cellpadding=0 cellspacing=0 border=0>
  103. <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>
  104. <td><p class=pagetitle><img src="../img/t.gif" width=265 height=1 alt=""><br>demo.design<br>3D programming FAQ</td>
  105. <td align=center><p class=navy><a href="25.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>
  106. <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>
  107. <td align=center><p class=navy><a href="32.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>
  108. </table>
  109. <img src="../img/t.gif" width=500 height=4 alt=""><br>
  110. <img src="../img/b.gif" width=500 height=1 alt=""><br>
  111. <img src="../img/t.gif" width=500 height=1 alt=""><br>
  112. <img src="../img/b.gif" width=500 height=1 alt=""><br>
  113. </center></body>
  114. </html>