Уроки по Blender Game Engine (игровому движку программы Blender)

Десять уроков для начинающих по игровому движку Blender (Blender Game Engine, он же BGE, он же gameBlender). Затрагиваются элементы физики движения и игровой логики. В курсе предусмотрены практические задания.

Введение в Blender Game Engine (BGE). Урок 1

1. Что такое BGE

Уникальной особенностью Blender является встроенный в него так называемый "игровой движок" (англ. game engine). Это программный компонент, который позволяет создавать небольшие игры, не выходя из среды трехмерного моделирования Blender.

Game engine:

  1. придает объектам "физические" свойства; объекты начинают вести себя так, как в реальном мире: падают под действием силы тяжести, сталкиваются и т.д. (возможно следует отметить, что в этом смысле движок еще "сыроват");
  2. позволяет наблюдать поведение объектов в реальном времени и воздействовать на них;
  3. записывает происходящее в режиме игры в анимацию;
  4. позволяет визуально настраивать (программировать) поведение и взаимодействие объектов;
  5. а также встраивать скрипты на языке программирования Python.

Режим игры – это режим действия игрового движка. Он запускается при нажатии клавиши P на клавиатуре. Выход из него – клавиша Esc. Лучше перед запуском игры переключиться в режим отображения текстур (Alt+Z).

Задание. Расположите на сцене плоскость и любой другой меш-объект над ней. Включите режим отображения текстур, затем режим игры. После выйдите из режима игры.

Для настройки поведения объектов для режима игры предназначена панель кнопок Logic (F4). На этом уроке мы рассмотрим ее левую часть – настойки объекта.

2. Типы объектов

В реальном мире объекты сделаны из различных материалов и, естественно, обладают различными свойствами.
Игровой движок (BGE), конечно, не позволяет симулировать такое разнообразие, но кое-что может. К тому же, BGE позволяет манипулировать и "нефизическими объектами", т.е. теми для которых как бы нет влияющего окружающего мира (в реальном мире таких объектов не существует).

Тип выбранного объекта (например, куба) задается с помощью меню Object Type.

Типы объектов в Blender Game Engine

Occluder (occlude – закрывать, преграждать). В определенных условиях увеличивает производительность путем исключения объектов, расположенных за объектом-«окклюдером». Уместно использовать в сложных сценах.

No collision (collision - столкновение). Отключает у объекта возможность столкновения с другими объектами. Т.е. если dynamic-объект встретит на своем пути no_collision-объект, то пройдет сквозь него, как будто его нет. Рекомендуется использовать для объектов, которые никогда ни с чем не столкнуться: выбор этого типа объекта увеличивает производительность игры.

Sensor (датчик). Предназначен для более сложного управления столкновениями.

Static (статический, неподвижный). Такой тип объекта может участвовать во взаимодействиях с физическими объектами (играть роль препятствий), хотя на него не влияют никакие виртуальные физические силы. В режиме игры он может быть перемещен за счет изменения своего положения, но не под влиянием сил. Два static-объекта при пересечении их путей не сталкиваются, а проходят сквозь друг друга.

Dynamic (динамический). Объект, на который "действуют" законы физики: сила тяжести, масса, воздействие внешних сил, ускорение и др.

Rigid body (твердое тело). Более реально ведущий себя по сравнению с Dynamic "физический" объект.

Soft body (мягкое тело). "Физический" объект, который ведет себя подобно резиновому мячу или мягкой игрушке, т.е деформируется (изменяет свою форму) при столкновениях с другими объектами.

Опыт 1. Типы объектов
Для того, чтобы сразу протестировать как ведут себя некоторые типы объектов в режиме игры, расположим несколько сфер над плоскостью и нажмем P. Вот что мы увидим по прошествии нескольких секунд:

Поведение объектов в Blender в режиме игры (P)

Видно, что с объектов типа Static ничего не произошло, Dynamic, Rigid Body и Soft Body упали под действием виртуальной силы тяжести. Причем Soft Body упал и слегка «размазался», как и положено мягкому телу, но почему-то меш-объект остался прежнего размера (это недоработка Blender или как-нибудь настраивается отдельно? Примечание: если при создании сферы сразу указать небольшой размер, то она будет мелкой при создании из нее мягкого тела).

Опыт 2. Dynamic и Rigid body
Чтобы заметить разницу между Rigid body и Dynamic, развернем плоскость на 50 по оси Y или X. Теперь можно наблюдать, что при падении Rigid Body продолжает свое движение как естественный объект (также ведет себя и Soft Body), а Dynamic остается спокойно лежать на плоскости. Конечно, если наклон плоскости сделать больше, то вниз покатится и динамический объект.

Отличие между объектами Dynamic и Rigid Body в Blender

3. Настройки

В предыдущем опыте можно заметить, что при смене типа объектов меняются кнопки настоек ниже. Здесь основная часть настроек свойств объекта. Рассмотрим некоторые.

Настройки объектов Rigid Body и Soft Body в Blender

Общие:

Actor (актер). Для версии 2.49 осталось непонятным, на что влияет данных параметр.
Ghost (призрак). Объект будет проходить сквозь другие объекты при столкновении с ними, при этом никак на них не влияя.
Invisible (невидимый). Объект становится невидимым, но присутствует на сцене. Объект-невидимка может взаимодействовать с другими объектами.
Mass (масса). Виртуальная масса объекта. Настройка данного параметра имеет большое значение для "физических" объектов при воздействии на них той или иной силы. Чем больше масса, тем больше нужно приложить силы для ее перемещения.

Rigid body:

Radius (радиус). Влияет на площадь взаимодействия с объектом. Радиус виден как розовая пунктирная окружность в 3D окне. Если не виден, то увеличьте значение. Фактически границы окружности и определяют размер взаимодействующей области (объекта).
No sleeping (не спящий). При включении-отключении данной опции в версии 2.49 изменений в поведении объекта при применении к нему силы замечено не было.
Остальные настройки пока опустим, т.к. они достаточно специфичны и требуют начальных знаний физики.

