78.htm 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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/b7.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>7.8. Обратная трассировка лучей
  54. <!-- Article -->
  55. <p>Обратная трассировка лучей (она же рэйкастинг, raycasting) - простой, хотя
  56. и довольно медленный, метод получения высокореалистичных изображений. Этот
  57. метод часто путают с прямой трассировкой лучей (рэйтрэйсинг, raytracing),
  58. которая, на самом деле, практически никогда и никем не используется из-за
  59. своей редкостной неэффективности. Впрочем, эти два термина уже практически
  60. и не различают.
  61. <p>Итак, идея обратной трассировки лучей. Для определения цвета пиксела экрана
  62. через него из камеры проводится луч, ищется его ближайшее пересечение со
  63. сценой и определяется освещенность точки пересечения. Эта освещенность
  64. складывается из отраженной и преломленной энергий, непосредственно
  65. полученных от источников света, а также отраженной и преломленной энергий,
  66. идущих от других объектов сцены. После определения освещенности этой точки
  67. учитывается ослабление света при прохождении через прозрачный материал и
  68. в результате получается цвет точки экрана.
  69. <p>Для определения освещенности, привносимой непосредственным освещением, из
  70. точки пересечения выпускаются лучи ко всем источникам света и определяется
  71. вклад всех источников, которые не заслонены другими объектами сцены. Для
  72. определения отраженной и преломленной освещенности из точки выпускаются
  73. отраженный и преломленный лучи и определяется привносимая ими освещенность.
  74. <p>Непосредственное освещение от источника света считаем, например, по уравнению
  75. Фонга (см. <a href="51.htm">п.5.1</a>). На самом деле, компоненты diffuse и specular в этом
  76. уравнении для большей реалистичности с точки зрения физики надо разделить
  77. на квадрат расстояния до источника света, но обычно этим пренебрегают.
  78. <p>Ослабление света в прозрачной среде учитывается делением на коэффициент
  79. <p class=expression>k = exp(beta * l),<br>
  80. <p>где
  81. <p><table width=480 cellspacing=0 cellpadding=0 border=0 align=center>
  82. <tr><td><p class=expression>k</td><td>коэффициент ослабления</td></tr>
  83. <tr><td><p class=expression>beta</td><td>коэффициент прозрачности среды</td></tr>
  84. <tr><td><p class=expression>l</td><td>длина пути внутри среды</td></tr>
  85. </table>
  86. <p>Наконец, преломляется луч света по следующему закону:
  87. <p class=expression>sin(b) = n1 * sin(a) / n2,<br>
  88. <p>где
  89. <p><table width=480 cellspacing=0 cellpadding=0 border=0 align=center>
  90. <tr><td><p class=expression>a</td><td>угол между падающим лучом L и нормалью N</td></tr>
  91. <tr><td><p class=expression>b</td><td>угол между преломленным лучом L' и нормалью N</td></tr>
  92. <tr><td><p class=expression>n1</td><td>коэффициент преломления среды, в которой проходит луч L</td></tr>
  93. <tr><td><p class=expression>n2</td><td>коэффициент преломления среды, в которой проходит луч L'</td></tr>
  94. </table>
  95. <p>Вот иллюстрация.
  96. <p><center><img src="illu/illu78a.gif" width=180 height=180 alt="рисунок (illu/illu78a.gif)"></center>
  97. <p>Для воздуха считают beta = 0, n = 1; для всех остальных сред обычно beta > 0,
  98. n > 1. Надо отметить, что все эти коэффициенты (отражения, преломления,
  99. прозрачности) различны для каждой из трех цветовых компонент R, G, B. Еще
  100. надо отметить, что обычно объекты непрозрачны и поэтому преломлением
  101. пренебрегают.
  102. <p>Алгоритм работы функции трассировки луча с началом o = (ox,oy,oz) и
  103. направлением d = (dx,dy,dz), возвращающей, кстати, освещенность по всем трем
  104. цветовым компонентам, будет, таким образом, выглядеть примерно так:
  105. <ul>
  106. <li><p>
  107. ищем ближайшее пересечение луча со сценой (определяем точку p, где
  108. произошло пересечение, выясняем, с каким конкретно объектом оно
  109. произошло)
  110. <ul>
  111. <li><p>если не нашли, возвращаем 0
  112. <li><p>если пересечение есть, текущую освещенность полагаем равной
  113. фоновой освещенности (ambient)
  114. </ul>
  115. <li><p>определяем вектор n, нормаль к объекту в точке пересечения
  116. <li><p>для кажого (точечного) источника света
  117. <ul>
  118. <li><p>считаем вектор l, соединяющий источник и точку p (начало в p)
  119. <li><p>ищем пересечение луча с началом в точке p и направлением d со сценой
  120. <ul><li><p>если нашли, прекращаем обработку этого источника, так как его не видно</ul>
  121. <li><p>считаем симметричный l относительно n вектор r
  122. <li><p>считаем по уравнению Фонга (оно использует n, l, r, d) освещенность
  123. в точке за счет этого источника света, добавляем ее к текущей
  124. </ul>
  125. <li><p>считаем симметричный d относительно n вектор refl, то есть отраженный
  126. вектор
  127. <li><p>трассируем отраженный луч (с началом p и направлением refl), добавляем
  128. полученную освещенность к текущей
  129. <li><p>считаем направление преломленного луча (вектор refr) по d, n и
  130. коэффициентам преломления
  131. <li><p>трассируем преломленный луч (с началом p и направлением refr), добавляем
  132. полученную освещенность к текущей
  133. <li><p>покомпонентно умножаем текущую освещенность на цвет объекта
  134. <li><p>если для материала, заполняющего пройденную лучом от o до p трассу
  135. beta&nbsp;!=&nbsp;0, умножаем текущую освещенность на коэффициент ослабления
  136. <li><p>возвращаем текущую освещенность
  137. </ul>
  138. <p>При стандартной камере, которая находится в (0,0,-dist), и ориентирована так,
  139. что пикселу экрана (sx,sy) соотвествует 3D-точка (sx-xSize/2, ySize/2-sy, 0),
  140. для получения цвета пиксела (sx,sy), очевидно, достаточно оттрассировать луч,
  141. положив при этом
  142. <p class=expression>ox = oy = dz = 0,<br>
  143. oz = -dist,<br>
  144. dx = sx - xSize / 2,<br>
  145. dy = ySize / 2 - sy.<br>
  146. </div>
  147. </td></table>
  148. <!-- Bottom Navigation -->
  149. <img src="../img/b.gif" width=500 height=1 alt=""><br><img src="../img/t.gif" width=500 height=2 alt=""><br>
  150. <table width=500 cellpadding=0 cellspacing=0 border=0>
  151. <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>
  152. <td><p class=pagetitle><img src="../img/t.gif" width=265 height=1 alt=""><br>demo.design<br>3D programming FAQ</td>
  153. <td align=center><p class=navy><a href="77.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>
  154. <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>
  155. </table>
  156. <img src="../img/t.gif" width=500 height=4 alt=""><br>
  157. <img src="../img/b.gif" width=500 height=1 alt=""><br>
  158. <img src="../img/t.gif" width=500 height=1 alt=""><br>
  159. <img src="../img/b.gif" width=500 height=1 alt=""><br>
  160. </center></body>
  161. </html>