<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0">
<channel>
  <title>Сергей Ваткин</title>
  <link>http://wat.gamedev.ru/</link>
  <description>Сергей Ваткин</description>
  <language>ru</language>
  <generator>http://skif.qrim.ru/</generator>
  <image>
    <url>http://www.gamedev.ru/_img/imggen/?s=62</url>
    <title>Сергей Ваткин</title>
    <link>http://wat.gamedev.ru/</link>
  </image>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/?id=5100</guid>
  <pubDate>Tue, 27 Jul 2010 08:46:29 GMT</pubDate>
  <title>Конкурс арканоидов.</title>
  <link>http://wat.gamedev.ru/?id=5100</link>
  <category>конкурс</category>
  <description>
&lt;p&gt;На форуме спонтанно начался &lt;a href=&quot;http://www.gamedev.ru/flame/forum/?id=136045&quot;&gt;конкурс на лучший арканоид&lt;/a&gt;, созданный своими руками. Вливайтесь.&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/9_let</guid>
  <pubDate>Sat, 26 Jun 2010 10:25:40 GMT</pubDate>
  <title>GameDev.ru 9 лет!</title>
  <link>http://wat.gamedev.ru/9_let</link>
  <comments>http://wat.gamedev.ru/forum/?id=134996</comments>
  <description>
&lt;p&gt;Сегодня GameDev.ru исполняется 9 лет. Ресурс работает с 2001 года.&lt;/p&gt;
&lt;p&gt;Из достижений – чуть больше года сайт работает на новом движке. Пока полёт нормальный, но есть ещё вещи, которые нужно переделать, доделать и пофиксить. Ну, и периодическое over 9000 по посетителям в день. Некоторые изменения должны появиться в ближайший месяц.&lt;/p&gt;
&lt;p&gt;Ура!&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/Over_9000</guid>
  <pubDate>Wed, 02 Dec 2009 09:18:49 GMT</pubDate>
  <title>Over 9000</title>
  <link>http://wat.gamedev.ru/Over_9000</link>
  <category>GameDev.ru</category>
  <category>сайт</category>
  <description>
&lt;p&gt;Тут пару месяцев, как сайт преодолел 8 000 посетителей в день, постепенно приближался к over 9000. В рецензии на AG сослались на &lt;a href=&quot;http://www.gamedev.ru/terms/GNOME&quot;&gt;Гнома&lt;/a&gt;, что помогло в тот день дойти до 11 тысяч.
&lt;br /&gt;Слава Гному!&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/?id=4618</guid>
  <pubDate>Tue, 10 Nov 2009 15:12:40 GMT</pubDate>
  <title>Попытка борьбы со спамерами.</title>
  <link>http://wat.gamedev.ru/?id=4618</link>
  <description>
&lt;p&gt;Судя по Бане, спамеры всё чаще стали атаковать. Поскольку, новое предупреждение в регистрации не помогло, ввёл простой тест, фактически, &amp;laquo;от дурака&amp;raquo;. Посмотрим, поможет ли.&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/?id=4603</guid>
  <pubDate>Wed, 04 Nov 2009 12:10:13 GMT</pubDate>
  <title>Небольшая оптимизация движка сайта</title>
  <link>http://wat.gamedev.ru/?id=4603</link>
  <category>GameDev.ru</category>
  <description>
&lt;p&gt;За пару вечеров прошёлся по коду форума. Теперь главная страница форума генерируется быстро как никогда ранее. Раза в три быстрее, чем неделю назад. Немного и HTML уменьшил на многих страницах.&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/?id=4567</guid>
  <pubDate>Mon, 12 Oct 2009 23:43:42 GMT</pubDate>
  <title>Статья о сферических функциях</title>
  <link>http://wat.gamedev.ru/?id=4567</link>
  <category>Crytek</category>
  <category>статьи</category>
  <description>
&lt;p&gt;&lt;a href=&quot;http://www.gamedev.ru/users/?id=10462&quot;&gt;Антон Капланян&lt;/a&gt;, работающий сейчас в Крайтеке в R&amp;amp;D над освещением (и global illumination в частности) в движке CryENGINE, некоторые свои наработки и исследования завернул в статью &amp;laquo;&lt;a href=&quot;http://www.gamedev.ru/code/articles/Spherical_functions&quot;&gt;Детали использования сферических функций для интерактивного рендеринга&lt;/a&gt;&amp;raquo;. Статья про разложение &lt;a href=&quot;http://www.gamedev.ru/code/terms/BRDF&quot; title=&quot;BRDF (Bidirectional Reflectance Distribution Function)&quot;&gt;BRDF&lt;/a&gt; на ДФРС и ДФОС. :) 
&lt;p&gt;Кстати, вероятно, его последний исследовательский пайпер, который он писал совместно с одним профессором из Страсбурга, будет также переведён на русский и опубликован на GameDev.ru.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/anton_kaplanyan.jpg&quot; alt=&quot;Антон Капланян | Статья о сферических функциях&quot; /&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/?id=4395</guid>
  <pubDate>Fri, 26 Jun 2009 08:00:07 GMT</pubDate>
  <title>GameDev.ru 8 лет</title>
  <link>http://wat.gamedev.ru/?id=4395</link>
  <comments>http://wat.gamedev.ru/forum/?id=120439</comments>
  <category>GameDev.ru</category>
  <description>
&lt;p&gt;Сегодня GameDev.ru 8 лет! Ура!&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/?id=4373</guid>
  <pubDate>Mon, 15 Jun 2009 19:13:06 GMT</pubDate>
  <title>Нагрузка нового движка</title>
  <link>http://wat.gamedev.ru/?id=4373</link>
  <comments>http://wat.gamedev.ru/forum/?id=121228</comments>
  <description>
&lt;p&gt;Не смотря на то, что страницы стали быстрее собираться, сегодня с утра сайт просел на запросах в MySQL. Перепуганный хостер прислал письмо с примером моего мега-запроса. Оптимизирую.&lt;/p&gt;
&lt;p&gt;Update: Оптимизировал сложные запросы, перенастроил ключи в базе. Стало быстрее, пока летает. Посмотрим, что будет дальше.&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;&lt;object width=&quot;640&quot; height=&quot;505&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/P5s9XcHOWKI&amp;amp;hl=en&amp;amp;fs=1&amp;amp;&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot; /&gt;&lt;embed src=&quot;http://www.youtube.com/v/P5s9XcHOWKI&amp;amp;hl=en&amp;amp;fs=1&amp;amp;&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;640&quot; height=&quot;505&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/articles/men_kri2007</guid>
  <pubDate>Fri, 20 Apr 2007 05:50:04 GMT</pubDate>
  <title>Мужчины КРИ-2007.</title>
  <link>http://wat.gamedev.ru/articles/men_kri2007</link>
  <comments>http://wat.gamedev.ru/forum/?id=64264</comments>
  <category>индустрия</category>
  <category>КРИ</category>
  <category>фото</category>
  <description>
