<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF105%3A%D0%9D%D0%B8_%D1%81%D1%82%D1%80%D0%BE%D1%87%D0%BA%D0%B8_%D0%BA%D0%BE%D0%B4%D0%B0%21</id>
		<title>LXF105:Ни строчки кода! - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF105%3A%D0%9D%D0%B8_%D1%81%D1%82%D1%80%D0%BE%D1%87%D0%BA%D0%B8_%D0%BA%D0%BE%D0%B4%D0%B0%21"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF105:%D0%9D%D0%B8_%D1%81%D1%82%D1%80%D0%BE%D1%87%D0%BA%D0%B8_%D0%BA%D0%BE%D0%B4%D0%B0!&amp;action=history"/>
		<updated>2026-05-13T00:07:23Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF105:%D0%9D%D0%B8_%D1%81%D1%82%D1%80%D0%BE%D1%87%D0%BA%D0%B8_%D0%BA%D0%BE%D0%B4%D0%B0!&amp;diff=7298&amp;oldid=prev</id>
		<title>Yaleks: Новая: {{Цикл/Ни строчки кода}} == Добавим текстуры == : ''ЧАСТЬ 3 В игре, как и в человеке, все должно быть прекрасн...</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF105:%D0%9D%D0%B8_%D1%81%D1%82%D1%80%D0%BE%D1%87%D0%BA%D0%B8_%D0%BA%D0%BE%D0%B4%D0%B0!&amp;diff=7298&amp;oldid=prev"/>
				<updated>2009-03-15T16:57:45Z</updated>
		
		<summary type="html">&lt;p&gt;Новая: {{Цикл/Ни строчки кода}} == Добавим текстуры == : &amp;#039;&amp;#039;ЧАСТЬ 3 В игре, как и в человеке, все должно быть прекрасн...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Цикл/Ни строчки кода}}&lt;br /&gt;
