Понятие объекта в пространстве

Материал из Deeptown Manual
Перейти к: навигация, поиск

Содержание

Введение

Ключевым понятием в World Engine является Объект. Под этим понятием подразумевается некоторая атомарная сущность, которая может взаимодействовать с:

  • пространством
  • пользователем
  • другими объектами.

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

Представления объекта

Каждый объект может быть представлен в нескольких (а может быть не представлен ни в одном) из трех пространств: механическом, физическом и графическом. Все три представления связаны между собой, но важно понимать, что это — три разных представления.

В механическом пространстве, объект представляет собой одно или несколько твердых тел, каждое из которых характеризуется:

  • массой,
  • матрицей момента инерции,
  • координатами,
  • кватернионом вращения.

Обратите внимание, что в механическом пространстве отсутствует какая-либо информация о форме объекта.

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

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

Под примитивом здесь понимается один из нескольких геометрических примитивов: паралеллепипед, сфера, цилиндр и несколько других.

В графическом пространстве, объект представляет собой набор графических примитивов, таких как:

  • полигональные поверхностей с различными графическими свойствами (начиная от текстурирования и заканчивая шейдерами),
  • источники освещения,
  • камеры.

Графическая модель также связана с механическим или физическим представлением — т.е. движок автоматически изменяет положение графических примитивов в соответствии с перемещениями физических.

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

  1. Аватар. Имеет представления во всех трех пространствах. Является полноценным "физическим" объектом.
  2. Фаербол, эмиттеры частиц (дым, огонь и т. д) либо другие графические фокусы. Представляются в графическом пространстве.
  3. Поля сил как проявления заклинаний или обычного ветра. Представляются в физическом пространстве.

Данные объекта

Данные объекта хранятся в DISS файле в формате BXL. Объект также может зависеть от других файлов (скрипты, текстуры и др.), ссылки на которые приводятся в основном файле.

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

Все примеры приведены в формате XML; для конвертирования из XML в BXL существует утилита bxd — на данный момент она реализована на Perl. Для конвертирования объекта, наберите команду

bxd filename.model.xml -f filename.model

где filename.model.xml — имя файла с XML описанием.

Простейший физический объект

Рассмотрим пример файла, описывающего куб размером 1x1x1:

<source lang="xml" line="1"> <model bxd="http://dao.deeptown.org/bxd/model.bxd">

   <material_script node="/media/materials/cube.material" />
   <body name="cube">
       <geometry>
           <geom type="box" width="1" height="1" depth="1" />
       </geometry>
       <surfaces>
           <mesh name="cube" node="/media/meshes/cube_small.mesh" />
       </surfaces>
   </body>

</model> </source>

1-11
Все описание объекта заключено в тег model, у которого нет параметров (кроме стандартной ссылки на BXD-описание для корректного конвертирования в BXL);
2
Тег material_script указывает на путь к файлу описания материалов. Формат этого файла описан в документации OGRE. Важно отметить, что внутри этого файла, все ссылки на текстуры, шейдеры и пр. делаются также указанием DISS-пути к соответствующему файлу;
3
Тег body описывает твердое тело, которое становится частью нашего объекта. В рамках одного объекта таких тел может быть несколько — каждое из них будет описываться отдельным тегом body;
4
В рамках тега geometry содержится информация о геометрических примитивах, связанных с данным твердым телом, т.е. о его физическом представлении;
5
Куб в пространстве легко описывается примитивом box — паралеллепипедом с указанными шириной, высотой и глубиной (оси x, y и z соответственно). Обратите внимание, что по-умолчанию примитив находится в центре локальных координат данного твердого тела. Сместить его можно тегом position, следующим образом:

<source lang="xml">

   <geom type="box" width="1" height="1" depth="1">
       <position x="1" y="0" z="0" />
   </geom>

</source>

Такая конструкция сместила бы примитив на 1 (метр) по оси X относительно локальных координат твердого тела. Аналогично, тегом rotation с параметрами qw, qx, qy и qz можно задать кватернион вращения данного примитива относительно локальной системы координат.
7-9
В рамках тега surfaces задаются графические примитивы, связанные с объектом. В нашем случае такой примитив только один: тег node указывает имя файла с графическим описанием куба в формате OGRE Mesh (конвертеры в этот формат можно скачать с официального сайта OGRE, там также имеется набор инструментов для создания графического контента).

Еще раз обращаю Ваше внимание на то, что физическая и графическая модели объекта хоть и связаны, но разделены. Например, если бы мы в теге geometry указали бы в качестве примитива не куб, а шар, — данный объект все равно выглядел бы кубом (потому что графическое представление мы бы не поменяли), но вел бы себя с точки зрения физики как шар (мог бы покатиться по земле, например).

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

Более сложный пример

Вот пример более сложной модели куба:

<source lang="xml" line="1"> <model bxd="http://dao.deeptown.org/bxd/model.bxd">

   <material_script node="/media/materials/cube.material" />
   <body name="cube">
       <mass_data>
           <mass value="1" />
       </mass_data>
       <geometry>
           <geom type="box" width="1" height="1" depth="1" />
       </geometry>
       <surfaces>
           <mesh name="cube" node="/media/meshes/cube_small.mesh" />
       </surfaces>
   </body>
   <externals>
       <event_receiver url="gide:/media/scripts/cube_small_dynamic.gbc!CubeSmallDynamic" />
   </externals>

</model> </source>

Рассмотрим теги, которые были добавлены в этот файл:

4-6
Тег mass_data определяет механическое представление тела. В нем можно задать массу (тег mass) и матрицу инерции (не указанный здесь тег inertia), которая по-умолчанию является единичной матрицой.
14-16
В теге externals приводятся дополнительные данные объекта. В данном случае, это тег event_receiver, который определяет обработчик события.

Обработчик события, как и многое другое, задается при помощи URL. Под URL всегда понимается некоторая строка, включающая в себя тип сущности (в данном случае — обработчика) и адрес этой сущности, который зависит от ее типа. Тип и адрес разделены двоеточием.

Единственный на данный момент реализованный обработчик событий имеет тип gide. Этот обработчик передает все события некоторому объекту Gide-класса. В адресе указано имя файла скрипта (в DISS) и имя класса, разделенные символом "!".

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
информация
документация
Инструменты