&lt;p&gt;По горячим следам Конференции Разработчиков Игр...
&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/kri2007_18.jpg&quot; alt=&quot;kri2007_18 | Мужчины КРИ-2007.&quot; /&gt;
&lt;br /&gt;Николай Дыбовский (Ice Pick Lodge)
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2007_09.jpg&quot; alt=&quot;Изображение&quot; /&gt;
&lt;br /&gt;Антон Юдинцев
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2007_03.jpg&quot; alt=&quot;Изображение&quot; /&gt;
&lt;br /&gt;Андрей Прохоров (Venom, S.T.A.L.K.E.R., 4A Games)
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2007_04.jpg&quot; alt=&quot;Изображение&quot; /&gt;
&lt;br /&gt;Сергей Забарянский (Venom, Xenus)
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2007_05.jpg&quot; alt=&quot;Изображение&quot; /&gt;
&lt;br /&gt;KVaks (Dynamic Systems, #ps2dev)
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2007_06.jpg&quot; alt=&quot;Изображение&quot; /&gt;
&lt;br /&gt;Airat (Ice Pick Lodge)
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2007_07.jpg&quot; alt=&quot;Изображение&quot; /&gt;
&lt;br /&gt;Krank
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2007_28.jpg&quot; alt=&quot;Изображение&quot; /&gt;
&lt;br /&gt;Птица (GAMMER)
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2007_08.jpg&quot; alt=&quot;Изображение&quot; /&gt;
&lt;br /&gt;Гном (1C)
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2007_10.jpg&quot; alt=&quot;Изображение&quot; /&gt;
&lt;br /&gt;GSC отдел продаж и ManOwaR
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2007_11.jpg&quot; alt=&quot;Изображение&quot; /&gt;
&lt;br /&gt;Олег Яворский (GSC) и Филлип Герасимов (NVIDIA)
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2007_13.jpg&quot; alt=&quot;Изображение&quot; /&gt;
&lt;br /&gt;Юрий Мирошников
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2007_14.jpg&quot; alt=&quot;Изображение&quot; /&gt;
&lt;br /&gt;Levelord
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2007_15.jpg&quot; alt=&quot;Изображение&quot; /&gt;
&lt;br /&gt;[Die]Ash
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2007_16.jpg&quot; alt=&quot;Изображение&quot; /&gt;
&lt;br /&gt;Николай Дыбовский
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2007_17.jpg&quot; alt=&quot;Изображение&quot; /&gt;
&lt;br /&gt;Николай Барышников
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2007_19.jpg&quot; alt=&quot;Изображение&quot; /&gt;
&lt;br /&gt;Рудольф Гейдер (Звук в ИЛ-2 Штурмовик)&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://wat.gamedev.ru/articles/men_kri2007?page=2&quot;&gt;Продолжение&lt;/a&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/?id=2317</guid>
  <pubDate>Tue, 13 Mar 2007 06:22:03 GMT</pubDate>
  <title>Новости на сайте.</title>
  <link>http://wat.gamedev.ru/?id=2317</link>
  <description>
&lt;p&gt;Новости вернулись в штатный режим. Работают по обновлённой системе, а комментарии попадают в нужный форум.&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/articles/igromir2006</guid>
  <pubDate>Mon, 13 Nov 2006 06:28:57 GMT</pubDate>
  <title>ИгроМир 2006.</title>
  <link>http://wat.gamedev.ru/articles/igromir2006</link>
  <comments>http://wat.gamedev.ru/forum/?id=57256</comments>
  <category>девчонки</category>
  <category>ИгроМир</category>
  <category>индустрия</category>
  <category>фото</category>
  <description>
&lt;p&gt;Признаться честно, на выставку я не собирался, причиной было время проведения: начало ноября у меня ассоциируется с холодом в Москве. Однако пришло решение, и удалось попасть в Москву, хоть и на неполные выходные, но всё же. 
&lt;p&gt;И погода в целом сталось терпимой. Хорошо, дождя не было, а в ночь на воскресение даже пошёл снег. По мне, такую выставку желательно было бы проводить летом, когда тепло, или в мае, как E3, как раз за 6 месяцев до рождественской распродажи, хорошее время для старта кампаний по раскрутке готовящихся к выходу игр. А вот КРИ можно и в ноябре, или даже в октябре, когда по осенней инерции народ готов к впитыванию учебно-полезной информации. Ну, да ладно, в силу традиций зародилось так, как есть.&lt;/p&gt;
&lt;p&gt;==Выставка==&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/enter.jpg&quot; alt=&quot;enter | ИгроМир 2006.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Так вот, &lt;a href=&quot;http://www.igromir-expo.ru/&quot;&gt;ИгроМир&lt;/a&gt; &amp;mdash; это выставка электронных развлечений, прошедшая впервые 4-5 ноября в этом 2006 году в Москве. Организатором выступил оргкомитет КРИ, которую в свою очередь организовал интернет портал для разработчиков и издателей компьютерных игр DEV.DTF (ныне просто DTF). &lt;/p&gt;
&lt;p&gt;Выставка, кроме демонстраций достижений народного игростроения, ещё и хороший повод для всевозможных встреч: деловых и дружеских в ресторане-туалете, и прямых столкновений изготовителей игр с их потребителями на стендах. Посетители имели возможность поиграть в новинки и демки, пообщаться, сфотографироваться с известными людьми, поучаствовать в конкурсах и получить самое яркое впечатление и даже, как оказалось в последствии, для многих сложнодушевное потрясение, &amp;mdash; оказаться среди множества неотразимых девиц, так называемых booth-babes (о них позже).&lt;/p&gt;
&lt;p&gt;==Стенды==&lt;/p&gt;
&lt;p&gt;===Nival===&lt;/p&gt;
&lt;p&gt;На входе посетителей встречала гордость признания российского геймдева зарубежом &amp;mdash; стенд пятых Героев. На ИгроМире была проведена презентация дополнения Heroes of Might and Magic V: Владыки севера, а рядом со стендом проводились рыцарские бои для зрителей.
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/restoran-tualet.jpg&quot; alt=&quot;restoran-tualet | ИгроМир 2006.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;===1C===&lt;/p&gt;
&lt;p&gt;Дальше по ходу перекрывал горизонт обычно-жёлтый стенд 1C, наполненный компьютерами, демонстрирующие новинки.
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/1c_nival.jpg&quot; alt=&quot;1c_nival | ИгроМир 2006.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Прямо в стенд была вмонтирована клетка, за которой томились девушки, охраняемые бойцом внушительных данных. Всё это вместе создавало атмосферу тюремной планеты Матросская Тишина из ролевой игры старой школы &amp;laquo;Санитары Подземелий&amp;raquo;, вселенную которой создал известный своими переводами кинофильмов Дмитрий Пучков, в простонародье старший оперуполномоченный &lt;a href=&quot;http://oper.ru/&quot;&gt;Goblin&lt;/a&gt;.
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/sanitari.jpg&quot; alt=&quot;sanitari | ИгроМир 2006.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Гоблин уже не в первый раз участвует в игровых проектах, например, использовались его тексты для озвучки роликов в игровом трешевом проекте &amp;laquo;Бумер&amp;raquo;, по одноимённому фильму, на этой же выставке была представлена &amp;laquo;смешная игра&amp;raquo; &amp;laquo;Братва и Кольцо&amp;raquo;. Дмитрий Пучков также посещал КРИ и даже читал на ней лекции. На ИгроМир он был приглашён фирмой 1С, где любители его творчества могли сфотографироваться с ним и получить автограф на память.
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/goblin_2.jpg&quot; alt=&quot;goblin | ИгроМир 2006.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Вокруг прохаживались вооружённые девушки с недавно вышедшей Второй Мировой &amp;mdash; масштабной тактической стратегии реального времени. Основным достоинством игры является то, что она фактически представляет собой интерактивную энциклопедию, военная техника, униформа, здания воссозданы до мельчайших подробностей по чертежам и фотохронике военных лет, даже ландшафты полей сражений соответствуют реальным. В России игра уже вышла, а вот на Западе она будет распространяться через Интернет издателем Battlefront.com.
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/vtorayamirovaya.jpg&quot; alt=&quot;vtorayamirovaya | ИгроМир 2006.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Рядом со своим стендом одинэсовцы пригнали грузовик, он, омытый Мирошниковым, олицетворял &amp;laquo;Дальнобойщиков-3&amp;raquo;.
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/dalnoboyshiki.jpg&quot; alt=&quot;dalnoboyshiki | ИгроМир 2006.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.gamedev.ru/users/?id=8431&quot;&gt;Дядя Дима&lt;/a&gt; доходчиво и внятно рассказывал взрослым и детям про игру: &amp;laquo;Это продолжение знаменитой серии &amp;laquo;Дальнобойщиков&amp;raquo;, в которой действие переносится в реальный мир Калифорнийских дорог. Разработчикам удалось очень хорошо передать атмосферу настоящих американских фривеев, кардинально улучшить графику и экономическую модель. Ждем и надеемся на выпуск игры в следующем году&amp;raquo;.
&lt;p&gt;На отдельном&amp;nbsp; стенде можно было оценить &amp;laquo;Механоиды: Гонки на выживание&amp;raquo; &amp;mdash; соревнования на скоростных смертоносных глайдерах &amp;mdash; машинах будущего. Гонки происходят в необычайном окружении на просторах планеты Полигон-4.&lt;/p&gt;
&lt;p&gt;Ониблейд &amp;mdash; первый российский экшен в аниме стилистике. Разработчики из Gaijin Entertainment предлагают стать частью легенды, рассказанной в лучших традициях аниме. Вас ждут лихие поединки, заклинания и боевые приёмы. Пожалуй, девушка со стенда игры собирала больше всего поклонников. Пробиться к ней было фактически не реально.
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/oniblaid.jpg&quot; alt=&quot;oniblaid | ИгроМир 2006.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Красочный стенд был у красочной ролевой&amp;nbsp; игры &amp;mdash; приключенческой саги &amp;laquo;Battle Lord&amp;raquo; (Легенда о Рыцаре). Игра насыщена сражениями в тактическом режиме. Увлекательное путешествие по огромному континенту из нескольких десятков связанных локаций. Разработчиком выступила команда Katauri Interactive, образованная в позапрошлом году во Владивостоке с участием выходцев из прославленной Elemental Games.
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/battlelord.jpg&quot; alt=&quot;battlelord | ИгроМир 2006.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;К сожалению, из-за девушек, восседающих на джипе, я забыл обратить внимание, была ли представлена сама игра &amp;laquo;Полный привод: УАЗ 4х4&amp;raquo; &amp;mdash; первый российский спортивный симулятор вождения внедорожника по труднопроходимой местности.
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/files/images/4x4.jpg&quot; alt=&quot;4x4 | ИгроМир 2006.&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://wat.gamedev.ru/articles/igromir2006?page=2&quot;&gt;Продолжение&lt;/a&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/?id=1079</guid>
  <pubDate>Fri, 13 Oct 2006 10:18:14 GMT</pubDate>
  <title>Вторая Мировая</title>
  <link>http://wat.gamedev.ru/?id=1079</link>
  <comments>http://wat.gamedev.ru/forum/?id=55791</comments>
  <category>мои проекты</category>
  <description>
&lt;p&gt;Пришло письмо от Барышникова:&lt;/p&gt;
&lt;p&gt;Фирма 1С объявляет об отправке в печать игры &amp;laquo;Вторая мировая&amp;raquo;. В розничную продажу долгожданная стратегия в реальном времени, отличающаяся высоким уровнем достоверности моделируемых событий, поступит 20 октября 2006 года в рамках серии 1С:КОЛЛЕКЦИЯ ИГРУШЕК (4 CD-ROM или 1 DVD-ROM). &lt;/p&gt;
&lt;p&gt;УРА!&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/?id=1012</guid>
  <pubDate>Wed, 20 Sep 2006 21:57:14 GMT</pubDate>
  <title>Обновление для журналов и статей в сообществах</title>
  <link>http://wat.gamedev.ru/?id=1012</link>
  <category>сайт</category>
  <description>
&lt;p&gt;1. Теперь для журналов и статей можно добавлять теги и, соответственно, потом можно делать выборку по ним.
&lt;br /&gt;2. Для журналов теперь есть cut.&lt;/p&gt;
&lt;p&gt;Кат делается либо так:&lt;/p&gt;
&lt;p&gt; 8&amp;lt;---Пример использования---&lt;/p&gt;
&lt;p&gt;либо тег  единственный на строке.&lt;/p&gt;
&lt;p&gt;Повторные каты поочереди сначала открывают текст, потом текст опять прячется.&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/articles/kri2006_business</guid>
  <pubDate>Thu, 04 May 2006 21:56:39 GMT</pubDate>
  <title>КРИ 2006: Работа с издателями и продвижение своего проекта.</title>
  <link>http://wat.gamedev.ru/articles/kri2006_business</link>
  <category>индустрия</category>
  <category>КРИ</category>
  <description>
&lt;p&gt;Юрий Мирошников. FAQ 2006.
&lt;br /&gt;Сергей Герасёв (1С): Особенности взаимоотношений с западными издателями. 
&lt;br /&gt;Нуретдинова Лариса (Nival Interactive): Внимание прессы: дешево и сердито.
&lt;p&gt;==Юрий Мирошников. FAQ 2006.==&lt;/p&gt;
&lt;p&gt;Лекция была построена в виде ответов на вопросы и называлась &amp;laquo;FAQ 2006&amp;raquo;. Здесь описаны выжимки из ответов, несшие не только культурную нагрузку, но также и полезную, так сказать, для общего понимания, что происходит в игровой индустрии.&lt;/p&gt;
&lt;p&gt;Вопросы брались из разных точек поступления информации, включая &lt;a href=&quot;http://www.gamedev.ru/forum/?group=0&amp;topic=23839&quot;&gt;специальную ветку&lt;/a&gt; на нашем форуме, вот, например, оттуда первый вопрос:
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2006_mir2.jpg&quot; alt=&quot;Изображение&quot; /&gt;&lt;/p&gt;
&lt;p&gt;===1С с нами.===&lt;/p&gt;
&lt;p&gt;Не считая аддонов, фирма 1С, потратив за год на вышедшие и ещё не вышедшие проекты около 12 млн. долларов, издала в 2005 году 30 российских игр. Средний тираж 50-60 тыс. копий, для сравнения, в 2004 году средний тираж был выше на 10-15 тысяч. Крупного тиража смогла достичь только одна игра &amp;mdash; Корсары-3 (300 тыс. копий). В итоге для новых проектов предусматриваются меньшие бюджеты, происходит стремление к снижению рисков и к большей предсказуемости процесса разработки. Поэтому, например, разработчики всё чаще обращаются к услугам аутсорсеров (обычно по производству графики и звука). Также развивается процесс, хоть и не достаточно быстро, лицензирования технологий.&lt;/p&gt;
&lt;p&gt;Ожидается, что в 2006 году хорошо продаваться будут, в основном, высококачественные игры (как по используемым технологиям, так и геймплею), а также сиквелы хороших игр, например, такие как &amp;laquo;Heroes of Might and Magic V&amp;raquo;, &amp;laquo;В тылу врага 2&amp;raquo; и &amp;laquo;Дальнобойщики-3&amp;raquo;. Вероятно, сильно сократятся тиражи игр по кинолицензиям, поскольку потребитель начинает относиться насторожено, подпитываемый полувраждебной реакцией прессы.&lt;/p&gt;
&lt;p&gt;Юрий Мирошников обращает внимание на повышающее значение PR-а от самого разработчика, об этом будет сказано ещё ниже.&lt;/p&gt;
&lt;p&gt;В целом доходы растут, но рост замедляется.&lt;/p&gt;
&lt;p&gt;От команд 1С как издатель ждёт больше опытности и хороших способностей. Из приносимых проектов, только 15 штук (8,8%) получили финансирование.&lt;/p&gt;
&lt;p&gt;Какая должна быть игра? Вот определение &amp;laquo;правильной&amp;raquo; игры в терминах Юрия Мирошникова:&lt;/p&gt;
&lt;p&gt;Правильная игра &amp;mdash; это игра простого понятного и не узкого специфического жанра, использующая современные технологии, имеющая хорошую графику и раскручиваемая самим разработчиком на протяжении хотя бы 6-ти месяцев, поскольку пресса издателям верит меньше. В сеттинге игры должно присутствовать: русские с &amp;laquo;кем-то&amp;raquo; воюют.
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2006_mir.jpg&quot; alt=&quot;Изображение&quot; /&gt;&lt;/p&gt;
&lt;p&gt;===За рубежом.===&lt;/p&gt;
&lt;p&gt;За рубежом ожидается всё большее снижение интереса к нашим играм. Продавать стало сложнее, почти все крупные издатели перестали покупать лицензии на российские игры. Хотя цены на лицензии хитовых игр всё ещё растут. Выходит, что нужно производить высококачественные игры в условиях, когда не получается опереться на местный рынок.&lt;/p&gt;
&lt;p&gt;==Сергей Герасёв (1С): Особенности взаимоотношений с западными издателями.==
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/kri2006_gers.jpg&quot; alt=&quot;Изображение&quot; /&gt;&lt;/p&gt;
&lt;p&gt;В Европу достаточно сложно продать PC-only игру, а в Америку фактически невозможно.&lt;/p&gt;
&lt;p&gt;Игры по лицензиям насытили рынок, поэтому среднюю игру не продать.&lt;/p&gt;
&lt;p&gt;===Крупные издатели.===&lt;/p&gt;
&lt;p&gt;Крупные издатели не финансируют разработку с самого начала, то есть для того чтобы пойти к издателю нужно как минимум иметь демо-версию.&lt;/p&gt;
&lt;p&gt;Крупные издатели, как и любые крупные компании, характеризуются неповоротливостью и бюрократией.&lt;/p&gt;
&lt;p&gt;Кроме того, от издателя может подключиться &amp;laquo;гениальный&amp;raquo; дизайнер, постоянно требующего переделку игры, контента и т.д. Или же &amp;laquo;правильный&amp;raquo; менеджер, для которого сроки важнее всего.&lt;/p&gt;
&lt;p&gt;Нужно быть готовым к работе с журналистами, к интервью. Пики повышенного интереса журналистов:
&lt;br /&gt;- первые рассказы;
&lt;br /&gt;- пресс-тур;
&lt;br /&gt;- начало масштабной рекламной кампании;
&lt;br /&gt;- превью;
&lt;br /&gt;- ревью.&lt;/p&gt;
&lt;p&gt;Для этого у вас должны быть готовы документы с информацией для PR-а, скриншоты (до 4-х раз в месяц по 20-30 сриншотов), арты, скетчи, видеоролики. Видеоролики иногда издатель сам делает, поскольку обладает опытом в их качественном производстве.&lt;/p&gt;
&lt;p&gt;Когда подписываете контракт нужно обращать внимание на сроки разработки:&lt;/p&gt;
&lt;p&gt;Рабочая неглючная версия для пресс-тура должна быть предоставлена за пол года до релиза. Эта версия должна иметь финальное качество.&lt;/p&gt;
&lt;p&gt;Singleplayer demo должна быть готова за 2-3 месяца, должна содержать 1-2 качественные миссии. Multiplayer demo за 1 месяц.&lt;/p&gt;
&lt;p&gt;Кроме этого, должна быть версия для выставок. Открытая бета &amp;mdash; несколько уровней. Preview &amp;mdash; за 3-4 месяца полная игра. Review &amp;mdash; абсолютно готовая игра за 2-3 месяца.&lt;/p&gt;
&lt;p&gt;====Неожиданные &amp;laquo;сюрпризы&amp;raquo;.====&lt;/p&gt;
&lt;p&gt;Все документы, любой текст, включая подписи к артам и скриншотам должны быть на английском языке.&lt;/p&gt;
&lt;p&gt;В целях защиты от копирования, исполняемый файл демонстрационной версии не должен запускать игру релиза.&lt;/p&gt;
&lt;p&gt;Нужно помнить о локализации игры на европейские языки, для перевода и сборки иметь в запасе время.&lt;/p&gt;
&lt;p&gt;===Территориальные издатели.===&lt;/p&gt;
&lt;p&gt;Имеют хуже специалистов. Они менее требовательные, но так как их обычно несколько, приходится &amp;laquo;разрываться&amp;raquo; ублажая желания каждого. Такие издатели могут расти, а вместе с тем и расти требования в ходе разработки.&lt;/p&gt;
&lt;p&gt;===Советы.===&lt;/p&gt;
&lt;p&gt;Работу с издателем планируйте отдельно. Узнавайте план дополнительных работ. Держите издателя в курсе событий.&lt;/p&gt;
&lt;p&gt;==Нуретдинова Лариса (Nival Interactive): Внимание прессы: дешево и сердито==&lt;/p&gt;
&lt;p&gt;Оптимальная дата анонса &amp;mdash; 6 месяцев до релиза. Оптимальное время &amp;mdash; зима, осень. Летом плохо. Все в отпусках.&lt;/p&gt;
&lt;p&gt;Что помогает PR-у:&lt;/p&gt;
&lt;p&gt;1. Если игра является продолжением серии, потому что уже существует готовое комьюнити.&lt;/p&gt;
&lt;p&gt;2. Если игра делается по лицензии. Тоже сформировано комьюнити и есть интерес прессы, конечно, если был интерес к первоисточнику.&lt;/p&gt;
&lt;p&gt;3. Если в игре присутствуют особые фичи и продвинутые технологии.&lt;/p&gt;
&lt;p&gt;Интернет сайт, посвящённый игре, рекомендуется открывать при анонсе.&lt;/p&gt;
&lt;p&gt;Для формирование паблисити необходимо обеспечивать информационными поводами:&lt;/p&gt;
&lt;p&gt;* Подписание с издателем.

&lt;li&gt;Открытие сайта&lt;/li&gt;

&lt;li&gt;Анонс даты релиза&lt;/li&gt;

&lt;li&gt;Проведение открытого/закрытого тестинга&lt;/li&gt;

&lt;li&gt;Выпуск трейлеров и демо-версий.&lt;/p&gt;&lt;/li&gt;
&lt;p&gt;Долгоиграющей PR-акцией является проведение конкурсов: анонс, завершение, результаты, награждение, обсуждение. Если сама игра не подсказывает тему конкурса, то можно провести арт-конкурс или литературный конкурс.&lt;/p&gt;
&lt;p&gt;Интервью с разработчиками выигрывают перед пресс-релизами, поскольку к разработчикам больше уровень доверия. Не нужно подписываться PR-менеджером. В интервью нужно быть доброжелательными. Отрицательные ответы нужно подавать положительно. Всегда давать эксклюзивные скриншоты.&lt;/p&gt;
&lt;p&gt;На превью приглашайте журналистов в гости. Подарите им копию игры или что-то на диске. Добейтесь согласования превью.&lt;/p&gt;
&lt;p&gt;Демо-версия, несмотря на то, что она выходит за 1-4 недели до релиза, должна быть хорошего качества, так как это &amp;laquo;первое впечатление&amp;raquo;.&lt;/p&gt;
&lt;p&gt;Рецензия. Не жадничайте с журналистами. Обязательно давайте картинки. Если нет скриншотов, давайте концепт-арты, фото разработчиков.&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/?id=632</guid>
  <pubDate>Mon, 06 Mar 2006 23:18:10 GMT</pubDate>
  <title>Комменты для журналов</title>
  <link>http://wat.gamedev.ru/?id=632</link>
  <comments>http://wat.gamedev.ru/forum/?id=1046</comments>
  <category>сайт</category>
  <description>
&lt;p&gt;Теперь первая страница комментариев к посту в журнале лепится прямо к записи.&lt;/p&gt;
&lt;p&gt;И кросс-пост в ливжурнал теперь не принудительный, а рекомендательный по галочке. :)&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/?id=611</guid>
  <pubDate>Sun, 05 Mar 2006 19:42:09 GMT</pubDate>
  <title>Старинные статьи</title>
  <link>http://wat.gamedev.ru/?id=611</link>
  <description>