Soft body:

Shape Match (shape – форма, match – выравнивать, противостоять и др.). Если кнопка будет выключена, то объект не сохранит свою форму, а сложится как тряпка (при достаточном количестве вершин).
Bending Const (bending – сгибание, constraints – ограничения). Если отключить данную кнопку, то объект при столкновении будет сильнее изменять свою форму.
kMT. Влияет на упругость объекта, связана с Shape Match. Увеличив данное значение, например, у сферы, вы получите объект поведением похожий на мяч.

4. Практическая работа

  1. Разместите на сцене плоскость, увеличьте ее. Над плоскостью друг над другом расположите три одинаковых куба, каждый куб должен быть
    объектом Rigid body. Запустив режим игры, отметьте, как упали кубики.
  2. У среднего куба увеличьте Radius до значения 1.5. Снова запустите игру и отметьте изменения.
  3. Включите для среднего куба кнопку Invisible и снова запустите режим игры. Участвует ли невидимый куб во взаимодействии объектов?
  4. Удалите со сцены все три куба. Добавьте сферу с 16-тью сегментами и кольцами (уменьшение частей меш-объектов влияет на производительность),
    расположив ее над плоскостью. Сделайте ее объектом Soft body и продублируйте по оси X четыре раза (все пять объектов должны быть над плоскостью,
    увеличьте плоскость при необходимости). Желательно развернуть камеру таким образом, чтобы она "смотрела" прямо на ось X.
  5. Для первого объекта Soft body оставьте значения настроек по умолчанию. У второго – увеличьте значение kMT почти до единицы.
    У третьего – отключите Shape Match, у четвертого – Bending Const, а у пятого – обе кнопки.
  6. Запустите режим игры. Отметьте изменения каждой из сфер. Если разница между первой и четвертой сферой? В чем она заключается?

Сенсоры, контроллеры и активаторы. Урок 2

Уроки по Blender Game Engine

Панель Logic (F4) можно условно разбить на четыре части настроек: свойства объекта (рассмотренные на прошлом уроке), сенсоры, контроллеры и активаторы. Сенсоры объекта позволяют ему воспринимать различные внешние «раздражители», такие как нажатие клавиши, движение мыши, касание другого объекта и др. Контроллеры в основном предназначены для связывания определенным образом сенсоров и активаторов. Активаторы могут выполнять различные действия над данным объектом или другими. Некоторые настройки активаторов могут различаться у разных типов объектов.
Для того чтобы добавить очередной сенсор, контроллер и активатор нужно нажать на кнопку ADD. Связь между ними обозначается линиями, которые создаются, если зажав ЛК мыши потянуть ей от одного узелка к другому (линию можно удалить, если навести мышь и нажать клавишу Del). У объекта может быть множество групп сенсоров, контроллеров и активаторов.

Сенсоры, контроллеры и активаторы в BGE

На этом уроке будет описано, как управлять объектом Static с помощью клавиатуры. Роль объекта сыграет стрелка, поворачивающаяся по двум осям и двигающаяся указателем вперед.

1. Создание объекта

Сначала создадим объект. Можно использовать любой меш-объект, но желательно, чтобы он был ассиметричен, т.к. в этом случае легче будет наблюдать его повороты.

Модель стрелки в Blender

Такую стрелку можно получить множеством способов. Ниже описан один из них:

  1. Вид сверху.
  2. Добавить плоскость.
  3. Перейти в режим редактирования. Удалить нижнюю правую вершину. Выделить три оставшиеся, нажать F (получиться треугольная плоскость). Далее, не снимая выделения, повернуть плоскость по оси Z на 450, таким образом, чтобы будущий указатель «смотрел» вверх (вдоль оси Y).
  4. Не выходя из режима редактирования, добавить еще одну плоскость ниже. Сжать ее по оси X, переместить под указатель; – это ножка стрелки.
  5. Вид из камеры.
  6. Выбрать режим выделения граней и выдавить (экструдировать), тем самым придав стрелке объем.
  7. Выйти из режима редактирования.

2. Движение вперед

Заставим нашу стрелку двигаться указателем вперед при нажатии на клавишу Пробел.
Выделив стрелку (которая должна быть static-объектом), добавьте сенсор, контроллер и активатор и соедините их между собой.

Добавление сенсора, контроллера и активатора в Blender

По умолчанию в качестве сенсора выступает Always (всегда). Такой сенсор будет действовать постоянно. Нам это не подходит. В выпадающем списке выбираем Keyboard (клавиатура). Нажимаем в поле Key мышью, затем нажимаем клавишу Пробел (Space).

Сенсор Keyboard

Теперь настроим активатор. Активаторы бывают разные (это на будущее). По умолчанию стоит Motion (движение). В нижней части есть две строки: Loc (location – положение) и Rot (rotation – вращение). В каждой строке по три поля: в них задаются величины изменений по оси X, Y или Z при воздействии.

Активатор Motion

Поскольку наша стрелка должна двигаться вперед и для нее это ось Y, то следует изменить значение в первой строке во втором столбце. Щелкните по нулям там и пропишите значение в 0.05.
Теперь при запуске режима игры (P) и нажатии на клавишу пробел стрелка будет двигаться вперед.

3. Повороты

Для того, чтобы стрелка при движении могла оказаться в любой точке трехмерного пространства достаточно настроить ее поворот только по двум осям: X (повороты вверх и вниз) и Z (налево и направо). Поворачиваться стрелка будет при нажатии на стрелки на клавиатуре. Требуется добавить еще четыре группы сенсоров, контроллеров и активаторов.

Управление объектом Static в Blender Game Engine

