42.htm 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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/b4.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>4.2. Аффинное
  54. <!-- Article -->
  55. <p>Этот метод текстурирования основан на приближении u, v линейными функциями.
  56. Итак, пусть u - линейная функция, u = k1*sx+k2*sy+k3. Можно посчитать k1,
  57. k2, k3 исходя из того, что хотя бы в вершинах грани u должно совпадать с
  58. точным значением - это даст нам три уравнения, из которых быстро и просто
  59. находятся эти коэффициенты, и потом считать u по этой формуле. Но это все
  60. равно медленно - два умножения на пиксел.
  61. <p>Будем рисовать грань по строкам - это общепринято, довольно просто, и не
  62. доводит до умопомешательства кэш-память процессора. Вершины грани заранее
  63. отсортируем по sy (например, A.sy <= B.sy <= C.sy). Для каждой строки можно
  64. посчитать начальное значение x, u (так же, как и для x, ведь u по любой прямой
  65. меняется тоже линейно), а также длину этой строки.
  66. <p><center><img src="illu/illu42a.gif" width=180 height=180 alt="рисунок (illu/illu42a.gif)"></center>
  67. <p>В нарисованном случае, например,
  68. <p class=expression>
  69. x_start = A.sx+(current_sy-A.sy)*(C.sx-A.sx)/(C.sy-A.sy),<br>
  70. u_start = A.u+(current_sy-A.sy)*(C.u-A.u)/(C.sy-A.sy),<br>
  71. x_end = A.sx+(current_sy-B.sy)*(B.sx-A.sx)/(B.sy-A.sy),<br>
  72. length = x_end - x_start.<br>
  73. <p>Какие вершины использовать в этих формулах - это уже проблемы рисования
  74. треугольника, а не текстурирования. Лично я просто храню x_start, x_end,
  75. u_start, на каждом переходе вниз на строчку прибавляю к
  76. <p class=expression>delta_x_start = (C.sx-A.sx)/(C.sy-A.sy),<br>
  77. <p>и аналогично высчитываемые приращения для x_end, u_start. Вот только надо
  78. аккуратно следить за тем, какая сторона правая, какая - левая, и на каком мы
  79. сейчас промежутке находимся - то ли AB, то ли BC, и соответственно изменять
  80. приращения. Впрочем, все это - уже обыкновенное рисование треугольника. В
  81. примерах просто сделано решение "в лоб" - проверяем, какой участок - AB или
  82. BC - пересекает текущая строка, считаем x/u/v на обоих концах, считаем длину
  83. строки и берем соответствующие левому концу (то есть меньшему x) значения u
  84. и v.
  85. <p>Так вот. Посчитали начало строки, длину строки, u в начале строки. Осталось
  86. заметить, что раз уж u = k1*sx+k2*sy+k3, то при переходе к следующему пикселу
  87. строки у нас u изменяется на k1 (так же известный как du/dsx). Это число и
  88. надо как-то посчитать. Например, так:
  89. <p><center><img src="illu/illu42b.gif" width=180 height=180 alt="рисунок (illu/illu42b.gif)"></center>
  90. <p class=expression>x_start = A.sx+(B.sy-A.sy)*(C.sx-A.sx)/(C.sy-A.sy),<br>
  91. x_end = B.sx,<br>
  92. u_start = A.u+(B.sy-A.sy)*(C.u-A.u)/(C.sy-A.sy),<br>
  93. u_end = B.u,<br>
  94. du_dsx = (u_start-u_end)/(x_start-x_end).<br>
  95. <p>du/dsx - просто число, оно не меняется на всем треугольнике, поэтому просто
  96. считаем его там, где удобно, и берем посчитанное значение.
  97. <p>v (из тех же соображений) считается абсолютно точно так же, надо только во
  98. всех приведенных формулах u заменить на v, и все.
  99. <p>Теперь осталось только взять и нарисовать эту строку:
  100. <pre class=source>
  101. // ...
  102. u = u_start;
  103. v = v_start;
  104. for (current_sx = x_start; current_sx <= x_end; current_sx++) {
  105. putpixel(current_sx, current_sy, texture[(int)v][(int)u]);
  106. u += du_dsx;
  107. v += dv_dsx;
  108. }
  109. // ...
  110. </pre>
  111. <p>Пройдясь по всем строкам грани - т.е. пробежавшись current_sy по значениям
  112. от A.sy до C.sy (вершины отсортированы!), получим текстурированную грань.
  113. Voila!
  114. </div>
  115. </td></table>
  116. <!-- Bottom Navigation -->
  117. <img src="../img/b.gif" width=500 height=1 alt=""><br><img src="../img/t.gif" width=500 height=2 alt=""><br>
  118. <table width=500 cellpadding=0 cellspacing=0 border=0>
  119. <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>
  120. <td><p class=pagetitle><img src="../img/t.gif" width=265 height=1 alt=""><br>demo.design<br>3D programming FAQ</td>
  121. <td align=center><p class=navy><a href="41.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>
  122. <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>
  123. <td align=center><p class=navy><a href="43.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>
  124. </table>
  125. <img src="../img/t.gif" width=500 height=4 alt=""><br>
  126. <img src="../img/b.gif" width=500 height=1 alt=""><br>
  127. <img src="../img/t.gif" width=500 height=1 alt=""><br>
  128. <img src="../img/b.gif" width=500 height=1 alt=""><br>
  129. </center></body>
  130. </html>