&lt;p&gt;Некоторые свои старинные статьи перенёс сюда:
&lt;br /&gt;&lt;a href=&quot;http://wat.gamedev.ru/articles/&quot;&gt;http://wat.gamedev.ru/articles/&lt;/a&gt;
&lt;br /&gt;Потом и остальные перенесу.&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/articles/AddArticles</guid>
  <pubDate>Mon, 19 Dec 2005 21:50:35 GMT</pubDate>
  <title>Добавление статей на GameDev.ru</title>
  <link>http://wat.gamedev.ru/articles/AddArticles</link>
  <comments>http://wat.gamedev.ru/forum/?id=124112</comments>
  <description>
&lt;p&gt;Здесь я дам несколько советов для авторов, которые решили разместить самостоятельно свою статью на ресурсе GameDev.ru. Это не конечный вариант статьи. Она будет обновляться.
&lt;p&gt;==Абзацы==&lt;/p&gt;
&lt;p&gt;Идущие подряд два перевода строки разделяют текст на абзацы. Для комфортного чтения вашей статьи разделяете её абзацами.&lt;/p&gt;
&lt;p&gt;Один перевод строки не образует нового абзаца.&lt;/p&gt;
&lt;p&gt;Вы можете управлять форматированием абзацев тегами:
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;[p align=left]Этот текст отформатирован по левой границе.
[p align=right] Этот текст отформатирован по правой границе.
[p align=center] Этот текст отформатирован по центру.&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Результат:&lt;/p&gt;
&lt;p align=&quot;left&quot;&gt;Этот текст отформатирован по левой границе.
&lt;/p&gt;&lt;p align=&quot;right&quot;&gt; Этот текст отформатирован по правой границе.
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt; Этот текст отформатирован по центру.&lt;/p&gt;
&lt;p&gt;===Автоматический отступ в абзацах===&lt;/p&gt;
&lt;p&gt;Абзацы легче воспринимаются, если у них первое предложение начинается с отступа, с &amp;laquo;красной строки&amp;raquo;. Вы можете сделать автоматический отступ для всех абзацев вашей статьи. Для этого из самой статьи пойдите по ссылке &amp;laquo;Настройки&amp;raquo;, установите галочку для пункта &amp;laquo;Автоматический отступ в абзацах&amp;raquo; и нажмите кнопку &amp;laquo;Отправить&amp;raquo;.&lt;/p&gt;
&lt;p&gt;Если при этом какой-то абзац вам не нужно начинать с отступом, то перед первой буквой этого абзаца вставьте тег:
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;[p align=left]&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;==Добавление статей, содержащих более 10 000 символов==&lt;/p&gt;
&lt;p&gt;При добавлении статей стоит ограничение на максимальное количество символов для текста. Если ваша статья содержит больше символов, то необходимо разбить её на страницы.&lt;/p&gt;
&lt;p&gt;Как это сделать?&lt;/p&gt;
&lt;p&gt;Вначале, при добавлении статьи, помещаете текст только первой страницы, который должен содержать менее 10 000 символов. Далее входите в редактирование статьи. Внизу будет доступна панель для добавления страниц. Нажатием кнопки добавляете страницу, дальше добавляете необходимый текст.&lt;/p&gt;
&lt;p&gt;Если вам и этого мало, то вы можете добавить ещё страницы, до 10 штук. Если и этого мало, то тогда разбивайте свою статью на две статьи или на цикл статей.&lt;/p&gt;
&lt;p&gt;==Работа со страницами==&lt;/p&gt;
&lt;p&gt;Страницы можно добавлять в режиме редактирования статьи. По ссылке &amp;laquo;Редактировать&amp;raquo; (доступна из вашей статьи), попадаете в этот режим. Там внизу находится блок для работы со страницами. Вы можете добавлять страницы и объединять соседние страницы, если это возможно.&lt;/p&gt;
&lt;p&gt;Работа со страницами сохраняется в истории.&lt;/p&gt;
&lt;p&gt;==Автоматическая генерация содержания==&lt;/p&gt;
&lt;p&gt;Если ваша статья логически делится на части (пункты и подпункты), например, такие как введение, обсуждение вопросов, заключение, ссылки, то для этих частей можно создать содержание.&lt;/p&gt;
&lt;p&gt;Содержание автоматически строит ссылки, указывающие на место в статье, где находится соответствующий пункт, с учётом страниц статьи.&lt;/p&gt;
&lt;p&gt;Как это сделать?&lt;/p&gt;
&lt;p&gt;Необходимый пункт нужно выделить знаками равно (&amp;laquo;=&amp;raquo;) с обеих сторон. Для первого уровня нужно по два знака равно, для второго подуровня, нужно по три знака, для третьего &amp;mdash; по четыре. Пункты желательно отделять от текста двойным переводом строки, то есть как абзац. Автоматическое содержание сгенерируется сразу перед первым пунктом, это необязательно может быть самым началом статьи. Но содержание обязательно будет на первой странице статьи.&lt;/p&gt;
&lt;p&gt;Пример:
&lt;br /&gt; ==Введение==
&lt;br /&gt; 
&lt;br /&gt; Ваш текст введения
&lt;br /&gt; 
&lt;br /&gt; ==Вопрос статьи==
&lt;br /&gt; 
&lt;br /&gt; ===Подпункт первого вопроса===
&lt;br /&gt; 
&lt;br /&gt; Какой-то текст.
&lt;br /&gt; Длиною в жизнь.
&lt;br /&gt; 
&lt;br /&gt; ==Заключение==
&lt;br /&gt; 
&lt;br /&gt; Здесь текст заключения&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/articles/ImagesForWeb</guid>
  <pubDate>Thu, 24 Nov 2005 17:22:15 GMT</pubDate>
  <title>Оптимизация изображений для web-страниц.</title>
  <link>http://wat.gamedev.ru/articles/ImagesForWeb</link>
  <description>
