75.htm 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  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. Разное. Формат 3DS-файла.</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.5. Формат 3DS-файла
  54. <!-- Article -->
  55. <p>Основная идея вот: файл 3DS состоит из блоков (chunks), каждый из которых
  56. содержит какие-то полезные данные и, возможно, подблоки. Большинство блоков
  57. содержит либо данные, либо подблоки, хотя есть и смешанные блоки. Общий
  58. формат каждого блока такой:
  59. <p><table cellpadding=0 cellspacing=0 border=0 align=center><td bgcolor=#5E5EA5>
  60. <p><table cellspacing=1 cellpadding=4 border=0 align=center>
  61. <tr><td align=right bgcolor=white>смещение</td><td bgcolor=white>длина</td><td bgcolor=white>данные</td></tr>
  62. <tr><td align=right bgcolor=white>0</td><td align=right bgcolor=white>2</td><td bgcolor=white>идентификатор типа блока, chunk_id</td></tr>
  63. <tr><td align=right bgcolor=white>2</td><td align=right bgcolor=white>4</td><td bgcolor=white>длина блока, chunk_len</td></tr>
  64. <tr><td align=right bgcolor=white>4</td><td align=right bgcolor=white>chunk_len</td><td bgcolor=white>данные или подблоки (в зависимости от chunk_id)</td></tr>
  65. </table>
  66. </td></table>
  67. <p>В качестве относительно полного описания конкретного содержимого блоков
  68. я бы порекомендовал следующие вещи:
  69. <ul>
  70. <li><p>исходники 3DS reader от MRI/Doomsday, читаются они просто великолепно.
  71. Скачать можно на<br> <a href="ftp://ftp.cdrom.com/pub/demos/code/3ds/3dsrdr13.zip">ftp://ftp.cdrom.com/pub/demos/code/3ds/3dsrdr13.zip</a>;
  72. <li><p>3dsinfo.txt от digisnap.
  73. </ul>
  74. <p>Здесь я приведу лишь частичное описание, достаточное, впрочем, для того,
  75. чтобы прочитать из 3DS-файла 3D сцену и информацию о ее (сцены) анимации.
  76. <p>Итак, список идентификаторов типов нужных нам для этого блоков:
  77. <pre class=source>
  78. CHUNK_MAIN = 0x4D4D; // [-] сцена
  79. CHUNK_OBJMESH = 0x3D3D; // [-] всяческие объекты
  80. CHUNK_OBJBLOCK = 0x4000; // [+] объект
  81. CHUNK_TRIMESH = 0x4100; // [-] trimesh-объект
  82. CHUNK_VERTLIST = 0x4110; // [+] список вершин
  83. CHUNK_FACELIST = 0x4120; // [+] список граней
  84. CHUNK_FACEMAT = 0x4130; // [+] материалы граней
  85. CHUNK_MAPLIST = 0x4140; // [+] текстурные координаты
  86. CHUNK_TRMATRIX = 0x4160; // [+] матрица перевода
  87. CHUNK_CAMERA = 0x4700; // [+] объект-камера
  88. CHUNK_MATERIAL = 0xAFFF; // [-] материал
  89. CHUNK_MATNAME = 0xA000; // [+] название материала
  90. CHUNK_TEXTURE = 0xA200; // [-] текстура материала
  91. CHUNK_MAPFILE = 0xA300; // [+] имя файла текстуры
  92. HUNK_KEYFRAMER = 0xB000; // [-] информация об анимации
  93. CHUNK_TRACKINFO = 0xB002; // [-] поведение объекта
  94. CHUNK_TRACKOBJNAME = 0xB010; // [+] название этого объекта
  95. CHUNK_TRACKPIVOT = 0xB013; // [+] центр вращения объекта
  96. CHUNK_TRACKPOS = 0xB020; // [+] траектория объекта
  97. CHUNK_TRACKROTATE = 0xB021; // [+] траектория вращения
  98. // объекта
  99. CHUNK_TRACKCAMERA = 0xB003; // [-] поведение камеры
  100. CHUNK_TRACKFOV = 0xB023; // [+] поведение FOV камеры
  101. CHUNK_TRACKROLL = 0xB024; // [+] поведение roll камеры
  102. CHUNK_TRACKCAMTGT = 0xB004; // [-] поведение "цели" камеры
  103. </pre>
  104. <p>Конкретные данные содержат лишь блоки, отмеченные плюсом, остальные блоки
  105. состоят лишь из подблоков и их нам надо различать лишь потому, что нужные
  106. нам блоки данных - подблоки этих остальных. То есть, скажем, CHUNK_OBJMESH
  107. нам надо знать из-за того, что каждый объект в сцене описывается блоком
  108. CHUNK_OBJBLOCK, который появляется только как подблок CHUNK_OBJMESH, и
  109. просто игнорировать весь CHUNK_OBJMESH из-за этого нельзя. Кроме того, они
  110. задают структуру - например, все данные, что относятся к текущему блоку
  111. CHUNK_OBJBLOCK, относятся к текущему объекту, а подблоки этого блока уже
  112. могут быть разбросаны как угодно.
  113. <p>А теперь - относительно полное описание того, какие данные содержатся в
  114. каждом из блоков. Будут использоваться следующие обозначения:
  115. <p><table width=480 cellspacing=0 cellpadding=0 border=0 align=center>
  116. <tr><td><p class=expression>char[]</td><td>ASCIIZ-строка (ASCII-строка, оканчивающаяся нулем)</td></tr>
  117. <tr><td><p class=expression>byte </td><td>8-битное беззнаковое целое число</td></tr>
  118. <tr><td><p class=expression>word </td><td>16-битное беззнаковое целое число</td></tr>
  119. <tr><td><p class=expression>dword </td><td>32-битное целое число</td></tr>
  120. <tr><td><p class=expression>float </td><td>32-битное число с плавающей запятой</td></tr>
  121. <tr><td><p class=expression>vector</td><td>float x,z,y</td></tr>
  122. </table>
  123. <p>Здесь (в самой последней строчке) опечатки нет! В файле 3DS везде изменен
  124. порядок следования y и z; то есть в файле данных ось y смотрит вглубь экрана,
  125. а ось z - вверх. Несмотря на то, что в самой 3D Studio ось y смотрит как раз
  126. вверх, а z - вдаль.
  127. <p><table width=480 cellspacing=0 cellpadding=0 border=0 align=center>
  128. <tr><td><p class=expression>Блок: </td><td>CHUNK_VERTLIST
  129. </td></tr><tr><td valign=top><p class=expression>Данные: </td><td><div align=justify>
  130. список вершин текущего объекта
  131. </td></tr><tr><td valign=top><p class=expression>Формат: </td><td><div align=justify>
  132. <pre class=sourceu>
  133. word num; // число вершин
  134. vector vertices[num]; // координаты каждой из вершин
  135. </pre>
  136. </td></tr>
  137. <tr><td><p class=expression>Блок: </td><td>CHUNK_FACELIST
  138. </td></tr><tr><td valign=top><p class=expression>Данные: </td><td><div align=justify>
  139. список граней текущего объекта
  140. </td></tr><tr><td valign=top><p class=expression>Формат: </td><td><div align=justify>
  141. <pre class=sourceu>
  142. word num; // число граней
  143. struct { //
  144. word v0; // номер первой вершины грани
  145. word v1; // номер второй вершины грани
  146. word v2; // номер третьей вершины грани
  147. word flags; // флаги грани
  148. } faces[num]; // собственно список граней
  149. </pre>
  150. </td></tr>
  151. <tr><td><p class=expression>Блок: </td><td>CHUNK_FACEMAT
  152. </td></tr><tr><td valign=top><p class=expression>Данные: </td><td><div align=justify>
  153. название материала и список тех граней объекта, которым назначен
  154. этот материал; таких блоков может быть несколько (грани с разными
  155. материалами в одном объекте), а может вообще не быть, если объекту
  156. материалы вообще не назначены (нетекстурированный объект)
  157. </td></tr><tr><td valign=top><p class=expression>Формат: </td><td><div align=justify>
  158. <pre class=sourceu>
  159. char name[]; // название материала
  160. word num; // число граней из этого материала
  161. word face_nums[num]; // список номеров граней из этого
  162. // материала
  163. </pre>
  164. </td></tr>
  165. <tr><td><p class=expression>Блок: </td><td>CHUNK_MAPLIST
  166. </td></tr><tr><td valign=top><p class=expression>Данные: </td><td><div align=justify>
  167. текстурные координаты вершин текущего объекта
  168. </td></tr><tr><td valign=top><p class=expression>Формат: </td><td><div align=justify>
  169. <pre class=sourceu>
  170. word num; // число вершин
  171. struct { //
  172. float u; // координата текстуры U
  173. // (по горизонтали)
  174. float v; // координата текстуры V
  175. // (по вертикали)
  176. } texcoords[num]; // собственно список текстурных
  177. // координат
  178. </pre>
  179. <p>Текстурные координаты задаются в диапазоне 0..1. Точка с U=0, V=0 - левый
  180. верхний край текстуры; U=1, V=1 - правый нижний; U=0.5, V=0.5 - центр
  181. текстуры.
  182. </td></tr>
  183. <tr><td><br></td></tr>
  184. <tr><td><p class=expression>Блок: </td><td>CHUNK_TRMATRIX
  185. </td></tr><tr><td valign=top><p class=expression>Данные: </td><td><div align=justify>
  186. содержит матрицу перевода объекта в некое абстрактное начальное
  187. состояние; в то, что было первоначально смоделировано. Требуется
  188. для корректного отображения анимации: дело в том, что все объекты
  189. в файле хранятся по состоянию на нулевой кадр, а анимация записана
  190. по отношению к "начальным" моделям. Т.е. при отображений нулевого
  191. кадра эта матрица не нужна, а при отображении всего набора кадров
  192. надо будет сначала перевести объекты в "начальное" состояние с
  193. помощью этой самой матрицы перевода и применять все преобразования
  194. (перемещения, повороты, etc) именно к "начальным" объектам.
  195. </td></tr><tr><td valign=top><p class=expression>Формат: </td><td><div align=justify>
  196. <pre class=sourceu>
  197. float rotmatrix[3][3]; // матрица поворота
  198. vector offset; // смещение начального объекта
  199. </pre>
  200. <p>Для перевода объекта в "начальное" состояние надо сначала сдвинуть его
  201. назад, то есть на вектор -offset (НЕ на offset), а потом применить матрицу
  202. поворота rotmatr. Матрица записана построчно. Не забудьте - в ней y и z
  203. тоже везде обменены местами!
  204. </td><tr>
  205. <tr><td><br></td></tr>
  206. <tr><td><p class=expression>Блок: </td><td>CHUNK_MATNAME
  207. </td></tr><tr><td valign=top><p class=expression>Данные: </td><td><div align=justify>
  208. название материала
  209. </td></tr><tr><td valign=top><p class=expression>Формат: </td><td><div align=justify>
  210. <pre class=sourceu>char[] name; // название материала</pre>
  211. </td></tr>
  212. <tr><td><p class=expression>Блок: </td><td>CHUNK_MAPFILE
  213. </td></tr><tr><td valign=top><p class=expression>Данные: </td><td><div align=justify>
  214. имя файла с текстурой
  215. </td></tr><tr><td valign=top><p class=expression>Формат: </td><td><div align=justify>
  216. <pre class=sourceu>char[] filename; // имя файла с текстурой</pre>
  217. </td></tr>
  218. <tr><td><p class=expression>Блок: </td><td>CHUNK_TRACKOBJNAME
  219. </td></tr><tr><td valign=top><p class=expression>Данные: </td><td><div align=justify>
  220. название объекта, информация о поведении которого задается в
  221. текущем блоке CHUNK_TRACKINFO
  222. </td></tr><tr><td valign=top><p class=expression>Формат: </td><td><div align=justify>
  223. <pre class=sourceu>
  224. char[] name; // название объекта
  225. word flags[2]; // флаги
  226. word parent; // номер объекта-родителя
  227. </pre>
  228. <p>Поле parent используется для построения иерархической структуры; дерева
  229. объектов. Каждому объекту присваивается его порядковый номер при следовании
  230. в файле, поле parent выставляется в -1, если у данного объекта нет родителя.
  231. Вот пример.
  232. <pre class=formula>
  233. объект | номер | parent
  234. --------+-------+--------
  235. A | 0 | -1
  236. B | 1 | 0 A
  237. C | 2 | 1 +---------+----+
  238. D | 3 | 2 B K N
  239. E | 4 | 1 +----+----+ + +
  240. F | 5 | 4 C E H L O
  241. G | 6 | 5 + + + + +
  242. H | 7 | 1 D F I M P
  243. I | 8 | 7 + +
  244. J | 9 | 8 G J
  245. K | 10 | 0
  246. L | 11 | 10
  247. M | 12 | 11
  248. N | 13 | 0
  249. O | 14 | 13
  250. P | 15 | 14
  251. </pre>
  252. <p>Насколько я понял, дерево используется следующим образом: если к какому-то
  253. узлу дерева применяется преобразование, то оно же автоматически применяется
  254. и ко всем узлам, "растущим" из этого. То есть, если объект B в нашем примере
  255. есть рука, а объекты C, D, E, F, G, H, I, J - пальцы, то при повороте руки
  256. пальцы должны повернуться автоматически, вместе с рукой. В результате блок
  257. CHUNK_TRACKROTATE для пальцев может быть пустым, а пальцы будут вращаться
  258. вместе с рукой.
  259. </td></tr>
  260. <tr><td><br></td></tr>
  261. <tr><td><p class=expression>Блок: </td><td>CHUNK_TRACKPIVOT
  262. </td></tr><tr><td valign=top><p class=expression>Данные: </td><td><div align=justify>
  263. координаты центра вращения объекта
  264. </td></tr><tr><td valign=top><p class=expression>Формат: </td><td><div align=justify>
  265. <pre class=sourceu>vector pivotpoint; // координаты центра вращения</pre>
  266. <p>Центр вращения - это как раз та точка "начального" объекта, через которую
  267. надо будет провести ось вращения, задающуюся в блоке CHUNK_TRACKROTATE.
  268. </td></tr>
  269. <tr><td><br></td></tr>
  270. <tr><td><p class=expression>Блок: </td><td>CHUNK_TRACKPOS
  271. </td></tr><tr><td valign=top><p class=expression>Данные: </td><td><div align=justify>
  272. траектория объекта, заданная ключевыми значениями положения объекта
  273. </td></tr><tr><td valign=top><p class=expression>Формат: </td><td><div align=justify>
  274. <pre class=sourceu>
  275. word flags; // флаги
  276. byte unknown[8]; // <неизвестно>
  277. dword num; // число ключевых значений
  278. struct { //
  279. dword frame; // кадр данного ключевого значения
  280. word splineflags; // флаги сплайна
  281. float[] splineinfo; // параметры сплайна (кол-во и тип
  282. // зависит от значения splineflags)
  283. vector pos; // положение объекта
  284. } keys[num]; // собственно ключевые значения
  285. <tr><td><p class=expression>Блок: </td><td>CHUNK_TRACKROTATE
  286. </td></tr><tr><td valign=top><p class=expression>Данные: </td><td><div align=justify>
  287. траектория вращения объекта, заданная ключевыми значениями вектора
  288. направления оси вращения и угла поворота относительно этой оси
  289. </td></tr><tr><td valign=top><p class=expression>Формат: </td><td><div align=justify>
  290. <pre class=sourceu>
  291. word flags; // флаги
  292. byte unknown[8]; // <неизвестно>
  293. dword num; // число ключевых значений
  294. struct { //
  295. dword frame; // кадр данного ключевого значения
  296. word splineflags; // флаги сплайна
  297. float[] splineinfo; // параметры сплайна (кол-во и тип
  298. // зависят от значения splineflags)
  299. float angle; // угол поворота (в радианах)
  300. vector rotaxis; // ось вращения
  301. } keys[num]; // собственно ключевые значения
  302. </pre>
  303. <p>Только самое первое ключевое значение задает абсолютный поворот. Все
  304. последующие задают "добавочный" поворот, который надо добавить ко всем,
  305. уже сделанным. То есть, во второй ключевой позиции мы последовательно
  306. применяем повороты, заданные первым и вторым ключом, в третьей - первым,
  307. вторым и третьим, и так далее.
  308. </td></tr>
  309. <tr><td><br></td></tr>
  310. <tr><td><p class=expression>Блок: </td><td>CHUNK_TRACKCAMERA
  311. </td></tr><tr><td valign=top><p class=expression>Данные: </td><td><div align=justify>
  312. траектория камеры, заданная ключевыми значениями положения, угла
  313. зрения, ориентации камеры
  314. </td></tr><tr><td valign=top><p class=expression>Формат: </td><td><div align=justify>
  315. <p>Состоит из подблоков CHUNK_TRACKOBJNAME, CHUNK_TRACKPOS, CHUNK_TRACKFOV,
  316. CHUNK_TRACKROLL и некоторых других, которые можно безболезненно игнорировать.
  317. </td></tr>
  318. <tr><td><br></td></tr>
  319. <tr><td><p class=expression>Блок: </td><td>CHUNK_TRACKFOV
  320. </td></tr><tr><td valign=top><p class=expression>Данные: </td><td><div align=justify>
  321. поведение FOV (угла зрения) камеры, заданное ключевыми значениями
  322. </td></tr><tr><td valign=top><p class=expression>Формат: </td><td><div align=justify>
  323. <pre class=sourceu>
  324. word flags; // флаги
  325. byte unknown[8]; // <неизвестно>
  326. dword num; // число ключевых значений
  327. struct { //
  328. dword frame; // кадр данного ключевого значения
  329. word splineflags; // флаги сплайна
  330. float[] splineinfo; // параметры сплайна (кол-во и тип
  331. // зависят от значения splineflags)
  332. float FOV; // значение FOV
  333. } keys[num]; // собственно ключевые значения
  334. </pre>
  335. </td></tr>
  336. <tr><td><p class=expression>Блок: </td><td>CHUNK_TRACKROLL
  337. </td></tr><tr><td valign=top><p class=expression>Данные: </td><td><div align=justify>
  338. поведение roll (угла наклона) камеры, заданное ключевыми значениями
  339. </td></tr><tr><td valign=top><p class=expression>Формат: </td><td><div align=justify>
  340. <pre class=sourceu>
  341. word flags; // флаги
  342. byte unknown[8]; // <неизвестно>
  343. dword num; // число ключевых значений
  344. struct { //
  345. dword frame; // кадр данного ключевого значения
  346. word splineflags; // флаги сплайна
  347. float[] splineinfo; // параметры сплайна (кол-во и тип
  348. // зависят от значения splineflags)
  349. float roll; // значение roll
  350. } keys[num]; // собственно ключевые значения
  351. </pre>
  352. <tr><td><p class=expression>Блок: </td><td>CHUNK_TRACKCAMTGT
  353. </td></tr><tr><td valign=top><p class=expression>Данные: </td><td><div align=justify>
  354. траектория "цели" камеры (точки, куда камера смотрит), заданная
  355. ключевыми значениями положения
  356. </td></tr><tr><td valign=top><p class=expression>Формат: </td><td><div align=justify>
  357. <p>Состоит из подблоков CHUNK_TRACKOBJNAME, CHUNK_TRACKPOS и некоторых других,
  358. которые можно безболезненно игнорировать.
  359. </tr></td>
  360. </table>
  361. <p>Теперь к вопросу о сплайнах и их параметрах. Всего может быть до пяти разных
  362. параметров сплайна, появление каждого из них задается каким-то битом в
  363. поле splineflags:
  364. <ul>
  365. <li><p>установлен бит 0: следует параметр "tension"
  366. <li><p>установлен бит 1: следует параметр "continuity"
  367. <li><p>установлен бит 2: следует параметр "bias"
  368. <li><p>установлен бит 3: следует параметр "ease to"
  369. <li><p>установлен бит 4: следует параметр "ease from"
  370. </ul>
  371. <p>То есть при чтении флагов надо последовательно тестировать каждый бит и,
  372. если он установлен, читать соответствующий параметр; если не установлен,
  373. значит, параметр равен нулю. 3D Studio использует <a href="76.htm">сплайны&nbsp;Кочанека-Бартельса</a>
  374. (Kochanek-Bartels) для интерполяции положения и поворотов, при этом повороты
  375. вдобавок представляются в форме кватернионов, в ней же и интерполируются.
  376. </div>
  377. </td></table>
  378. <!-- Bottom Navigation -->
  379. <img src="../img/b.gif" width=500 height=1 alt=""><br><img src="../img/t.gif" width=500 height=2 alt=""><br>
  380. <table width=500 cellpadding=0 cellspacing=0 border=0>
  381. <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>
  382. <td><p class=pagetitle><img src="../img/t.gif" width=265 height=1 alt=""><br>demo.design<br>3D programming FAQ</td>
  383. <td align=center><p class=navy><a href="74.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>
  384. <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>
  385. <td align=center><p class=navy><a href="76.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>
  386. </table>
  387. <img src="../img/t.gif" width=500 height=4 alt=""><br>
  388. <img src="../img/b.gif" width=500 height=1 alt=""><br>
  389. <img src="../img/t.gif" width=500 height=1 alt=""><br>
  390. <img src="../img/b.gif" width=500 height=1 alt=""><br>
  391. </center></body>
  392. </html>