Теперь, запустив режим игры, можно передвинуть стрелку в любое место 3D-окна, предварительно повернув ее с помощью стрелок на клавиатуре.

4. Локальные и глобальные оси

В конце строк настроек Loc и Rot есть переключатели L. По умолчанию эти кнопки нажаты и обозначают локальную привязку осей. Это означает, что оси X, Y и Z как бы находятся внутри объекта и при его повороте поворачиваются вместе с ним. Поэтому-то у нас стрелка все время двигается указателем вперед, как ее не поверни.
Если выключить кнопку L напротив Loc в блоке, отвечающем за движение по оси Y, то стрелка будет двигаться только в одном направлении (по глобальной оси Y) не зависимо от поворота своего указателя. Глобальные оси в 3D-окне обозначаются красной (X), зеленой (Y) и синей (Z) линиями.

5. Практическая работа

  1. Создайте модель стрелки и задайте ей возможность движения и поворота с помощью Blender Game Engine так, как описано в уроке.
  2. Исследуйте влияние на движение стрелки включенной и отключенной Local Transformation (кнопка L).
  3. Добавьте на сцену плоскость и пару других меш-объектов, расположив их над плоскостью. Исключая плоскость и стрелку, задайте для объектов тип Rigid body. Запустите режим игры и попробуйте столкнуть объекты с плоскости с помощью стрелки.
Управление объектом Static в Blender Game Engine

Сила (force) и физические объекты в Blender Game Engine. Урок 3

1. Физика в Blender

Когда к объекту в Blender применяется тип Dynamic, Rigid или Soft body, то в режиме игры их поведение становится похожим на поведение реальных объектов в области притяжения Земли (эти настройки можно изменить: например, эмулировать невесомость). В реальном мире плотные объекты не висят в воздухе, а падают на поверхности; при столкновении объекты могут отскакивать; для перемещения объекта с большей массой требуется приложить больше силы и т.д.

2. Активатор Motion

Для физических объектов у активатора Motion появляются дополнительные строки настроек (помимо Loc и Rot, которые также есть у статических объектов и отвечают за перемещение и поворот объекта).

Сравнение активатора Motion для статических и динамических объектов

Force (сила). Воздействие на объект с заданной силой и направлением. В отличие от Loc, объект не перемещается самостоятельно, а на него как бы действует сторонняя сила.
Torque (вращающий момент). Сила действует таким образом, что заставляет объект вращаться, а не перемещаться.

3.Force

Разместим на сцене плоскость и куб на ней. Добавив сенсор, контроллер и активатор и связав их между собой, увеличим значение Force по оси Х или Y.

Активатор Motion, изменение Force

В режиме игры объект будет двигаться, как и при влиянии Loc, однако он будет двигаться с ускорением, т.к. сила действует постоянно и постепенно разгоняет объект. После прекращения воздействия, объект останавливается не сразу, а постепенно (в отличие от Loc).

4. Local transformation и Rigid body

На объекты Rigid body сильное влияние оказывает привязка осей (X, Y, Z) к самому объекту или к 3D-миру. Если не выключить кнопку L, то объект не будет двигаться по направлениям пространства, а будет покачиваться на одном месте. Это связано с тем, что ось объекта при его повороте меняет свое направление, и тогда сила действует с другой стороны с точки зрения 3D-мира.

5. Влияние массы объекта

Обратите внимание на значение в строке Force. Заметные влияния на объект здесь возникают при изменении значения на единицы, а не на дробные значения как в случае Loc. Применение одной и той же силы к объектам разной массы оказывает различное влияние на них. Так если объект Dynamic с установленной виртуальной массой в 2 единицы попытаться сдвинуть с помощью 2 «виртуальных ньютонов», то ничего не получится. Объект же массой в 0.5 единиц будет передвигаться. Примечание: объекты Rigid body и Soft body ведут себя немного по-другому.

Различное значение mass при одинаковом force в BGE

6. Ось Z

Для того, чтобы придать объекту движение с помощью Force по осям X и Y достаточно значения сопоставимого с массой объекта или немного больше ее. Однако движение по оси Z в положительном направлении (вверх) требует применения силы большего значения. Вспомним, что находясь в поле Земли объекты притягиваются к ней с ускорением свободного падения равным примерно 9.8 м/с2. Чтобы преодолеть силу притяжения Земли и подбросить объект вверх, требуется сообщить ему большее ускорение, чем 9.8. Примечание: значение Force по оси Z не обязательно должно быть больше 9.8; объекты массой меньше единицы поднимаются вверх и при меньших значениях силы.

7. Роль центра объекта при движении

У любого меш-объекта в Blender есть центральная точка (в BGE она играет роль центра тяжести объекта). Объект всегда вращается вокруг нее и именно на нее действует сила. Для того, чтобы увидеть как от смены центра тяжести изменяется поведение объекта можно проделать следующий опыт. Расположим на сцене два одинаковых сплюснутых цилиндра. Оба – Dynamic, при нажатии на клавишу Space (пробел) на них воздействует Torque (вращающий момент по оси Z) в 2-3 единицы. Центральная точка одного из цилиндров смещена к его границе.

Влияние расположения центра объекта на его движение в Blender

В режиме игры при нажатии на клавишу Пробел один цилиндр будет крутиться на месте, а второй совершать круговые движения, описывая окружность.