== Добавим текстуры ==&lt;br /&gt;
: ''ЧАСТЬ 3 В игре, как и в человеке, все должно быть прекрасно: и форма, и содержание. Со вторым у нас полный порядок, а вот над внешностью придется потрудиться. Этим и займется '''Андрей Прахов'''.''&lt;br /&gt;
&lt;br /&gt;
Скучный серый коридор, каркасные&lt;br /&gt;
модели – как-то даже и не похоже&lt;br /&gt;
на очередной шедевр игростроения. Это дело необходимо срочно исправить! На этом уроке мы с вами познакомимся с особенностями текстурирования&lt;br /&gt;
применительно к Blender Engine (BGE) и&lt;br /&gt;
немного расширим программную часть. Как&lt;br /&gt;
и&lt;br /&gt;
всегда, на диске LXF вы найдете исходный&lt;br /&gt;
файл для работы lesson3_begin и результат&lt;br /&gt;
этого урока – lesson3_end.&lt;br /&gt;
&lt;br /&gt;
Прежде чем приступить к текстурированию (а это большая и сложная тема), давайте&lt;br /&gt;
немного освежим пройденный материал.&lt;br /&gt;
Итак, мы познакомились с наиболее значительными из часто используемых кирпичиков логики, переменными и системой&lt;br /&gt;
межобъектовых сообщений. В ходе разминки, думаю, вам не составит особенного труда приделать постоянное вращение по оси X для стрелки.&lt;br /&gt;
Это придаст немного динамичности в общем-то инертной сцене.&lt;br /&gt;
Небольшая подсказка – воспользуйтесь блоками Always [Всегда] и&lt;br /&gt;
Motion [Движение], а уж если у вас ничего не получится, загляните&lt;br /&gt;
в исходник lesson3_end.&lt;br /&gt;
&lt;br /&gt;
=== Цветной мир ===&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=На заметку&lt;br /&gt;
|Содержание=UV-координаты – это двумерные координаты, определяющие способ проецирования изображения или текстуры на грань.&lt;br /&gt;
Используются для рендеринга в реальном времени.&lt;br /&gt;
&lt;br /&gt;
В свою очередь, каждая грань меш-объекта может иметь&lt;br /&gt;
связь с различными текстурами (или их частью).&lt;br /&gt;
|Ширина=300px}}&lt;br /&gt;
При работе с текстурами в Blender Engine, равно как и с другими игровыми движками, следует учитывать несколько моментов.&lt;br /&gt;
Во-первых, размер картинки любого формата должен быть одним&lt;br /&gt;
из следующих: 128х128, 512х512 или 1024х1024 бит. Данное ограничение связано со спецификой работы видеокарт и позволяет&lt;br /&gt;
оптимально использовать имеющуюся видеопамять. Какой именно&lt;br /&gt;
размер использовать, естественно, зависит от поставленных задач&lt;br /&gt;
и самого движка. Как правило, в отношении BGE хорошо подходит&lt;br /&gt;
вариант 512x512 бит. Обратите внимание и на глубину цветопередачи: к примеру, широко используемый формат Targa (tga) может&lt;br /&gt;
иметь альфа-канал (отдельный канал прозрачности) только при&lt;br /&gt;
разрядности в 32 бита. Большое значение имеет выбор самого&lt;br /&gt;
формата хранения изображения. Оптимальным для игр является&lt;br /&gt;
PNG (Portable Network Graphic) или уже упомянутый Targa, благодаря низким потерям при сжатии информации и возможностью&lt;br /&gt;
использования альфа-канала.&lt;br /&gt;
&lt;br /&gt;
Процесс создания графического контента выходит за рамки&lt;br /&gt;
данной статьи, поэтому на диске LXF вы найдете уже готовые текстуры. В принципе, нет особой разницы, какой программный продукт использовался для их создания (берите хоть PaintBrush, хоть&lt;br /&gt;
GIMP): главное – следовать приведенным выше советам.&lt;br /&gt;
Использование текстуры в Blender Engine возможно лишь после&lt;br /&gt;
специальной привязки ее к так называемым UV-координатам объекта, а точнее, его граням. Для этой цели в программе имеется&lt;br /&gt;
UV-редактор [UV-Editor]. С его помощью вы можете задавать не&lt;br /&gt;
только индивидуальные координаты и привязывать к ним определенную текстуру, но и совмещать ее с окраской вершин, тем самым&lt;br /&gt;
изменяя освещенность или цветовую гамму картинки в целом.&lt;br /&gt;
&lt;br /&gt;
Помимо знания и умения работать с UV-редактором, необходимо познакомиться с еще одним режимом отображения – FaceSelect&lt;br /&gt;
[Выбор граней]. Именно в нем и происходит выделение необходимых для окраски граней. Кроме того, данный режим обладает&lt;br /&gt;
целым рядом полезных функций применительно к игровому движку, но об этом позже.&lt;br /&gt;
&lt;br /&gt;
Откройте файл lesson3_begin, если, конечно, вы этого еще не&lt;br /&gt;
сделали. Практикум работы с текстурами мы будем проходить на&lt;br /&gt;
примере какой-нибудь одной модели. Надеюсь, вы не думали всерьез, что в рамках одной статьи поместится подробное руководство&lt;br /&gt;
по глобальному текстурированию всей игры?&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=На заметку&lt;br /&gt;
|Содержание=Приведенные советы для настройки UV-координат и привязки&lt;br /&gt;
их к текстуре действуют лишь по отношению к движку Blender.&lt;br /&gt;
Если вам необходимо просто отрендерить для просмотра кадр&lt;br /&gt;
из сцены стандартными средствами программы, следует соответствующим образом настроить материалы объекта, использующего UV- координаты. Для этого войдите в панель материалов&lt;br /&gt;
(F5) и в закладке Map Input нажмите кнопку UV. Затем в основной закладке Material активируйте кнопку TexFace.&lt;br /&gt;
|Ширина=300px}}&lt;br /&gt;
Итак, выделите в режиме Object Mode [Работа с объектом] объект s1 (первый интерфейсный шар-бросок из трех имеющихся).&lt;br /&gt;
В соседнем окне откройте UV/ Image Editor, как обычно, из меню&lt;br /&gt;
Window Type [Тип окна]. Нажав кнопку F, вы задействуете режим&lt;br /&gt;
UV Face Select.&lt;br /&gt;
&lt;br /&gt;
Настало время подгрузить необходимую картинку. Для этого&lt;br /&gt;
в окне UV-редактора выберите функцию Open из меню Image или&lt;br /&gt;
просто нажмите сочетание клавиш Alt+O. Найдите в папке Texture&lt;br /&gt;
файл 10.jpg и откройте его.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF 105 101 1.png|thumb|300px|Рис. 1. Задумались, как оптимально расположить текстуру? Просто выберите подходящий пункт меню.]]&lt;br /&gt;
Чтобы задать UV-координаты для выделенного объекта, нажмите клавишу U в окне модели. Давайте рассмотрим некоторые полезные для нас пункты этого меню поподробнее (рис. 1):&lt;br /&gt;
* Unwrap – удаление привязки UV-координат к выделенной грани.&lt;br /&gt;
* Cube, Cylinder, Sphere Projection – заданный способ раскладки координат, соответствующий выбранному типу объекта.&lt;br /&gt;
* Project from View – проекция координат, как в активном 3D окне.&lt;br /&gt;
* Reset – сброс установленных координат по умолчанию.&lt;br /&gt;
В нашем случае, для сферической модели подходит пункт&lt;br /&gt;
Sphere from View. Обратите внимание, как изменилась сетка раскладки в окне UV-редактора. Работа по подгонке в этом режиме&lt;br /&gt;
ничем не отличается от обычных 3D View. Вы можете перемещать,&lt;br /&gt;
масштабировать или вращать ее, как вам заблагорассудится. Для&lt;br /&gt;
контроля происходящего советую включить режим отображения&lt;br /&gt;
текстур в меню Draw Type [Тип прорисовки]. Вызвать его также&lt;br /&gt;
можно, нажав клавиши Alt+Z. Следуя приведенным выше советам,&lt;br /&gt;
настройте самостоятельно сетку так, чтобы единичка на рисунке&lt;br /&gt;
пришлась по центру модели. Вернуться в обычный режим редактирования можно все той же клавишей F.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF 105 101 2.png|thumb|300px|Рис. 2. Глубоко запрятанные от посторонних глаз настройки объекта. Правда, без них никуда.]]&lt;br /&gt;
Помимо своей основной функции настройки координат, режим&lt;br /&gt;
Face Select обладает еще целым рядом полезных по отношению&lt;br /&gt;
к BGE возможностей. Найти их можно в меню Face &amp;gt; Active Draw&lt;br /&gt;
Mode (рис. 2). К сожалению, некоторые интересные функции работают совсем не так, как ожидается. К примеру, пункт меню Shadow&lt;br /&gt;
[Тень] предполагает не что иное, как отбрасывание объектом тени&lt;br /&gt;
realtime (то есть в реальном времени). В действительности, без&lt;br /&gt;
специально написанного кода, ручными средствами добиться этого&lt;br /&gt;
невозможно. Тем не менее, приведу расшифровку некоторых наиболее интересных (и работающих!) пунктов меню:&lt;br /&gt;
* Light – при включении этого параметра текущая модель или ее выделенная грань будет реагировать на имеющийся в игре источник света (realtime).&lt;br /&gt;
* Billboard – особый режим прорисовки трехмерной модели как двумерной, всегда обращенной лицевой стороной к активной камере. Обычно используется для визуализации незначительных, но многочисленных объектов в сцене, скажем, деревьев.&lt;br /&gt;
* Collision – отключение этой функции приведет к исключению модели из расчетов физического движка игры, что положительно скажется на общей производительности.&lt;br /&gt;
* Text – при активации этого параметра и некоторых других опций, движок Blender’а выводит на экран текстовое значение присвоенной этому объекту переменной. Более подробно мы поговорим об этом на следующем уроке.&lt;br /&gt;
* Blend Mode – управление режимами отображения текстуры, такими как прозрачность или самосвечение.&lt;br /&gt;
&lt;br /&gt;
Прежде чем завершить повествование о текстурировании в&lt;br /&gt;
BGE и перейти к следующей части урока, познакомимся с еще двумя полезными возможностями программы. Иногда бывает нужно&lt;br /&gt;
использовать не текстуры, а встроенные материалы Blender. Для&lt;br /&gt;
этого необходимо просто включить соответствующую функцию в&lt;br /&gt;
главном меню программы: Game &amp;gt; Use Blender Materials [Игра &amp;gt;&lt;br /&gt;
Использовать материалы Blender]. Именно так и было настроено&lt;br /&gt;
отображение указательной стрелки в игре. Само собой, при этом&lt;br /&gt;
имеется возможность использования шейдерных эффектов.&lt;br /&gt;
&lt;br /&gt;
Бывает нужно не просто привязывать текстуру по&lt;br /&gt;
UV-координатам, а использовать так называемый режим отображения Reflection [Отражение]. Визуально это выглядит как скольжение объекта по неподвижной картинке. Просто переключите в окне&lt;br /&gt;
UV Editor пункт меню Image &amp;gt; RealtimeTexture Mapping &amp;gt; Reflection&lt;br /&gt;
для конкретного объекта. Естественно, сам объект должен находиться в режиме Face Select.&lt;br /&gt;
&lt;br /&gt;
=== Удар, еще удар ===&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=На заметку&lt;br /&gt;
|Содержание=В этом уроке и рабочих файлах игры, для удобства, текстуры предоставлены в виде отдельных, подгружаемых по мере&lt;br /&gt;
необходимости файлов. Тем не менее, Blender имеет возможность сохранения картинок внутри самого проекта. Для этого&lt;br /&gt;
в Image Editor’е используйте функцию Image &amp;gt; Pack Image или&lt;br /&gt;
нажмите соответствующую кнопку на панели. Само собой, при&lt;br /&gt;
создании двоичного файла игры, текстуры также помещаются&lt;br /&gt;
внутрь него.&lt;br /&gt;
|Ширина=300px}}&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;
оси Y, и в этом случае неизбежно столкновение с окружающими&lt;br /&gt;
стенами.&lt;br /&gt;
&lt;br /&gt;
В Blender Engine имеется сенсор с характерным названием Ray&lt;br /&gt;
[Луч]. Его назначение, как вы уже наверное догадались, в испускании луча по указанной в настройках оси и срабатывании при столкновении последнего с другими объектами. Имеется возможность&lt;br /&gt;
выбора реакции сенсора на материал или переменную. В случае,&lt;br /&gt;
если ни то, ни другое не указано, сенсор срабатывает при соприкосновении с любыми объектами.&lt;br /&gt;
&lt;br /&gt;
Найдите кеглю с названием с1 (не интерфейсная!) и проложите уже ставшую стандартной логическую цепочку Ray &amp;gt; And &amp;gt;&lt;br /&gt;
Message. Мы будем использовать в качестве критерия для столкновения материал, что присвоен окружающим стенам. Для этого&lt;br /&gt;
нажмите кнопочку M/P и в поле Material: впечатайте строку home.&lt;br /&gt;
Именно так называется материал окружающего короба, по крайне мере в проекте, что находится на диске. Следующий параметр,&lt;br /&gt;
Range [Диапазон], отвечает за длину испускаемого луча. Опытным&lt;br /&gt;
путем я подобрал значение 50. И последнее, что осталось сделать – выбрать ось излучения. В нашем случае используется ось Y&lt;br /&gt;
(положительная). Таким образом, мы полностью настроили и подготовили к работе сенсор.&lt;br /&gt;
&lt;br /&gt;
Для отслеживания и взаимодействия интерфейсных кеглей с&lt;br /&gt;
игровыми используем механизм сообщений. Пусть при срабатывании генерируется сообщение «c1_false». Внесите это значение в&lt;br /&gt;
поле Subject активатора Message. На этом настройка данной логической цепочки завершена.&lt;br /&gt;
&lt;br /&gt;
Осталось соответствующим образом научить интерфейсные&lt;br /&gt;
кегли принимать это сообщение. Создайте логическую цепочку&lt;br /&gt;
Message &amp;gt; And &amp;gt; Visibility для первого объекта. В сенсор поместите&lt;br /&gt;
значение c1_false. В качестве активатора используется новый для&lt;br /&gt;
вас кирпичик Visibility [Видимость]. Его функция очень проста –&lt;br /&gt;
отключение или включение отображения объекта; при этом сам он&lt;br /&gt;
не удаляется, в отличие от ранее использованного нами активатора&lt;br /&gt;
Edit Object [Редактирование объекта]. В данном случае не принципиально, что делать с отслужившей свое кеглей – можете и удалить.&lt;br /&gt;
Подобным образом вам предстоит настроить оставшиеся кегли –&lt;br /&gt;
естественно, для каждой из пар должен быть уникальный текст сообщения. В моем проекте используется имя кегли (c1,c2 ... c10) с присоединенной частью _false.&lt;br /&gt;
&lt;br /&gt;
Наверное, вы обратили внимание на сильное торможение при&lt;br /&gt;
большом количестве сбитых кеглей. Существует несколько способов повышения производительности игры. Самый простой –&lt;br /&gt;
заменить текущий физический движок Bullet на Sumo. Это можно сделать в панели World [Окружающий мир]. Правда, при этом&lt;br /&gt;
для нормальной симуляции придется значительно перенастроить&lt;br /&gt;
физические параметры. Замечу, что многие источники не советуют&lt;br /&gt;
использовать Sumo ввиду его нестабильности и устарелости. Так&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;/div&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	</feed>