&lt;p&gt;&lt;i&gt;Статья в разработке.&lt;/i&gt;
&lt;p&gt;Зачем это нужно:
&lt;br /&gt;1. Ускоряет загрузку страниц пользователями.
&lt;br /&gt;2. Снижает потребляемый пользователями трафик.
&lt;br /&gt;3. Снижает необходимое дисковое пространство, требуемое под хранение изображений.&lt;/p&gt;
&lt;p&gt;В этой статье мы рассмотрим, как правильно оптимизировать изображения, не потеряв при этом их качество.&lt;/p&gt;
&lt;p&gt;==Размер изображения==&lt;/p&gt;
&lt;p&gt;Ширина и высота изображения не должны быть слишком большими.&lt;/p&gt;
&lt;p&gt;Не рекомендуется на страницу, особенно где есть ещё какой-то текст, помещать изображение больше чем 800х600. Слишком широкие изображения портят страницы, где они расположены. И просматривать такие страницы не удобно, а если на них ещё есть текст, то его тоже неудобно читать, так как страница по ширине из-за большого изображения может не помещаться на экране монитора. (Не забывайте, что разрешение вашего монитора, часто не совпадает с разрешением монитора пользователя, просматривающего ваше изображение.)&lt;/p&gt;
&lt;p&gt;Если уж вам очень необходимо показать большое изображение, то сделайте для него &lt;i&gt;превью&lt;/i&gt; &amp;mdash; уменьшенную версию, превью помещайте в статью или сообщение на форуме, а под превью ставьте ссылку, ведущую на полную версию этого изображения.&lt;/p&gt;
&lt;p&gt;А вообще, изображение воспринимается лучше, если оно видно полностью на экране, и для просмотра его не нужно пользоваться полосами прокрутки браузера.&lt;/p&gt;
&lt;p&gt;Не нужно в изображении оставлять мусор. Например, часто пользователи показывают скриншот с диалоговым окном, при этом скриншот обычно сделан вместе с остальным рабочим столом. Ненужные куски изображения желательно вырезать.&lt;/p&gt;
&lt;p&gt;Пояснения к изображению, если это возможно, тоже лучше не оставлять в самом изображении, а потом вносить в текст, где будет размещено изображение.&lt;/p&gt;
&lt;p&gt;Кроме того, размер изображения влияет на размер файла.&lt;/p&gt;
&lt;p&gt;==Размер файла==&lt;/p&gt;
&lt;p&gt;От чего зависит размер файла?&lt;/p&gt;
&lt;p&gt;* От размера изображения.

&lt;li&gt;От выбранного сжатия изображения.&lt;/p&gt;&lt;/li&gt;
&lt;p&gt;Эффективностью сжатия можно управлять выбором формата файла для изображения, а также через настройки параметров сжатия.&lt;/p&gt;
&lt;p&gt;==Форматы файлов==&lt;/p&gt;
&lt;p&gt;Предпочтительные форматы файлов изображений, предназнаяенных для web-страниц, являются GIF, PNG и JPEG.&lt;/p&gt;
&lt;p&gt;Использовать другие форматы, не стоит, так как большинство из них не умеют показывать браузеры. Формат BMP тоже использоват не стоит, не смотря на то, что его &amp;laquo;любит&amp;raquo; Windows. По той простой причине, что он имеет слабые алгоритмы сжатия, обычно файл с изображением в формате BMP неоправданно велик.&lt;/p&gt;
&lt;p&gt;===JPEG===&lt;/p&gt;
&lt;p&gt;Формат JPEG предпочтителен для изображений, содержащих много цветов и их градаций. Этот формат лучше всего использовать, например, для фотографий, скриншотов из игр, текстур или высококачественного рендера.&lt;/p&gt;
&lt;p&gt;Минусом этого формата является то, что он не имеет прозрачности и анимации. Что, кстати, не часто нужно.&lt;/p&gt;
&lt;p&gt;Компрессией в формате JPEG можно управлять. Чем сильнее компрессия, тем меньше будет итоговый файл, но тем хуже будет качество изображения. Копрессировать нужно до тех пор, пока качество изображения остаётся приемлемым.&lt;/p&gt;
&lt;p&gt;===GIF, PNG===&lt;/p&gt;
&lt;p&gt;Форматы GIF или PNG лучше использовать, когда изображение содержит малое количество цветов. Их лучше всего использовать для схематических рисунков. Размер файла зависит от количества задействованных цветов. Поэтому чем их меньше, тем меньше будет сам файл.&lt;/p&gt;
&lt;p&gt;Градации цвета, также определяются как отдельные цвета. Поэтому изображение с антиальязингом (сглаживанием), например, для букв, потребует больший размер.&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/articles/e3_2005</guid>
  <pubDate>Tue, 15 Nov 2005 09:36:41 GMT</pubDate>
  <title>E3 2005</title>
  <link>http://wat.gamedev.ru/articles/e3_2005</link>
  <category>E3</category>
  <category>индустрия</category>
  <description>
&lt;p&gt;==E3==&lt;/p&gt;
&lt;p&gt;Е3 представляет собой крупнейшее шоу, посвящённое компьютерным и видео играм, а также продуктам, относящихся к игровой индустрии. Это шоу проводит Entertainment Software Association (ESA) ежегодно в мае в городе Лос-Анджелес. В 2005 году шоу прошло 11-й раз с 17-го по 20-е мая.
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/e3/wat_e3.jpg&quot; alt=&quot;Изображение&quot; /&gt;&lt;/p&gt;
&lt;p&gt;==Наши на E3==&lt;/p&gt;
&lt;p&gt;Наши компании, такие как 1С, GFI, Акелла, (game)land, Новый диск и другие были расположены в Kentia hall.&lt;/p&gt;
&lt;p&gt;Первое, на что я обратил внимание, что официальное руководство по выставке, имеющее формат, обычного игрового журнала, содержащее информацию о выставке, участниках и их расположение в холах, имеет на оборотной стороне рекламу 1C. Многие посетители ходят с этими руководствами и светят жёлтыми бланками, что вызывает некое чувство гордости.&lt;/p&gt;
&lt;p&gt;Стенд 1С представлял собой высотой в два этажа жёлтую продолговатую коробку. На переднем плане за стойкой сидели девушки и не девушки, одни из них не говорили по-русски, другие, видимо, по-английски. По углам находились панели, на которых крутились ролики российских игр. Пожалуй, это всё, что мог увидеть проходящий с простой смертью. Внутри коробки проводились презентации для текущих и будущих партнёров. Показывался &amp;laquo;Вивисектор&amp;raquo;, разрабатываемый киевской студией Action Forms, &amp;laquo;Космические рейнджеры 2: Доминаторы&amp;raquo; (разработчик Elemental Games), &amp;laquo;Дальнобойщики 3&amp;raquo; (SoftLab-NSK), &amp;laquo;В тылу врага II&amp;raquo; (Best Way), &amp;laquo;Карибский кризис&amp;raquo; (G5 Software) и ещё несколько проектов.
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/e3/1c.jpg&quot; alt=&quot;Изображение&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Александр Михайлов поведал, что выставка ему понравилась с точки зрения участия в ней компании Бука, отклика на игры, курируемые компанией, и контактов по лицензиям на Россию. Александр высказал мнение, что выставка, похоже, получилась успешной для Буки. Компания привезла с собой такие проекты, как, Мор: Утопия (Pathologic), Hard Truck Tycoon, Чистильщик (Hellforces), Велиан (Operation: Matriarchy), Магия Войны (BattleMages), Метро-2 (Stalin Subway), а так же проекты, на которые компания возлагает особенные большие надежды: Стальные Монстры (Pasific Storm), Hard Truck: Apocaliptic Wars.
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/e3/buka.jpg&quot; alt=&quot;Изображение&quot; /&gt;
&lt;br /&gt;&lt;i&gt;Иван Мороз, продюсер Буки, показал проект Стальные Монстры.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;На стенде GFI я первым делом посмотрел шутер Neuro, известный мне тем, что его основной код пишет Fly. Правда, пройти демонстрационный уровень мне удалось недалеко, так как, отвлекаясь на PR-менеджера, я становился лёгкой добычей для вражьего AI. Красивым показался проект Officers, разрабатываемый украинским отделением GFI. Это 3D RTS с элементами RPG, хотя минусом этого проекта про Вторую Мировую является то, что в пресс-релизе указывается разработка только двух компаний &amp;mdash; за фашистов и союзников. Ещё GFI представляли тактическую стратегию от MiST land-South &amp;laquo;African Alliance&amp;raquo; об африканской стране во главе с диктатором и борьбе белых фермеров с бандитами, а также RTS &amp;laquo;Warfare&amp;raquo; от той же студии разработчиков. Кроме этого были проекты: пошаговая стратегия Jagged Alliance 3D и шутер Rat Hunter.
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/e3/gfi.jpg&quot; alt=&quot;Изображение&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Среди переходов между холлами случайно встретил Сергея Забарянского, который пригласил на показ нового проекта от Deep Shadows. Проект называется &amp;laquo;Precursors&amp;raquo;. Здесь игрок попадает в неизведанные районы космоса, где он может летать на огромных боевых кораблях от одной планеты к другой и вести по мере передвижения космические боевые действия. В дополнение игрок может попадать на планеты, вести разговоры с местными аборигенами, и при необходимости вступать в борьбу с ними. В возможности игрока входит торговля, бои, покорение миров и прочее. Движок поддерживает закрытые и открытые пространства в понятии шутера и космический симулятор.
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/e3/zabaryansky.jpg&quot; alt=&quot;Изображение&quot; /&gt;&lt;/p&gt;
&lt;p&gt;У компании Руссобит-М стенда не было, но была переговорная комната, в которой демонстрировались 2 проекта: &amp;laquo;Спарта&amp;raquo;, над которой работает студия Бурут, и &amp;laquo;Предтеча&amp;raquo;.&lt;/p&gt;
&lt;p&gt;Не попались на глаза представители команды разработчиков GSC, включая издательский отдел, и не было видно Сталкера. Однако ребята из GSC всё же были. Вот как прокомментировал своё пребывание на выставке Олег Яровский, PR-менеджер GSC Game World: &amp;laquo;В этом году наша поездка на Е3 носила несколько иной, исследовательский характер: у нас не было собственного стенда, и наши презентации ограничивались кулуарными показами наработок журналистам и издателям. На выставке в этом году от нашей команды были два человека &amp;mdash; я и Андрей Сальников из отдела продаж. Было много встреч, особенно в ключе подготовки нашего мирового издательства Heroes of Annihilated Empires в следующем году (&lt;a href=&quot;http://www.heroesofae.com&quot;&gt;www.heroesofae.com&lt;/a&gt;). S.T.A.L.K.E.R. в этот раз не был представлен на Е3 (кроме пресс-паков, которые раздавали журналистам ребята из THQ). Мы решили сместить показ и сделать его на одном из последующих шоу, менее сосредоточенном на консолях (возможно на Games Convention в августе). Официальная дата выхода игры пока не объявлена&amp;raquo;.&lt;/p&gt;
&lt;p&gt;&amp;laquo;Бывший наш&amp;raquo; разработчик Fireglow показывал Sudden Strike 3: Arms for Victory &amp;mdash; стратегии реального времени, продолжение известной серии о битвах Второй Мировой войны. Движок Next7 эффектно выводит на экран территории заполненные лесами, морские пространства, поля с большим количеством юнитов, отрисовываются реалистичные динамические тени и другие спецэффекты. Уникальная система AI управляет &amp;laquo;сообразительным&amp;raquo; и &amp;laquo;непредсказуемым&amp;raquo; врагом. Игрок может управлять большими военными группами, морскими и воздушными силами. Другой проект, представленный на выставке, был &amp;laquo;Stranger&amp;raquo; &amp;mdash; новая фентези RTS/RPG. Игорь Ржевкин поведал, что выставка прошла хорошо, а самое главное &amp;mdash; удалось установить ожидаемые контакты.
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/indust/e3/fireglow.jpg&quot; alt=&quot;Изображение&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ещё из &amp;laquo;наших&amp;raquo; стендов на шоу был стенд Акеллы, Нового Диска и (game)land, который был пуст, когда я к нему подошёл.&lt;/p&gt;
&lt;p&gt;На выставке встретил KranK-а, проведшего на E3 несколько рабочих встреч, ребят с DTF, Станислава Скорба (Targem Games), Сергея Титова (TS Group), Птицу (Домашний ПК) и ещё кого-то :)&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://wat.gamedev.ru/articles/e3_2005?page=2&quot;&gt;Продолжение&lt;/a&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/?id=151</guid>
  <pubDate>Mon, 14 Nov 2005 22:27:31 GMT</pubDate>
  <title>Ухты!</title>
  <link>http://wat.gamedev.ru/?id=151</link>
  <comments>http://wat.gamedev.ru/forum/?id=660</comments>
  <description>
&lt;p&gt;Вот это я себе нашёл место, откуда буду вещать всем!&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/articles/SmoothGroup</guid>
  <pubDate>Fri, 23 Nov 2001 23:20:00 GMT</pubDate>
  <title>3D Studio MAX: Группы сглаживания.</title>
  <link>http://wat.gamedev.ru/articles/SmoothGroup</link>
  <category>3D Studio MAX</category>
  <category>моделирование</category>
  <description>