8. Практическая работа

  1. Расположите на сцене три объекта Dynamic или Rigid body (для Rigid обязательно отключите L), установите им различную между собой массу на панели Logic. Добавьте сенсор, контроллер и активатор каждому объекту. В качестве сенсора установите Keyboard (в качестве Key пусть будет клавиша Пробел). Для всех объектов примените одинаковую силу по оси X или Y. Найдите такое значение силы, при которой объект, обладающий большей массой, почти не перемещается при воздействии силы, остальные – двигаются. Оцените взаимосвязь массы и силы.
  2. Расположите два Dynamic-шара. Одному из них задайте постоянную силу воздействия вниз. Падает ли он быстрее, чем другой шар? Расположите шар виртуальной массой в 5 единиц на плоскости. Найдите значение минимальной силы способной при постоянном воздействии оторвать шар от плоскости.
  3. Добавьте на сцену два вытянутых по оси Z Rigid-цилиндра. Сместите одному центральную точку к верхней части, а другому – к нижней. Задав силу воздействия по оси X или Y, оцените поведение объектов. Примечание: для цилиндров измените границу с Box на Convex Hull (выпуклая оболочка); для этого предварительно следует нажать кнопку Bounds (границы).
Настройка границ объекта в Blender Game Engine

Взаимодействие объектов в Blender Game Engine. Урок 4

модель в Blender Game Engine

Игровой движок Blender’а позволяет виртуальным объектам вести себя подобно объектам реального мира. Следовательно, результат взаимодействия объектов Dynamic, Rigid и Soft body в Blender Game Engine должен зависеть от настроек их массы, а также сил, влияющих на них. Рассмотрим это на примере.
У нас будет стена из кирпичей и шар, разбивающий ее. По отношению к шару можно будет прикладывать разную силу. В зависимости от приложенной силы шар может разрушать стену или нет.

Стена состоит из кирпичей, каждый из которых представляет собой измененный куб типа Rigid body. При взаимодействии объектов важно настроить свойство Bounds (границы). В данном случае лучше использовать тип Convex hull (выпуклая оболочка).

Настройка границ объектов для игрового режима Blender

С помощью дублирования (Shift + D) создаем стену из кирпичей. Здесь важно плотно подогнать один к другому. В режиме игры стена должна оставаться целой, а не разваливаться. Последнее может случиться, если неправильно настроены границы объектов или кирпичи неправильно расположены относительно друг друга.

Стена из блоков в Blender

Добавляем на сцену сферу, устанавливаем для нее также тип Rigid body и располагаем на некотором расстоянии от стены. При нажатии на клавишу с цифрой 1 на клавиатуре шар должен двигаться в направлении стены в результате приложения к нему силы. Следует выключить кнопку L.

Настройка сенсора, контроллера и активатора

Сила при нажатии на клавишу с единицей постоянно воздействует на шар. Чем дольше мы жмем, тем больше сила воздействия. На самом деле трудно определить, сколько силы было передано шару. Так может оказаться, что при воздействии меньшей силы, но на протяжении большего времени, шару суммарно было сообщено больше воздействия, чем при моментальном воздействии большей силы. Чтобы избежать недоразумений, в Blender Game Engine можно сделать так, что шару будет сообщаться сила только тогда, когда он находится в определенном месте или в течение строго определенного временного интервала.
Наша сфера будет испытывать воздействие силы лишь тогда, когда касается красной маленькой плоскости. Для этого нужно добавить к сфере сенсор Touch (касание) и связать его с уже существующим контроллером. В поле MA следует прописать материал, при касании которого будет срабатывать сенсор Touch. Имя материала можно найти на панели кнопок Shading (F5).

Настройка сенсора touch

Два сенсора связаны с одним контроллером типа AND. Это означает, что активатор сработает лишь в том случае, если сигнал будет поступать от обоих сенсоров. В данном случае, должна быть зажата клавиша с единицей и объект должен касаться материала start. Если зажата единица, но нет касания start (или, наоборот, есть касание, но нет сигнала с клавиатуры), то активатор не будет запускаться.
Шар должен находиться над красной плоскостью. В режиме игры к шару будет прикладываться сила лишь в момент его нахождения на плоскости, а не на протяжении всего пути (при зажатой клавише 1). В дальнейшем это позволит трезво оценить, как влияет размер приложенной к шару силы на его способность разрушать стену.
Добавим также еще два комплекта сенсоров, контроллеров и активаторов. Настроим их также как и первый, за исключением величины прикладываемой силы и клавиш-сенсоров. Может быть один сенсор Touch, связанный с несколькими контроллерами. Также неплохо было бы добавить возможность перезагрузки без выхода из режима игры: активатор Scene –> Restart.

Настройка сенсора touch

Требуется установить такие величины силы, чтобы в первом случае стена почти не разрушалась, а во втором – разрушалась меньше, чем в третьем.
На примере этой модели видно, что скорость шара (и как следствие его разрушающая способность) зависит от величин приложенной к нему силы. Эта зависимость есть в реальном мире, к которому мы привыкли, она эмулируется и в Blender Game Engine.

Практическая работа

  1. Создайте модель, описанную в уроке.
  2. Определите с помощью BGE, как влияет расстояние между шаром и стеной на разрушение последней. С чем это связано?
  3. Создайте модель известной физической закономерности: рычаг уравновешен, когда произведение массы на длину одного плеча равно произведению массы на длину другого плеча. В модели должна быть возможность передвигать виртуальные массы (например, кубики) по бревну, добиваясь равновесия.

Сенсор Mouse. Урок 5

Уроки по Blender Game Engine

Сенсор Mouse в Blender Game Engine

Отображение курсора мыши в режиме игры

Среди множества сенсоров в BGE есть и сенсор Mouse (мышь), улавливающий различные манипуляции мыши (щелчки кнопками мыши, движение, прокручивание колеса и др.). Однако, при запуске режима игры (P) мы не видим курсор мыши. Чтобы отобразить курсор нужно прописать небольшой скрипт. Для этого разделите 3D-окно на две части, одну из них поменяйте на окно Text Editor. Далее раскройте меню Text и выберите пункт New. По умолчанию первый скрипт будет называться Text.001, лучше ему дать более осмысленное имя (например, mouse). Затем в окне следует ввести следующие строки:

import Rasterizer 
Rasterizer.showMouse(1)

В первой строке импортируется модуль, а во второй – вызывается функция showMouse, позволяющая отобразить курсор мыши в режиме игры.

Скрипт для отображения курсора мыши в режиме игры в BGE

Однако, это еще не все. Нужно привязать данный скрипт к какому-либо объекту на сцене (допустим камере). Для того, чтобы курсор отображался всегда, следует добавить активатор Always и связанный с ним контроллер Python, где в качестве Script указывается имя того скрипта, который был создан ранее (в нашем случае, это mouse). Активатор в данном случае не требуется. После этого в режиме игры курсор будет виден.

Отображение курсора мыши в режиме игры в BGE: панель Logic

Управление 3D-объектами с помощью мыши в Blender Game Engine

Движение 3D-объекта с помощью мыши в BGE: панель Logic

Пусть на сцене будет плоскость и Rigid-сфера на ней. Сфера будет управляться с помощью мыши следующим образом:

  1. Если сфера находится на плоскости (а не в «воздухе»), то щелчок левой кнопкой мыши по ней должен «сообщать» силу, приводящую ее в движение вверх.
  2. Прокрутка колеса мыши вверх и вниз должна «сообщать» сфере вращающий момент (Torque) по оси Z по часовой и против часовой стрелки.

Разберем, как это сделать. Добавив сенсор Mouse->Left button и связав его с активатором Motion, мы заставим сферу лететь вверх при нажатии левой кнопкой мыши в любом месте 3D-окна (в режиме игры). Тут две проблемы: во-первых, сфера взлетает от щелчка в любом месте экрана, а во-вторых, она летит даже тогда, когда уже находится не на плоскости. Проблемы решаются с помощью добавления еще двух сенсоров к уже существующим контроллеру и активатору. Один должен быть Mouse -> Mouse over, второй – Touch.
За прокрутку колеса отвечают сенсоры Mouse -> Wheel up (вверх) и Mouse -> Wheel down (вниз). Каждому следует добавить свой контроллер и активатор.

Практическая работа

  1. Расположите на сцене три любых объекта на плоскости. Установите для них тип Rigid body. При щелчке левой кнопкой мыши по каждому отдельному объекту он должен отскакивать в какую-нибудь сторону, а при щелчке правой кнопкой мыши в любом месте 3D-окна все объекты должны взлетать вверх.
  2. На новой сцене расположите сферу (Rigid body) и плоскость под ней. Пусть любое движение мыши (Movement) заставляет объект крутиться по оси X или Y, а щелчок левой кнопкой мыши «сообщает» силу движения вперед в выбранном направлении. Отметьте, есть ли разница в скорости между двумя случаями: 1) сначала сфера крутится, а затем получает толчок вперед, 2) сфера сразу толкается вперед.

Управление камерой в Blender Game Engine. Урок 6

Далеко не редкими бывают ситуации, когда сцена слишком большая для полноценного ее обзора с помощью неподвижной камеры. Поэтому необходимо, чтобы камера двигалась, следя за объектами, или на сцене присутствовали несколько камер, между которыми можно было бы переключаться. Допустим, мы придумали игру, в которой шар должен преодолеть препятствия, перепрыгивая их, не толкая при этом (иначе перегородки упадут). Путь, который шар должен пройти очень длинный. Если камера все время остается на месте, то стоит шару немного продвинуться вперед, как станет трудно или невозможно им управлять.

Blender Game Engine: вид из камеры

1. Связь родитель-потомок (Ctrl+P)

Данная связь широко используется в Blender для того, чтобы изменения объекта-«родителя» сразу приводили к изменениям объектов-«детей» (но не наоборот). Если «предок» меняет свое положение, размер, поворот, то следом за ним эти свойства изменяются и у «потомка». Для примера описанного выше, это означает, что если установить шар в качестве родителя, а камеру в качестве потомка, то любое перемещение шара, в том числе и в режиме игры, заставит камеру двигаться за ним.

Связь устанавливается так:

  1. Сначала выделяется потомок (в данном случае, камера).
  2. Затем (с зажатой клавишей Shift) выделяется предок (в данном случае, шар).
  3. Для установки связи родитель-потомок следует нажать комбинацию клавиш Ctrl+P (если в дальнейшем потребуется снять связь, то следует выделить оба предмета и нажать Alt+P).

Однако запустив режим игры можно столкнуться с проблемой: шар не только двигается, но и поворачивается. Следом за ним будет вертеться и камера, вид из камеры при этом будет варьировать от странного до еще более странного. Чтобы камера не вертелась, ее можно привязать не к целому объекту, а к его любой вершине. Вершина – это точка. Точки не вертятся. Тогда последовательность действий будет такой:

  1. Выделить камеру.
  2. Выделить шар-родитель (с зажатым Shift).
  3. Переключиться в режим редактирования.
  4. Выделить любую вершину шара.
  5. Нажать Ctrl+P. Выбрать Make vertex parent (сделать вершину родителем).
  6. Выйти из режима редактирования.

2. Активатор Camera

Есть еще один способ постоянно следить за выбранным объектом: использовать активатор Camera. Сделать это можно следующим образом. Для камеры добавить связанные между собой сенсор Always, контроллер и активатор Camera. В поле OB активатора прописать имя того объекта, за которым планируется следить.

Активатор Camera

Изначально настройки Height (высота камеры над объектом), Min и Max (минимальное и максимальное расстояния от камеры до объекта) равны нулю. Однако лучше их изменить. Если требуется, чтобы камера смотрела на объект больше сбоку, чем сверху, то Height не должна иметь большое значение.