&lt;p&gt;Моделер в 3D Studio MAX, особенно занимающийся низко-полигональным моделированием, должен чётко представлять себе, что такое группы сглаживания (Smoothing Groups). Понимание и использование групп сглаживания - есть большой шаг новичка моделера к профессионалу. &lt;/p&gt;
&lt;p&gt;==Определение==&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Группы сглаживания&lt;/i&gt; &amp;mdash; это свойство, которое имеет каждый треугольник (face) любой полигональной модели в 3D Studio MAX. Знакомство с группами сглаживания лучше всего провести на примере Editable Mesh. 
&lt;p&gt;Создайте любой примитив, например, Box, и преобразуйте его в Editable Mesh. В закладке Modify выберите любой подобъект поверхности (Face, Polygon или Element), например, Face. При этом в свиток добавится дополнительная панель свойств поверхности (Surface Properties). Здесь нас интересует раздел, называющийся Smoothing Groups. Этот раздел как раз и работает с группами сглаживания. 
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/3dmod/11125a.gif&quot; alt=&quot;Изображение&quot; /&gt;&lt;/p&gt;
&lt;p&gt;С помощью кнопок с числами от 1 до 32 мы можем строить различные комбинации группы сглаживания для выделенных треугольников редактируемой полигональной модели. &lt;/p&gt;
&lt;p&gt;Выделяя различные треугольники на сторонах Box&apos;а, можно заметить, что каждая сторона имеет свою группу сглаживания. Кнопки на панели, соответствующие битам группы сглаживания, находятся в нажатом состоянии. &lt;/p&gt;
&lt;p&gt;Почему именно из 32-х значений строятся группы сглаживания в 3D Studio MAX? &lt;/p&gt;
&lt;p&gt;Ответ прост. Для хранения информации об одном совпадении группы сглаживания достаточно одного бита. Для комбинации таких совпадений используется одно 32-х битовое число (DWORD). Кнопка на панели, например, с номером 18 отвечает за 18-й бит этого числа. Больше никаких ритуальных соображений по этому поводу не существует. &lt;/p&gt;
&lt;p&gt;Отсюда можно заметить, что сами числа на кнопках ничего конкретного для моделера не символизируют, используются они только для ориентира. &lt;/p&gt;
&lt;p&gt;===В чём же смысл групп сглаживания?===
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/3dmod/11125b.gif&quot; alt=&quot;Изображение&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Рассмотрим изображение трёх сфер. Эти сферы различаются только группами сглаживания для своих треугольников, всё остальное, например, материал и количество полигонов, у них одинаковое. Как же можно достичь такого эффекта? &lt;/p&gt;
&lt;p&gt;Рассмотрим два треугольника, не лежащих в одной плоскости, то есть нормали у этих треугольников не совпадают. Но во время просчёта нам часто необходимо, чтобы не было видно чёткой границы между этими двумя треугольниками. То есть во время закрашивания, произошло сглаживание. Так вот, это сглаживание происходит между треугольниками с общими вершинами, у которых хотя бы один бит в группах сглаживания совпадает. &lt;/p&gt;
&lt;p&gt;Посмотрим ещё раз на рисунок с тремя сферами. Первая сфера здесь во всех полигонах имеет одинаковую группу сглаживания с выделенным общим (любым) битом, у второй - все полигоны имеют пустую группу сглаживания, то есть не выделен ни один бит, у третьей - треугольники в каждом слое имеют свою уникальную группу сглаживания, не совпадающую ни в одном бите с группами сглаживания в треугольниках соседних слоёв. 
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/articles/3dmod/11125c.gif&quot; alt=&quot;Изображение&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Иногда для моделера возникает задача, как бы сделать видимое разделение между частями полигональной модели на их стыке, то есть по рёбрам. Модель на рисунке является одной цельной замкнутой полигональной моделью. Все видимые разделения на подобъекты сделаны за счёт геометрии и групп сглаживания. &lt;/p&gt;
&lt;p&gt;Работа с группами сглаживания. &lt;/p&gt;
&lt;p&gt;С кнопками с числами в разделе Smoothing Groups немного разобрались. Можно добавить только, что если вы выделяете несколько полигонов, у одних из которых проставлены биты в группах, а у других соответствующие биты не проставлены, то кнопки с этими битами будут пустыми, без чисел. &lt;/p&gt;
&lt;p&gt;Кнопка Select By SG позволяет выделять все треугольники, с указанными битами групп сглаживания. &lt;/p&gt;
&lt;p&gt;Кнопка Clear All выключает все биты групп сглаживания для выделенных треугольников. &lt;/p&gt;
&lt;p&gt;Кнопка Auto Smooth работает с выставляемым числом, находящимся справа от кнопки. Это число показывает отклонение нормалей треугольников в градусах. При нажатии на эту кнопку все выделенные треугольники, у которых отклонение нормалей меньше указанного числа, станут &amp;quot;сглаженными&amp;quot;, за счёт выставления соответствующих групп сглаживания. &lt;/p&gt;
&lt;p&gt;==Где ещё встречаются группы сглаживания.==&lt;/p&gt;
&lt;p&gt;Модификатор Edit Mesh. Аналогично EditableMesh. &lt;/p&gt;
&lt;p&gt;===Модификатор MeshSmooth.===&lt;/p&gt;
&lt;p&gt;В свитке Parameters есть раздел Surface Parameters. &lt;/p&gt;
&lt;p&gt;Если выделить только Smooth Result, что происходит по умолчанию, то полученный объект полностью будет сглажен по группам сглаживания. Убрав этот флаг, мы можем оставить информацию о группах сглаживания с предыдущих уровней модификаторов, что скажется также на гладкой закраске модели. Также можно разделить сглаживание, выставив Smoothing Group, что повлияет на форму результирующей модели, при нескольких итерациях деления сглаживаемой модели. &lt;/p&gt;
&lt;p&gt;===Модификатор Smooth.===&lt;/p&gt;
&lt;p&gt;Работает для выделенных треугольников с предыдущих уровней модификаторов. То есть эти треугольники могут быть выделены, например, в модификаторе Edit Mesh или модификатором Mesh Select. Что делает этот модификатор, можно понять по аналогии с EditableMesh.&lt;/p&gt;
&lt;p&gt;==Что можно добавить для разработчиков игр.==&lt;/p&gt;
&lt;p&gt;Достичь аналогичного эффекта сглаживания можно другим способом, когда все треугольники имеют одинаковую группу сглаживания. Видимость границ достигается путём дублирования точек. То есть два соседних треугольника не имеют общих точек, просто соответствующие точки имеют одинаковые координаты. Кстати, именно такие дублированные точки должны попадать в игровой движок, различаясь только своими нормалями. Но, по-скольку, моделеру неудобно самому разделять эти точки, этим должна заниматься программа экспорта из 3D Studio MAX, пользуясь данными из групп сглаживания. &lt;/p&gt;
&lt;p&gt;Напоследок, всем желаю успешного низко-полигонального моделирования!&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/articles/MSVS</guid>
  <pubDate>Mon, 19 Nov 2001 12:00:00 GMT</pubDate>
  <title>Работаем с MS Visual Studio.</title>
  <link>http://wat.gamedev.ru/articles/MSVS</link>
  <comments>http://wat.gamedev.ru/forum/?id=56153</comments>
  <category>Visual Studio</category>
  <category>основы</category>
  <description>
&lt;p&gt;Здесь пойдёт речь о том, как работать с MS Visual C++.&lt;/p&gt;
&lt;p&gt;Цель данной статьи &amp;mdash; не полный обзор пакета, а освещение некоторых основ и замечаний, предназначенных для того, чтобы в других статьях сайта GameDev.ru не возвращаться к косвенным темам, таким как создание проекта и пр. За основу берётся 6-я версия MS Visual С++.&lt;/p&gt;
&lt;p&gt;Эта статья не претендует на последнюю инстанцию и НЕ говорит о том, что другим средствам разработки компьютерных игр нет места на GameDev.ru. Возможно, статья будет дописываться новыми пунктами. &lt;/p&gt;
&lt;p&gt;==Почему MS Visual Studio.==&lt;/p&gt;
&lt;p&gt;Конечно, существует множество средств разработки, каждый любит больше свою, к которой привык. Некоторые умудряются пользоваться несколькими средами и языками программирования. Однако, можно дать некоторые объяснения выгодной позиции MS Visual С++. &lt;/p&gt;
&lt;p&gt;Это всё касается тех, кто занимается компьютерной графикой. Популярные графические пакеты, такие как 3D Studio MAX и Maya, написаны на MS Visual C++. Очень много разработчиков игр сталкивается с написание plug-in&apos;ов к этим пакетам. Естественно, им нужно использовать эту среду разработки. Создавать какие-то свои подключения, для других языков и сред - утопично, проблемы возникают при выходе новых версий пакетов. То же самое касается и продуктов Adobe. Чтобы писать plug-in&apos;ы к Photoshop&apos;у или к Affter Effect&apos;у, нужен MS Visual Studio. Есть смысл, знать один пакет очень хорошо, чем несколько поверхностно. &lt;/p&gt;
&lt;p&gt;К тому же к MS Visual C++ есть множество дополнительных продуктов, которые помогают в разработке. &lt;/p&gt;
&lt;p&gt;Стереотип, что раз это продукт Microsoft, то он является заведомо никчемным, не имеет твёрдой основы. К тому же, в большинстве вакансий требование знания MS Visual C++ вместе с MFC появляются чаще, чем знание других средств разработки. &lt;/p&gt;
&lt;p&gt;Тут не имеется в виду отдельные случаи, типа верхнего уровня игровых проектов, где удобно иногда использовать скриптовые языки или Java. &lt;/p&gt;
&lt;p&gt;Конечно, если вы занимаетесь не компьютерной графикой, а базами данных, то тут ещё можно спорить. &lt;/p&gt;
&lt;p&gt;==Workspace.==&lt;/p&gt;
&lt;p&gt;В Visual Studio есть такое понятие как Workspace (рабочее пространство). &lt;/p&gt;
&lt;p&gt;Workspace может содержать как один проект так и несколько. Бывает удобно помещать в один Workspace несколько проектов, если вы создаёте большой продукт, имеющий несколько исполняемых модулей, статических и динамически подключаемых библиотек. &lt;/p&gt;
&lt;p&gt;Окно Workspace обычно включено по умолчанию, если оно выключено, его можно включить либо из меню View/ Workspace, либо нажатием Alt+0. Окно Workspace можно использовать, как навигационное окно. Из него можно управлять проектами, файлами, классами и ресурсами. Это окно содержит несколько закладок. &lt;/p&gt;
&lt;p&gt;Закладка ClassView. Показывает список всех проектов и, содержащихся в них, всех классов (включая структуры) вместе с их членами (методами и полями), которые объявлены в файлах, включённых в Workspace. Отсюда можно устанавливать активный проект и управлять содержим классов, а также навигацию по классам. &lt;/p&gt;
&lt;p&gt;Закладка ResourceView. Она видна в том случае, если хотя бы один проект содержит ресурсы, такие как диалоговые формы, меню, иконки, рисунки и пр. Отвечает за управление ресурсами и навигацией по ним, вызывая соответствующие редакторы. &lt;/p&gt;
&lt;p&gt;Закладка FileView. Показывает список всех проектов и, содержащихся в них, файлах. Здесь можно добавлять и удалять проекты, файлы из проектов, вызывать окна редакторов соответствующих файлов и пр. Отсюда также можно устанавливать активный проект. &lt;/p&gt;
&lt;p&gt;Добавление существующего проекта в текущий Workspace, осуществляется из меню Project / Insert Project into Workspace: &lt;/p&gt;
&lt;p&gt;Между проектами можно устанавливать зависимости (dependencies). Если установить зависимость одного проект над другим, то перед компиляцией первого проекта, сначала произойдёт (если есть в этом необходимость) компиляция второго проекта. Например, если вы компилируете какой-то основной проект, требующий статическую библиотеку, собираемую вторым проектом, то тут полезно выставить зависимость. При каких-то изменениях в файлах проекта статической библиотеки перед компиляцией основного проекта произойдёт компиляция изменённых файлов проекта статической библиотеки. &lt;/p&gt;
&lt;p&gt;Зависимости устанавливаются из меню Project / dependencies. &lt;/p&gt;
&lt;p&gt;Workspace чаще всего создаётся вместе с проектом. &lt;/p&gt;
&lt;p&gt;==Проект. Создание проекта.==&lt;/p&gt;
&lt;p&gt;Проект (Project) представляет собой набор файлов, объединённых для компиляции и сборки в одну программную единицу, такую как исполняемый модуль, динамически или статически подключаемая библиотека и т.д. &lt;/p&gt;
&lt;p&gt;Проект создаётся следующим образом. Меню File / New. &lt;/p&gt;
&lt;p&gt;Выбирается закладка Projects (Эта закладка выбирается автоматически, если Visual Studio не содержит открытого Workspace). 
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.gamedev.ru/coding/11119.gif&quot; alt=&quot;Изображение&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Далее выбирается Мастер приложения (AppWizard) проекта, в зависимости от типа проекта. AppWizard - некая заготовка, которая строится, используя некие рекомендации пользователя. Если вам нужно создать обычное Windows приложение, вы можете выбрать Win32 Application. Если консольное приложение - то Win32 Console Application. Если динамически подключаемую библиотеку &amp;mdash; Win32 Dynamic-Link Library. И т.д. &lt;/p&gt;
&lt;p&gt;Вы можете сами создать свой собственный AppWizard для часто используемых вами структур проекта. Некоторые производители ПО делают такие AppWizard&apos;ы для plug-in&apos;ов к своим приложениям. Например, есть AppWizard для plug-in&apos;ов к 3D Studio MAX и Maya. Кстати, в месте с поставкой DirectX 8.1, тоже идёт Мастер приложения. &lt;/p&gt;
&lt;p&gt;Далее в окне Project Name нужно ввести имя проекта, ниже - указать расположение (location) проекта. Ещё ниже &amp;mdash; указать, создавать проект с новым Workspace или в текущем. &lt;/p&gt;
&lt;p&gt;После жать кнопку OK и следовать инструкциям AppWizard&apos;а.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://wat.gamedev.ru/articles/MSVS?page=2&quot;&gt;Продолжение&lt;/a&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/articles/SkelAnim1</guid>
  <pubDate>Mon, 17 Sep 2001 12:00:00 GMT</pubDate>
  <title>Скелетная анимация: Введение</title>
  <link>http://wat.gamedev.ru/articles/SkelAnim1</link>
  <category>анимация</category>
  <category>скелетная анимация</category>
  <description>