Активатор Camera обеспечивает более плавное слежение за объектом, чем связь родитель-потомок. При резких движениях объекта камера двигается более мягко; если объект неподвижен, камера все равно продолжает немного двигаться и поворачиваться (по оси X или Y). Недостатком этого способа слежения является то, что если объект вертится, то камера иногда прокручивается так, что управлять объектом становится неудобно.

3. Слежение за разными объектами

Бывает, что на 3D-сцене сначала необходимо следить за одним объектом, а затем за другим. Чтобы реализовать такую возможность, можно создать для камеры не одну группу сенсоров, контроллеров и активаторов Camera. Каждый активатор может приводиться в действие нажатием клавиши или щелчком мыши. Тогда в режиме игры можно будет переключать вид с одного объекта на другой.

Камера может следить за несколькими объектами в BGE

4. Обзор сцены из разных камер

Когда требуется не следить за конкретным объектом, а просто обозревать сцену с разных точек зрения, то возможно уместней установить несколько камер и предусмотреть возможность переключаться между ними в режиме игры. Для установки камеры используется активатор Scene -> Set Camera.

Активатор Set Camera в BGE

Практическая работа

  1. Используя возможности игрового движка Blender, создайте сцену, в которой объект может перемещаться по плоскостям, расположенным вертикально по отношению друг к другу.
  2. Установите слежение за объектом с помощью связи родитель-потомок. Сохраните файл.
  3. Установите слежение за объектом с помощью активатора Camera. Сохраните файл под другим именем.
  4. Откройте оба файла и сравните движение камеры за объектом.
  5. Создайте 3D-сцену с несколькими объектами. Задайте возможность в режиме игры переключать вид камеры с одного объекта на другой.
  6. Добавьте на новую сцену две плоскости, разместив на них по любому объекту. Растащите их таким образом, чтобы одна плоскость была хорошо видна в одной камере, при этом вторая виднелась вдалеке. Во второй камере должна быть хорошо видна другая плоскость, а первая – где-то вдалеке. Организуйте возможность переключения между камерами с помощью щелчка левой кнопкой мыши по плоскости вдалеке.

Переходы между сценами при работе с игровым движком Blender. Урок 7

Уроки по Blender Game Engine

Обычно игры, создаваемые в Blender, состоят из нескольких сцен.

Добавление сцен в Blender

Blender Game Engine включает возможность настройки перехода на другую сцену в режиме игры. На панели Logic для этих целей предназначен активатор Scene -> Set Scene. В качестве значения SCE («установить сцену») указывается имя сцены, на которую требуется перейти.

Контроллер Set Scene в Blender Game Engine

События, которые могут приводить к переходу на другие сцены, различны: щелчки мышью, нажатия клавиш, касание материала и др.

Приведем простой пример. Допустим, мы создаем заготовку будущей «виртуальной лаборатории», состоящей из четырех сцен, на каждой из которых будет возможно проводить и демонстрировать какой-нибудь виртуальный эксперимент. С главной сцены можно будет на графическом меню указать с помощью щелчка левой кнопкой мыши желаемую сцену. С любой другой сцены можно будет вернуться на главную сцену. Опишем примерную последовательность шагов.

1. Подготовим сцены

На главной сцене у нас будет меню. Его можно создать из плоскостей, на которые наложить текстуры изображений с текстом или объект Text Блендера. В последнем случае Text следует преобразовать в меш-объект (Alt+C -> Mesh) и объединить с плоскостью (Ctrl+J).

Для добавления новых сцен, следует выбрать пункт ADD NEW в выпадающем списке окна пользовательских настроек (вверху) – посмотрите на первое изображение в данном уроке. При добавлении сцены предлагается список из четырех вариантов. Лучше выбрать Full Copy (чтобы не иметь головной боли с установкой камеры и лампы), а все лишние объекты потом удалить. Далее можно переименовать сцену.

Добавив вторую сцену, не будем спешить с добавлением других сцен. Пока разместим на второй сцене «кнопку» возврата на главную. Далее уже будем копировать эту сцену. В результате должна получиться примерно такая схема сцен как на рисунке ниже.

Схема сцен в Blender

2. Отобразим курсор мыши

Урок 5. Сенсор Mouse

3. Установим возможность перехода между сценами в режиме игры

См. второй рисунок в данном уроке. Каждая кнопка на главной сцене должна переключать на соответствующую ей сцену (one, two, three или four). Кнопка “main” на остальных сценах должна переключать игру на главную сцену.

Практическая работа

Создайте небольшую игру по следующему описанию.

Цель игры: прокатить шар до конца извилистой узкой поверхности.

Если шар падает с плоскости, то пользователь может нажать R и игра должна начаться сначала.

Настойка restart (перезапуска) игры в BGE

Если шар докатывается до конца плоскости, то следует переход на другую сцену с еще более изощренной дорожкой. Чтобы переход происходил «автоматически», можно поставить на конец поверхности объект Empty (пустышка) и добавить к нему сенсор Near, связанный с активатором Scene -> Set Scene.

Сенсор Near

Камера должна «следить» за шаром.

Желательно, чтобы игра состояла из трех игровых сцен и сцены «конец игры», которую может увидеть только игрок, прошедший все уровни.

Активатор Edit Object. Урок 8

Уроки по Blender Game Engine

Активатор Edit Object (редактирование объекта) позволяет изменять свойства конкретного объекта, а также изменять «меш-содержимое» 3D-сцены в режиме игры.

Add Object – добавить объект

Использование типа Add Object активатора Edit Object дает возможность в режиме игры добавлять на сцену новый меш-объект. На самом деле объект должен быть не новым, а “спрятанным” (обычно на другом слое). Новый объект добавляется в то место, где находится объект, к которому добавлен активатор Edit Object -> Add Object. Добавляемый объект (его имя) прописывается в качестве значения свойства OB.

Допустим, у нас есть плоскость, на которую планируется в процессе игры добавлять различные предметы при нажатии на различные клавиши, для указания места добавления используется специальная метка-точка (на рис. - кранным цветом), которую можно передвигать по плоскости в четырех направлениях.

Blender Game Engine, игровой режим

На самом деле двигается пустышка (Empty), которая является родителем по отношению к красной метке (Ctrl+P – связь родитель-потомок). Именно для объекта Empty также добавлены активаторы Edit Object. Конечно, можно привязать добавляемые объекты и к красной метке, однако появятся проблемы с их размером и др.

Активатор Edit Object - /> Add Object

Здесь происходит добавление объектов с именами white и black при нажатии клавиш W и B соответственно. Первые четыре блока сенсоров, контроллеров и активаторов отвечают за движение Empty.

У активатора Edit Object -> Add Object есть дополнительные настройки. Добавленные объекты будут исчезать через установленный промежуток времени, если Time не будет нулевым. Измеряется данное свойство не в секундах, а кадрах (обычно в секунде 25-30 кадров).

linV и angV позволяют придать объекту некоторое ускорение в момент появления. Движение может быть вдоль оси или вокруг оси (поворот). Работает только с физическими объектами.

End Object – удалить объект

Объект может быть удален в режиме игры. Часто это используется в комбинации с каким-либо другим активатором. Например, исчезновение объекта при столкновении с другим объектом.

Replace Mesh – замена меш-объекта

Этот тип активатора Edit Object представляет собой интересную возможность Blender Game Engine (однако, еще не до конца реализованную разработчиками). Например, можно создавать различные спецэффекты. Допустим, объект падает и при касании земли, последняя проминается (на самом деле будет происходить замена меша).

Активатор Edit Object - /> Track to

Track to – слежение

При добавлении этого типа активатора, объект будет поворачиваться по осям, «следя» за указанным в качестве OB объектом, при этом оставаясь на одном и том же месте. Например, камера может следить за каким-нибудь передвигающимся объектом на сцене, если сцена небольшая. Или интересные эффекты могут получаться, если при движении одного объекта, другой (с активатором Edit Object -> Track to), оставаясь на месте, будет поворачиваться.

Dynamics - динамика

Этот тип активатора Edit Object позволяет изменять физические свойства объекта. Однако объект должен изначально быть установлен как физический. Подтипы Suspend и Restore Dynamics, Disable и Enable Rigid Body включают и отключают соответственно влияние физики на объекты. Подтип Set Мass позволяет в режиме игры изменять массу объекта.

Например, у какого-нибудь Dynamic-объекта можно отключить его физические свойства, связав сенсор Always с активатором Edit Object -> Dynamics -> Suspend Dynamics. А в процессе игры включать физические свойства (Restore Dynamics), если случиться определенное событие.

Практическая работа

С помощью Blender Game Engine создайте небольшую игру по следующему описанию.

На одном краю плоскости, расположены небольшие кубики-мишени, являющиеся статическими объектами.

На другом крае плоскости расположен объект-пушка.

Добавить Empty и сделать ее родителем по отношению к пушке. Пустышка (вместе с пушкой) может двигаться в двух плоскостях: вдоль своего края и вверх-вниз. Сенсоры – стрелки на клавиатуре.

Из пушки (на самом деле – пустышки) вылетают пули в направлении мишеней. Для этого на другой слой поместить объект-пулю (физический объект). Привязать его к пушке при помощи активатора Edit Object -> Add Object. Придать ускорение в направлении мишеней (linV). Пульки должны исчезать примерно через 100-120 кадров (Time).

Мишени должны исчезать при касании их объектом-пулей (End Object).

Влияние параметра Grav на поведение объектов в Blender Game Engine. Урок 9

Игровой мир в Blender по умолчанию настроен таким образом, что поведение виртуальных физических объектов сходно с поведением их аналогов в реальном мире в условиях Земли. Однако в невесомости или на каком-нибудь другом космическом теле те же самые объекты будут вести себя по-другому. Все зависит от силы притяжения, вызываемой конкретным «миром» (космическим телом). Эта сила вызывает ускорение свободного падения, которое в Blender можно менять в окне кнопок на панели Shading -> World buttons: параметр Grav. Значение по умолчанию равно 9.8, что соответствует ускорению свободного падения в пределах Земли.

Параметр Grav в Blender

Если разместить на сцене плоскость, а над ней несколько предметов, то можно увидеть, как они будут падать (если параметр Grav не равен нулю, нулевое значение обозначает невесомость) и взаимодействовать между собой. Большое значение Grav приводит к тому, что объекты падают очень быстро, и для их перемещения с помощью силы (Force) требуется использовать большее значение, чем обычно.

Изменяя значение Grav, можно оценивать поведение объектов в различных условия. Например, установив ускорение свободного падения в значение 1.62, мы увидим, как ведут себя объекты в пределах Луны. Сразу станет очевидно, что взлет с Луны требует приложения меньшей силы по оси Z. Интересно также увидеть, как ведут себя объекты в условиях невесомости.

В режиме игры мы видим одну сцену и, следовательно, один «мир». Однако, может потребоваться наглядно сравнить поведение объектов в условиях разных «миров». Тогда нужно в режиме игры как-то отобразить как минимум две сцены. В Blender Game Engine есть некоторая реализация данной возможности. У активатора Scene есть два типа, позволяющие разместить другую сцену над или под текущей соответственно: Add Overlay Scene и Add Background Scene. То есть всего в режиме игры можно отобразить содержимое трех сцен.

Добавление сцен в Blender Game Engine

При этом следует учитывать, что добавленная сцена отобразиться так, как она выглядит из камеры на своей сцене. Объекты с разных сцен могут накладываться друг на друга (что не желательно). Поэтому заранее нужно размещать предметы так, чтобы итоговый вид в режиме игры был приемлемым.

Практическая работа