&lt;p&gt;Страшная сказка про мертвецов. Это первая сказка из сборника сказок про разбор скелетов по костям. Рекомендуется читать на ночь страшным хрипящим голосом, тараща глаза и лёжа в деревянном ящике, наполненным гнилыми опилками и плавно ползающей склизкой живностью, дабы прочувствовать весь смак своим нутром. 
&lt;/p&gt;&lt;p align=&quot;right&quot;&gt; 
&lt;br /&gt;&amp;mdash; Разве это всё может быть правдой? &amp;mdash; изумились дети.
&lt;br /&gt;&amp;mdash; Ну, это же сказка, дети!
&lt;br /&gt;&lt;i&gt;(анекдот про сказку про девочку)&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;==Анимация в играх.==&lt;/p&gt;
&lt;p&gt;Почти во всех играх присутствует всевозможная анимация, без которой игры немыслимы. Мы взаимодействуем с движущимися объектами, падающими на дно стакана, играем персонажами, которые могут перемещаться, двигать частями тела, приседать, прыгать, бегать, взмахивать руками и т.д. Анимация оживляет игру. Качественная анимация делает игру красивым шедевром. Понятное дело, что у разработчиков компьютерных игр возникают вопросы, как реализовать ту или иную анимацию, как её задать, как экспортировать в свой движок и как приводить весь этот мир в движение. &lt;/p&gt;
&lt;p&gt;Игровой движок может реализовать различные типы анимации, от простой, где происходит обычное перемещение объекта из одного места в другое, до более сложной, где реализуется анимированная деформация объектов. Конечно, некоторые деформации можно очень просто сделать, например, легко реализовать сжатие объекта по какой-нибудь оси, используя матрицу масштабирования. Однако существуют более сложные деформации, в которых методы задания нуждаются в управлении отдельно взятыми вершинами. К примеру, лицевая анимация, где мимика персонажа реализуется через изменение взаимного расположение некоторых вершин, а не всего объекта. &lt;/p&gt;
&lt;p&gt;==Скелет, как иерархия трансформаций.==&lt;/p&gt;
&lt;p&gt;Иерархией объектов, можно назвать систему объектов, в которой одни объекты своим расположением в пространстве влияют на расположение других объектов. Вводится понятие родительских и дочерних объектов и взаимосвязей между ними. Нас интересуют именно взаимодействие трансформаций этих объектов. То есть, когда мы говорим о скелете, мы говорим об иерархии трансформаций; сами объекты называют костями. Другими словами, скелет можно определить как совокупность костей. Именно поэтому скелетную анимацию также называют костевой. &lt;/p&gt;
&lt;p&gt;Многие заумные маги, неожиданно увидев перед собой мертвецки приятного скелета, быстро произносят, путаясь в словах, следующее заклинание: &lt;/p&gt;
&lt;p&gt;Абсолютная трансформация родительской кости порождает некую координатную систему. Эта координатная система является локальной для дочерней кости. Дочерняя кость задаётся локальной трансформацией в этой системе. Поэтому изменение трансформации родительской кости влечёт влияние на абсолютную трансформацию дочерней. &lt;/p&gt;
&lt;p&gt;Дочерняя кость, в свою очередь, может иметь свою дочернюю кость, причем не одну, относительно которой она уже является родительской. Ясно, что и родительская кость, тоже может иметь своего родителя. Родитель, который не имеет родителя, является корневым (root), а его локальная система координат является абсолютной. Например, условно в скелете двуногого за корневую кость выбрана тазовая кость. &lt;/p&gt;
&lt;p&gt;Оторопев от такого поворота, многие скелеты, просто рассыпаются в тряске, потеряв всю целостность своих иерархий. &lt;/p&gt;
&lt;p&gt;Ясно, что движение родительской кости порождает движение дочерней кости. Например, если вы даёте вращение шее, то голова тоже поворачивается. В этом примере родителем для головы является шея. В свою очередь спина является родителем для шеи, то есть если мы согнём спину, то шея и голова поменяют своё положение. &lt;/p&gt;
&lt;p&gt;==Скелетный расчёт.==&lt;/p&gt;
&lt;p&gt;Все кости в скелете задаются своими локальными трансформациями. Но для конечного использования нам необходимо вычислить все абсолютные трансформации. Это и есть просчёт скелета. &lt;/p&gt;
&lt;p&gt;Трансформации в 3-х мерной графике принято задавать матрицами. Обычно это матрицы размерности 4x4 или 4x3. &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.gamedev.ru/coding/10917a.gif&quot; align=&quot;left&quot; alt=&quot;Изображение&quot; /&gt;
&lt;p&gt;На примере руки, рассмотрим простейшую иерархию, состоящую из двух костей. На рисунке кость A является родителем кости B. Допустим, у нас уже вычислена абсолютная трансформация для кости A, матрицу этой трансформации обозначим через М&lt;sub&gt;А&lt;/sub&gt; &lt;i&gt;&lt;sub&gt;абс&lt;/sub&gt;&lt;/i&gt;. Чтобы найти абсолютную трансформацию для кости B, необходимо подействовать на локальную матрицу трансформации M&lt;sub&gt;B&lt;/sub&gt; &lt;i&gt;&lt;sub&gt;лок&lt;/sub&gt;&lt;/i&gt; кости В матрицей M&lt;sub&gt;A&lt;/sub&gt; &lt;i&gt;&lt;sub&gt;абс&lt;/sub&gt;&lt;/i&gt;. Другими словами &amp;mdash; просто умножить: 
&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;b&gt;M&lt;sub&gt;B&lt;/sub&gt; &lt;i&gt;&lt;sub&gt;абс&lt;/sub&gt;&lt;/i&gt; = M&lt;sub&gt;B&lt;/sub&gt; &lt;i&gt;&lt;sub&gt;лок&lt;/sub&gt;&lt;/i&gt; x M&lt;sub&gt;A&lt;/sub&gt; &lt;i&gt;&lt;sub&gt;абс&lt;/sub&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Поскольку у корневой кости абсолютная матрица совпадает с локальной, просчёт абсолютных матриц костей всего скелета происходит, начиная от корневой кости, по цепочкам от родительской к дочерним костям, и так до самых последних в иерархии костей. &lt;/p&gt;
&lt;p&gt;Если какая-то кость поменяла своё расположение в пространстве, то есть изменилась её абсолютная матрица трансформации, то требуется заново сделать пересчёт всех дочерних костей. Во время анимации просчёт скелета нужно делать в каждый момент времени. &lt;/p&gt;
&lt;p&gt;Сама анимация может либо браться из готовых просчитанных заранее положений каждой кости, либо вычисляться процедурно, например, при использовании инверсной кинематики. &lt;/p&gt;
&lt;p&gt;==Управление структурой объектов, при помощи скелета.==&lt;/p&gt;
&lt;p&gt;При создании модели какого-нибудь механизма, очень часто бывает удобно использовать иерархию объектов. Такая структура объектов, собственно, является неким скелетом. То есть каждая кость представляет собой локальную трансформацию каждого объекта из этой структуры. Управляя этим скелетом, например, назначив ему анимацию, можно реализовать анимированное поведение механизма. К примеру, имеем дело с револьвером. Корпус является корневым объектом. Барабан револьвера - дочерним, может получить локальное вращение вокруг своей оси. Затвор, тоже дочерний - может иметь локальное перемещение. Пружина - масштабирование. Перемещая корпус револьвера, мы не заботимся о перемещении его отдельных частей, об этом беспокоится иерархия. Для вращения барабана - мы просто вращаем локальную матрицу трансформации для этого барабана. Абсолютная же матрица, то есть положение объекта в мировом пространстве, вычисляется иерархией. &lt;/p&gt;
&lt;p&gt;Механизмы могут быть более сложными. Например, таким образом можно выстроить систему управления сложными роботами. &lt;/p&gt;
&lt;p&gt;==Вершинная деформация объектов.==&lt;/p&gt;
&lt;p&gt;Кроме анимации механизмов, часто встречаются более сложные анимации, требующие не простого перемещения объектов, а их деформацию. Речь идёт об изменение формы цельного полигонального объекта. Анимация такой деформации достигается движением вершин полигонального объекта. Как это реализовать? Например, можно хранить положение каждой вершины полигональной модели в каждом кадре анимации. &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.gamedev.ru/coding/10917b.gif&quot; align=&quot;left&quot; alt=&quot;Изображение&quot; /&gt;
&lt;p&gt;Допустим, рассматривается движение руки персонажа. У нас есть два положения - начальное и конечное. Каждая вершина имеет своё начальное и конечное положение в пространстве. Для тех вершин, которые имеют некоторое перемещение, мы задаём траекторию движения этих вершин. Часто используемым методом задания анимации персонажей является построение промежуточных отображений (tweening) между изменениями объекта. То есть, к примеру, можно для каждого кадра анимации хранить копии одного и того же объекта с небольшими изменениями, а во время проигрывания анимации интерполировать каждую вершину между этими копиями. Однако такой способ задания анимации для персонажей не является эффективным и требует больших накладных расходов. &lt;/p&gt;
&lt;p&gt;Но в подобных случаях такую анимированную деформацию можно решить при помощи скелетной анимации. &lt;/p&gt;
&lt;p&gt;==Skinning. Деформация полигональной модели скелетом.==&lt;/p&gt;
&lt;p&gt;Анимация вершин заменяется невидимой иерархией анимированных костей, которые перемещают вершины. &lt;/p&gt;
&lt;p&gt;После того как просчитан скелет, трансформируется геометрия, на которую влияет скелет. Здесь геометрия - это полигональная модель вашего объекта или персонажа. Модель представляется одной цельной полигональной моделью, которая деформируется под действием костей. Происходит деформация геометрии на уровне вершин под влиянием костей. Влияние может распространять как одна кость, так и несколько. Иногда ограничиваются только использованием влияния на любую вершину какой-то одной кости. Это меньше занимает расчетного времени и памяти для хранения анимации. Однако такой метод является не очень эффективным. Появляются артефакты, заметные на глаз, при неправильном &amp;laquo;захлёсте&amp;raquo; геометрии. С некоторыми такими артефактами удаётся бороться добавлением дополнительных промежуточных небольших костей. Однако, при использовании возможности влияния на одну вершину несколькими костями, достигается большая эффективность и реалистичность. В этом случае каждая вершина модели должна знать какие именно кости влияют на её положение и какова степень влияния каждой кости. Степень влияния задаётся коэффициентом, который называется весом (weight). Ясно, что сумма всех таких коэффициентов для одной вершины должна быть равна 1. При помощи этих коэффициентов происходит смешивание вычисленных координат вершин (vertex blending). &lt;/p&gt;
&lt;p&gt;==Анимация персонажей.==&lt;/p&gt;
&lt;p&gt;Для анимации персонажей наиболее часто используется скелетная анимация. Для представления движения живых существ, таких как человека, животного или насекомого, удобно хранить взаимосвязи между подвижными частями данного персонажа, например, голова крепится к шее, ступня к ноге и т.д. Движение любой части можно задать как движение отдельной кости. В большинстве случаев скелетную анимацию для персонажей можно оптимизировать.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://wat.gamedev.ru/articles/SkelAnim1?page=2&quot;&gt;Продолжение&lt;/a&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/articles/quaternions</guid>
  <pubDate>Sun, 05 Aug 2001 09:24:29 GMT</pubDate>
  <title>Кватернионы в программировании игр.</title>
  <link>http://wat.gamedev.ru/articles/quaternions</link>
  <comments>http://wat.gamedev.ru/forum/?id=1228</comments>
  <category>Общее</category>
  <category>кватернионы</category>
  <category>математика</category>
  <description>
&lt;p&gt;Существует несколько путей представления вращения объектов. Многие программисты используют для этого матрицы вращения или углы Эйлера. Каждое из этих решений работает замечательно, до тех пор, пока вы не пытаетесь осуществить гладкую интерполяцию между двумя разными положениями объекта. Например, представьте себе объект, который просто свободно вращается в пространстве. Если хранить вращение, как матрицу или в виде углов Эйлера, то гладкая интерполяция окажется довольно дорогостоящей по вычислениям и будет не столь гладкой, как при интерполяции кватернионами. Хотя и можно попытаться наиболее близко расставить временные ключи на стадии создания анимации, однако это влечет за собой хранение большего количества данных для данного вращения и не совсем тривиально ясно, какой выбирать шаг. Понятно, что и в этом случае без интерполяции не обойтись, никогда не известно какой FPS будет у игрока. &lt;/p&gt;
&lt;p&gt;Многие игры от третьего лица используют кватернионы для анимации движения камеры. Все игры от третьего лица располагают камеру на некотором расстоянии от персонажа. Так как камера имеет другое движение, отличающееся от движения персонажа, например, при повороте персонажа - камера движется по дуге, то иногда бывает, что это движение выглядит не натурально, скачками. Это одна из проблем, которую можно решить при помощи кватернионов. Кватернионы также удобно использовать в лётных симуляторах, таких как ИЛ-2 Штурмовик. Вместо манипулирования тремя углами (roll, pitch и yaw), представляя вращение вокруг осей x, y и z соответственно, намного проще использовать один кватернион. Да и вообще много игр и приложений трёхмерной графики сохраняют ориентацию объектов в кватернионах. Например, легче добавить угловую скорость к кватерниону, чем к матрице. &lt;/p&gt;
&lt;p&gt;==Что это такое==&lt;/p&gt;
&lt;p&gt;Кватернионы были введены Гамильтоном в XVIII веке. Кватернионы являются 4-х мерным расширением множества комплексных чисел, другими словами &amp;mdash; это гиперкомплексные числа. То есть кватернион q задаётся четвёркой чисел (x,y,z,w): &lt;/p&gt;
&lt;p&gt;w + xi + yj + zk
&lt;br /&gt;, где i&lt;sup&gt;2&lt;/sup&gt; = j&lt;sup&gt;2&lt;/sup&gt; = z&lt;sup&gt;2&lt;/sup&gt; = –1. &lt;/p&gt;
&lt;p&gt;Его можно также записывать в виде: &lt;/p&gt;
&lt;p&gt;[w,v]
&lt;br /&gt;, где &lt;i&gt;w&lt;/i&gt; называют скаляр, а &lt;i&gt;v&lt;/i&gt; = (x,y,z) - вектор. &lt;/p&gt;
&lt;p&gt;==Основные операции и свойства кватернионов==&lt;/p&gt;
&lt;p&gt;Рассмотрим два кватерниона: q[w,v] и q&apos;[w&apos;,v&apos;]. Для них справедливо следующее: &lt;/p&gt;
&lt;p&gt;q+q&apos; = [w+w&apos;,v+v&apos;] &lt;/p&gt;
&lt;p&gt;qq&apos; = [ww&apos; – v&lt;b&gt;·&lt;/b&gt;v&apos;, vxv&apos; + wv&apos; + w&apos;v] 
&lt;br /&gt;, где x - векторное произведение, а &lt;b&gt;·&lt;/b&gt; &amp;mdash; скалярное.&lt;/p&gt;
&lt;p&gt;norm(q) = sqrt(w&lt;sup&gt;2&lt;/sup&gt;+x&lt;sup&gt;2&lt;/sup&gt;+y&lt;sup&gt;2&lt;/sup&gt;+z&lt;sup&gt;2&lt;/sup&gt;) (размер)&lt;/p&gt;
&lt;p&gt;q*=[w, –v] (сопряжение) &lt;/p&gt;
&lt;p&gt;q&lt;sup&gt;–1&lt;/sup&gt;=q*/norm(q) &lt;/p&gt;
&lt;p&gt;norm(q)=1 =&amp;gt; q&lt;sup&gt;–1&lt;/sup&gt;=q* &lt;/p&gt;
&lt;p&gt;Кватернионы расширяют концепцию вращения в трехмерном пространстве до вращения в четырехмерном. Вращение можно задать единичным кватернионом (norm(q) = 1). Чтобы кватернион привести к единичному виду, или другими словами нормализовать, необходимо вычислить его размер norm(q) и все четыре члена кватерниона разделить на величину полученного размера. &lt;/p&gt;
&lt;p&gt;Пространство кватернионов представляет собой 4-х мерное пространство. Множество всех единичных векторов &amp;mdash; есть 4-х мерная сфера с радиусом 1. Кватернионы можно рассматривать, как добавление дополнительного угла поворота к сферическим координатам, (сферические координаты - долгота, широта, угол поворота). &lt;/p&gt;
&lt;p&gt;Если вращение задано некоторым кватернионом q, то вектор v после вращения будет иметь вид v&apos;: &lt;/p&gt;
&lt;p&gt;V&apos;=q V q&lt;sup&gt;–1&lt;/sup&gt; 
&lt;br /&gt;, где V = [o,v], V&apos;=[0,v&apos;] &lt;/p&gt;
&lt;p&gt;==Преобразования==&lt;/p&gt;
&lt;p&gt;===Вращение вокруг оси===&lt;/p&gt;
&lt;p&gt;Рассмотрим вращение на угол Q вокруг оси, заданной направляющим вектором v. Это вращение можно задать кватернионом: 
&lt;br /&gt;q=[cos(Q/2),sin(Q/2)v] &lt;/p&gt;
&lt;p&gt;При необходимости нужно не забыть нормализовать полученный кватернион. &lt;/p&gt;
&lt;p&gt;===Преобразование сферических координат в кватернион===&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;struct&lt;/span&gt; Quaternion{
  &lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt; x,y,z; &lt;span style=&quot;color: #808080&quot;&gt;// Вектор&lt;/span&gt;
  &lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt; w;     &lt;span style=&quot;color: #808080&quot;&gt;// Скаляр&lt;/span&gt;
};

&lt;span style=&quot;color: #808080&quot;&gt;//Преобразование сферических кординат в кватернион&lt;/span&gt;
&lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; SphericalToQuaternion&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Quaternion * q, &lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt; latitude, &lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt; longitude, 
                           &lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt; angle&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
  &lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt; sin_a = sin&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt; angle / &lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
  &lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt; cos_a = cos&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt; angle / &lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

  &lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt; sin_lat = sin&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt; latitude &lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
  &lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt; cos_lat = cos&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt; latitude &lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

  &lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt; sin_long = sin&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt; longitude &lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
  &lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt; cos_long = cos&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt; longitude &lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

  q-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;x = sin_a * cos_lat * sin_long;
  q-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;y = sin_a * sin_lat;
  q-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;z = sin_a * sin_lat * cos_long;
  q-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;w = cos_a;
}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt; 
&lt;p&gt;===Углы Эйлера===&lt;/p&gt;
&lt;p&gt;Вращение задаётся yaw, pitch и roll. Тогда кватернион вычисляется следующим образом: &lt;/p&gt;
&lt;p&gt;&amp;nbsp; qroll =&amp;nbsp; [cos (y/2), (sin(y/2), 0, 0)] 
&lt;br /&gt;&amp;nbsp; qpitch = [cos (q/2), (0, sin(q/2), 0)] 
&lt;br /&gt;&amp;nbsp; qyaw =&amp;nbsp;  [cos (f/2), (0, 0, sin(f/2))]
&lt;br /&gt;&amp;nbsp; q = qyaw qpitch qroll&lt;/p&gt;
&lt;p&gt;===Преобразования матрицы поворота в кватернион===&lt;/p&gt;
&lt;p&gt;Для задания вращения достаточно матрицы размером 3x3. Однако, поскольку многие 3D API используют для трансформации матрицы размером 4x4, мы тоже будем рассматривать такую размерность матрицы. При этом, чтобы дополнительные данные не влияли на смысл матрицы, дополнительные строка и столбец выставляются в ноль, за исключением их пересечения, которое выставляется в 1. Ниже приведён код преобразования матрицы поворота в кватернион. Ясно, что эта матрица не должна нести в себе другую информацию кроме вращения, например &amp;mdash; масштабирование. &lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color: #808080&quot;&gt;// Преобразование матрицы в кватернион&lt;/span&gt;
&lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; MatrixToQuaternion&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Quaternion * quat, &lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt; m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
  &lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt;  tr, s, q&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;;
  &lt;span style=&quot;color: #0030fF; &quot;&gt;int&lt;/span&gt;    i, j, k;

  &lt;span style=&quot;color: #0030fF; &quot;&gt;int&lt;/span&gt; nxt&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = {&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;, &lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;, &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;};

  tr = m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; + m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; + m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;;

  &lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;tr &lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
  {
    s = sqrt &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;tr + &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
    quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;w = s / &lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;;
    s = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;5&lt;/span&gt; / s;
    quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;x = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; - m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; * s;
    quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;y = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; - m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; * s;
    quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;z = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; - m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; * s;
  }
  &lt;span style=&quot;color: #0030fF; &quot;&gt;else&lt;/span&gt;
  {
    i = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;;
    &lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt; m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; i = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;;
    &lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt; m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;i&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;i&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; i = &lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;;
    j = nxt&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;i&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;;
    k = nxt&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;j&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;;

    s = sqrt &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;i&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;i&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; - &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;j&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;j&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; + m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;k&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;k&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; + &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

    q&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;i&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = s * &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;5&lt;/span&gt;;

    &lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;s != &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; s = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;5&lt;/span&gt; / s;

    q&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;j&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;k&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; - m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;k&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;j&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; * s;
    q&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;j&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;i&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;j&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; + m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;j&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;i&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; * s;
    q&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;k&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;i&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;k&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; + m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;k&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;i&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; * s;

    quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;x = q&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;;
    quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;y = q&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;;
    quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;z = q&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;;
    quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;w = q&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;;
  }
}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt; 
&lt;p&gt;===Преобразование единичного кватерниона в матрицу поворота===&lt;/p&gt;
&lt;p&gt;Преобразование единичного кватерниона в матрицу поворота можно записать в виде: &lt;/p&gt;
&lt;p&gt;TRot = [&amp;nbsp; 1-2y2-2z2&amp;nbsp;  2xy-2wz&amp;nbsp; &amp;nbsp; 2xz+2wy 
&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2xy+2wz&amp;nbsp;  1-2x2-2z2&amp;nbsp;  2yz-2wx 
&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2xz-2wy&amp;nbsp; &amp;nbsp; 2yz+2wx&amp;nbsp;  1-2x2-2y2&amp;nbsp; ]&lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color: #808080&quot;&gt;// Преобразование кватерниона в матрицу&lt;/span&gt;
&lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; QuaternionToMatrix&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt; m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;, &lt;span style=&quot;color: #0030fF; &quot;&gt;const&lt;/span&gt; Quaternion * quat&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
  &lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt; wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2;
  x2 = quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;x + quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;x;
  y2 = quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;y + quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;y;
  z2 = quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;z + quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;z;
  xx = quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;x * x2;   xy = quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;x * y2;   xz = quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;x * z2;
  yy = quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;y * y2;   yz = quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;y * z2;   zz = quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;z * z2;
  wx = quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;w * x2;   wy = quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;w * y2;   wz = quat-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;w * z2;

  m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;=&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f-&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;yy+zz&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;; m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;=xy-wz;        m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;=xz+wy;
  m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;=xy+wz;        m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;=&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f-&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;xx+zz&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;; m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;=yz-wx;
  m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;=xz-wy;        m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;=yz+wx;        m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;=&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;f-&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;xx+yy&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

  m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;;
  m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;;
  m&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt; = &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;;
}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt; 
&lt;p&gt;При работе с иерархией объектов и инверсной кинематикой возникает композитное задание вращения. В этом случае использование кватернионов предпочтительнее, чем матриц. То есть, если вращение задано двумя матрицами R1 и R2, то чтобы вычислить матрицу поворота нужно перемножить эти матрицы: R = R1 x R2. Аналогично, если вращение задано двумя кватернионами q1 и q2, то результирующий кватернион поворота будет q = q1 x q2. Ясно, что вычисление произведения кватернионов происходит быстрее, чем матриц. Причем произведение кватернионов можно оптимизировать: &lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;void&lt;/span&gt; MulQuaternions&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;Quaternion *res, 
                    &lt;span style=&quot;color: #0030fF; &quot;&gt;const&lt;/span&gt; Quaternion *q1, &lt;span style=&quot;color: #0030fF; &quot;&gt;const&lt;/span&gt; Quaternion *q2&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
  &lt;span style=&quot;color: #0030fF; &quot;&gt;float&lt;/span&gt; A, B, C, D, E, F, G, H;

  A = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;q1-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;w + q1-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;x&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; * &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;q2-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;w + q2-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;x&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
  B = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;q1-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;z - q1-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;y&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; * &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;q2-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;y - q2-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
  C = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;q1-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;x - q1-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;w&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; * &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;q2-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;y + q2-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
  D = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;q1-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;y + q1-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; * &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;q2-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;x - q2-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;w&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
  E = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;q1-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;x + q1-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; * &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;q2-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;x + q2-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;y&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
  F = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;q1-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;x - q1-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; * &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;q2-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;x - q2-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;y&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
  G = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;q1-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;w + q1-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;y&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; * &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;q2-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;w - q2-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
  H = &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;q1-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;w - q1-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;y&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; * &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;q2-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;w + q2-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;z&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

  res-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;w = B + &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;-E - F + G + H&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; * &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;5&lt;/span&gt;;
  res-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;x = A - &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt; E + F + G + H&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; * &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;5&lt;/span&gt;; 
  res-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;y =-C + &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt; E - F + G - H&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; * &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;5&lt;/span&gt;;
  res-&lt;span style=&quot;color: #a06000&quot;&gt;&amp;gt;&lt;/span&gt;z =-D + &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt; E - F - G + H&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; * &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;.&lt;span style=&quot;color: #F04000; &quot;&gt;5&lt;/span&gt;;
}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;http://wat.gamedev.ru/articles/quaternions?page=2&quot;&gt;Продолжение&lt;/a&gt;&lt;/p&gt;</description>
</item>
<item>
  <guid isPermaLink="true">http://wat.gamedev.ru/articles/MAXPlugins</guid>
  <pubDate>Fri, 13 Jul 2001 12:00:00 GMT</pubDate>
  <title>Основы плагиностроения к 3D Studio MAX.</title>
  <link>http://wat.gamedev.ru/articles/MAXPlugins</link>
  <comments>http://wat.gamedev.ru/forum/?id=57426</comments>
  <category>3D Studio MAX</category>
  <category>plug-in</category>
  <category>плагины</category>
  <category>экспорт</category>
  <description>