Примечание: предварительно лучше камеру развернуть параллельно оси X или Y.

  1. На сцену добавьте плоскость и несколько предметов над ней. Объекты должны быть типа Rigid body или Soft body, обладать разной массой. На объекты с помощью клавиш должно быть возможно влияние сил в различных направлениях. При виде из камеры все объекты должны находиться в нижней части сцены. Назовите данную сцену «earth».
  2. Создайте копию предыдущей сцены. Назовите ее «moon». Все объекты сместите в центральную часть сцены (при виде из камеры). Измените Grav на 1.62.
  3. Создайте вторую копию сцены – «space». Объекты сместите в верхнюю часть сцены, Grav обнулите (будет невесомость).
  4. Перейдите на сцену «moon» и выделите камеру. На панели Logic добавьте две сцены, используя соответствующие типы активатора Scene (см. рисунок выше).
  5. Запустите режим игры. Оцените поведение объектов под влиянием различных сил притяжения.
Три сцены в игровом режиме Blender

Материалы и текстуры в Blender Game Engine: работа с UV/Image Editor. Урок 10

вид сцены в игровом режиме Blender

При создании боле менее сложных сцен с использованием Blender Game Engine объекты могут состоять из нескольких частей, каждая из которых имеет свой цвет и текстуру. Для того чтобы добиться этого, можно пойти разными путями. Например, можно сначала смоделировать части объекта из различных меш-примитивов, наложить на них материалы и текстуры, а затем объединить их в единое целое (Ctrl+J). Но при этом обычно возникает один существенный недостаток – большое количество частей у меш-объекта (граней, ребер и вершин). Из-за этого при запуске игрового режима компьютер начинает тормозить. Чем меньше частей, тем быстрее. Поэтому, бывает лучше создать изображение с прорисованными на нем частями, а потом наложить этот рисунок на целый меш-объект. Или возможно, объект достаточно прост, но каждая его часть должна быть своего цвета.

Один из способов «экзотически раскрасить» объекты для отображения в режиме игры – это использование редактора UV/Image Editor, который открывается в соответствующем окне Blender. (3D-окно следует подразделить на две части и в одном выбрать окно UV/Image Editor.)

Окно UV/Image Editor

Примечания:

  1. При использовании материалов UV/Image Editor для объектов удаляйте у них материалы на панели Shading -> Material buttons (иначе в режиме игры будет отображаться именно этот материал).
  2. Текстуры видны, только если переключиться в режим прорисовки Textured.
Удаление материала в Blender

В окне UV/Image Editor можно 1) как создавать новые материалы, состоящие из одного цвета и/или дорисованные с помощью настроек панели Editing (вкладка Paint), 2) так и открывать готовые изображения. В основном предпочитают второй вариант.

Добавление текстуры в UV/Image Editor

После загрузки изображений они доступны в виде списка. Следует иметь в виду, что изображения по умолчанию не импортируются в файл .blend, а лишь связываются по ссылке. Чтобы картинки остались в файле «навечно», нужно для каждого рисунка в списке нажать кнопку с изображением коробки с сюрпризом.

Упаковка текстуры

Текущее изображение отображается в рабочей области окна. Если оно слишком большое или маленькое, то с помощью колеса мыши можно изменить масштаб. А зажав колесо мыши, перемещать изображение по рабочей области (т.е. работать почти так, как в 3D-окне).

Итак, у нас есть импортированные изображения и объекты на сцене, на которые требуется наложить эти изображения. Делается все в режиме редактирования объектов и при выделении граней. Текстура применяется только к выделенным граням. Таким образом, можно к одному объекту применить несколько текстур.

Понятно, что объекты по размеру и форме не совпадают с изображениями. Поэтому существуют различные способы наложения текстур. Выбор способа наложения происходит в меню UV Calculation, которое появляется при нажатии клавиши U в 3D-окне.

Наложение текстуры в режиме редактирования Blender

Если с первыми четырьмя способами наложения еще кое-как понятно, то остальные достаточно специфичны (за исключением Reset, который часто бывает полезен). Не смотря на возможность разного способа наложения, рисунки все равно не совпадают с объектом по размеру. Поэтому в окне UV/Image Editor предусмотрена возможность редактирования способа наложения так, как если бы вы редактировали меш-объект: можно перемещать сетку наложения по текстуре, масштабировать и изменять форму.

Рассмотрим несколько примеров.

Накладывание карты на сферу. В 3D-окне в режиме редактирования сферы выделить все грани; нажав U, выбрать Sphere from View. Перевести курсор мыши в окно UV/Image Editor. Растягивая (S по осям X, Y или Z) и перемещая сетку (G) добиться ее совпадения с картой.

Редактирование текстуры в UV/Image Editor

Накладывание разных текстур на один меш-объект. Зажав Shift, выделяем только те грани, на которые накладывается первая текстура, выбираем изображение и применяем тип наложения. Редактируем сетку наложения, если потребуется. Далее выделяем другие грани и накладываем другой материал. Если нужно просто раскрасить их в тот или иной цвет, то достаточно в окне UV/Image Editor выбрать New, подобрать в появившемся окне цвет, назвать материал, и, затем, выбрать его из списка.

Отображение текстуры на внутренней поверхности. Допустим, планируется разместить сцену игры внутри большой сферы. Чтобы наложить текстуру на внутреннюю поверхность сферы надо наложить ее сначала на внешнюю сторону, затем (не выходя из режима редактирования) на панели кнопок Editing найти вкладку Texture Face, включить там Twoside и затем нажать Copy (чтобы применить изменения).

Наложение текстуры на внутренюю поверхность граней

Практическая работа

Попрактикуйтесь в наложении материалов и текстур с помощью UV/Image Editor. В качестве среды для опытов можно использовать сохраненные файлы с предыдущих уроков по Blender Game Engine.