&lt;p&gt;Для понятия материала требуются знания объектно-ориентированного программирования в среде Visual C++, Windows-программирование динамически подключаемых библиотек (DLL), а также элементарное умение осмысленного нажатия на кнопки в 3D Studio MAX. &lt;/p&gt;
&lt;p&gt;Для написания plug-in&apos;ов к 3D Studio MAX 3.x необходимо иметь Visual C++ 6.0, 3D Studio MAX 3.x, для тестирования, и MAX SDK. SDK поставляется на CD вместе с MAX&apos;ом, во время установки 3D Studio MAX, вы выбираете режим установки Custom, где добавляете установку SDK. &lt;/p&gt;
&lt;p&gt;==Введение==&lt;/p&gt;
&lt;p&gt;3D Studio MAX SDK (Software Development Kit) &amp;mdash; объектно-ориентированная библиотека, представляющая собой набор классов, которыми могут пользоваться разработчики, для создания plug-in&apos;ов к 3D Studio Max. &lt;/p&gt;
&lt;p&gt;Max на большую часть сам состоит из plug-in&apos;ов. Почти любые части Max&apos;а доступны для разработчиков. Plug-in&apos;ы делятся по типам, в зависимости от их предназначения. При их помощи вы можете создавать новые типы объектов, модификаторов, материалов, утилит, эффектов и т.д. Игроделов в первую очередь интересуют экспортные возможности. &lt;/p&gt;
&lt;p&gt;Наверно, к самым простым типам plug-in&apos;ов относятся утилиты. На примере простейшей утилиты мы и устроим наше первое знакомство с SDK. &lt;/p&gt;
&lt;p&gt;==Структура==&lt;/p&gt;
&lt;p&gt;Plug-in, в рамках языка С++, представляет собой объект специального класса, будем называть такой класс классом plug-in&apos;а. Как файл plug-in представляет собой обычную DLL, которую, если распознает, подгружает Max. При этом такой .dll-файл может содержать несколько объектов plug-in&apos;ных классов. Каждый plug-in&apos;ный файл должен содержать пять функций. При помощи них Max распознаёт plug-in, понимает его тип и т.п.: 
&lt;ul&gt;

&lt;li&gt;DllMain():&amp;nbsp; Стандартная main-функция используемая Windows для инициализации DLL. Здесь происходит инициализация стандартных элементов управления (controls), а также дополнительных элементов управления, которые используются в Max&apos;е. &lt;/li&gt;

&lt;li&gt;LibNumberClasses(): Эта функция возвращает количество классов, отвечающих за plug-in&apos;ы, содержащихся в DLL. &lt;/li&gt;

&lt;li&gt;LibVersion(): Позволяет Max&apos;у определить, для какой его версии предназначен plug-in. &lt;/li&gt;

&lt;li&gt;LibDescription(): Возвращает текстовую строку (описание), которая показывается пользователю, если DLL не доступна по каким-то причинам. &lt;/li&gt;

&lt;li&gt;LibClassDesc(): Функция возвращает указатель на объект, называемый Дескриптором класса для каждого класса plug-in&apos;а в DLL. Этот объект описывает свойства каждого класса plug-in&apos;а и способ создания объекта этого класса. &lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;Приведём пример файла, содержащего эти пять функций. (Файлы MyUtility.h и MyUtility.cpp будут рассмотрены позже). &lt;/p&gt;
&lt;div style=&quot;background: #f2f2f2; padding: 5px; margin: 4px;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color: #808080&quot;&gt;// file: DllEntry.cpp&lt;/span&gt;

&lt;span style=&quot;color: #808080&quot;&gt;// общий .h-файл для нашего plug-in&apos;а&lt;/span&gt;
&lt;span style=&quot;color: #0030fF; &quot;&gt;#include&lt;/span&gt; &lt;span style=&quot;color: #00808F&quot;&gt;&amp;quot;MyUtility.h&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #808080&quot;&gt;// Реализована в файле MyUtility.cpp&lt;/span&gt;
&lt;span style=&quot;color: #0030fF; &quot;&gt;extern&lt;/span&gt; ClassDesc2* GetMyUtilityDesc&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;

&lt;span style=&quot;color: #808080&quot;&gt;// DLL&apos;s instance handle.&lt;/span&gt;
HINSTANCE hInstance;

&lt;span style=&quot;color: #808080&quot;&gt;// флаг controlsInit - используется, для того, чтобы элементы&lt;/span&gt;
&lt;span style=&quot;color: #808080&quot;&gt;// управления инициализировались только один раз&lt;/span&gt;
&lt;span style=&quot;color: #0030fF; &quot;&gt;int&lt;/span&gt; controlsInit = FALSE;


BOOL WINAPI DllMain&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;HINSTANCE hinstDLL,ULONG fdwReason,LPVOID&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
  hInstance = hinstDLL;

  &lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;!controlsInit&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
  {
    &lt;span style=&quot;color: #808080&quot;&gt;// вызывается один раз во время загрузки plug-in&apos;а&lt;/span&gt;
    controlsInit = TRUE;
    &lt;span style=&quot;color: #808080&quot;&gt;// Инициализация элементов управления MAX&apos;а&lt;/span&gt;
    InitCustomControls&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;hInstance&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
    &lt;span style=&quot;color: #808080&quot;&gt;// Инициализация стандартных элементов управления&lt;/span&gt;
    InitCommonControls&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
  }

  &lt;span style=&quot;color: #0030fF; &quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;TRUE&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
}


&lt;span style=&quot;color: #0030fF; &quot;&gt;__declspec&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt; &lt;span style=&quot;color: #0030fF; &quot;&gt;dllexport&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #0030fF; &quot;&gt;const&lt;/span&gt; TCHAR* LibDescription&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
  &lt;span style=&quot;color: #808080&quot;&gt;// функция GetString() реализована ниже&lt;/span&gt;
  &lt;span style=&quot;color: #0030fF; &quot;&gt;return&lt;/span&gt; GetString&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;IDS_LIBDESCRIPTION&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
}


&lt;span style=&quot;color: #0030fF; &quot;&gt;__declspec&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt; &lt;span style=&quot;color: #0030fF; &quot;&gt;dllexport&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #0030fF; &quot;&gt;int&lt;/span&gt; LibNumberClasses&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
  &lt;span style=&quot;color: #0030fF; &quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #F04000; &quot;&gt;1&lt;/span&gt;;
}


&lt;span style=&quot;color: #0030fF; &quot;&gt;__declspec&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt; &lt;span style=&quot;color: #0030fF; &quot;&gt;dllexport&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; ClassDesc* LibClassDesc&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;int&lt;/span&gt; i&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
  &lt;span style=&quot;color: #0030fF; &quot;&gt;switch&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;i&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; {
    &lt;span style=&quot;color: #0030fF; &quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;:
      &lt;span style=&quot;color: #0030fF; &quot;&gt;return&lt;/span&gt; GetMyUtilityDesc&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;;
    &lt;span style=&quot;color: #0030fF; &quot;&gt;default&lt;/span&gt;:
      &lt;span style=&quot;color: #0030fF; &quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #F04000; &quot;&gt;0&lt;/span&gt;;
  }
}


&lt;span style=&quot;color: #0030fF; &quot;&gt;__declspec&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt; &lt;span style=&quot;color: #0030fF; &quot;&gt;dllexport&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; ULONG LibVersion&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
  &lt;span style=&quot;color: #808080&quot;&gt;// VERSION_3DSMAX - Объявлена в MAX SDK&lt;/span&gt;
  &lt;span style=&quot;color: #0030fF; &quot;&gt;return&lt;/span&gt; VERSION_3DSMAX;
}


&lt;span style=&quot;color: #808080&quot;&gt;// функция достает строку из ресурсов&lt;/span&gt;
TCHAR *GetString&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0030fF; &quot;&gt;int&lt;/span&gt; id&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
{
  &lt;span style=&quot;color: #0030fF; &quot;&gt;static&lt;/span&gt; TCHAR buf&lt;span style=&quot;color: #a06000&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #F04000; &quot;&gt;256&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;]&lt;/span&gt;;

  &lt;span style=&quot;color: #0030fF; &quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;hInstance&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;
    &lt;span style=&quot;color: #0030fF; &quot;&gt;return&lt;/span&gt; LoadString&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;hInstance, id, buf, &lt;span style=&quot;color: #0030fF; &quot;&gt;sizeof&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;(&lt;/span&gt;buf&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #a06000&quot;&gt;)&lt;/span&gt; ? buf : NULL;
  &lt;span style=&quot;color: #0030fF; &quot;&gt;return&lt;/span&gt; NULL;
}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;http://wat.gamedev.ru/articles/MAXPlugins?page=2&quot;&gt;Продолжение&lt;/a&gt;&lt;/p&gt;</description>
</item>
</channel>
</rss>
