Понятие объекта в пространстве — различия между версиями

Материал из Deeptown Manual
Перейти к: навигация, поиск
Строка 1: Строка 1:
 
== Введение ==
 
== Введение ==
  
Ключевым понятием в World Engine является Объект. Под этим понятием подразумевается некоторая атомарная сущность, которая может взаимодействовать с
+
Ключевым понятием в World Engine является Объект. Под этим понятием подразумевается некоторая атомарная сущность, которая может взаимодействовать с:
 
* пространством
 
* пространством
 
* пользователем
 
* пользователем
 
* другими объектами.
 
* другими объектами.
  
Понятие объекта, в общем случае, шире, чем некоторое физическое тело в виртуальном пространстве. Объект может даже не обладать координатами в пространстве: весь его смысл в этом случае заключается во взаимодействии, которое не обязано быть физическим. Большая часть объектов, тем не менее - это именно объекты виртуального пространства.
+
Понятие объекта, в общем случае, шире, чем некоторое физическое тело в виртуальном пространстве. Объект может даже не обладать координатами в пространстве: весь его смысл в этом случае заключается во взаимодействии, которое не обязано быть физическим. Тем не менее, большая часть объектов — это именно объекты виртуального пространства.
  
 
== Представления объекта ==
 
== Представления объекта ==
  
Каждый объект может быть представлен в нескольких (а может быть не представлен ни в одном) из трех пространств: механическом, физическом и графическом. Все три представления связаны между собой, но важно понимать, что это - три '''разных''' представления.
+
Каждый объект может быть представлен в нескольких (а может быть не представлен ни в одном) из трех пространств: механическом, физическом и графическом. Все три представления связаны между собой, но важно понимать, что это три '''разных''' представления.
  
В '''механическом''' пространстве объект представляет собой одно или несколько твердых тел, каждое из которых характеризуется:
+
В '''механическом''' пространстве, объект представляет собой одно или несколько твердых тел, каждое из которых характеризуется:
 
* массой,
 
* массой,
 
* матрицой момента инерции,
 
* матрицой момента инерции,
Строка 20: Строка 20:
 
Обратите внимание, что в механическом пространстве '''отсутствует''' какая-либо информация о '''форме''' объекта.
 
Обратите внимание, что в механическом пространстве '''отсутствует''' какая-либо информация о '''форме''' объекта.
  
Если таких тел несколько, они могут быть связаны между собой '''суставами'''. Сустав определяет некоторые условия, по которым перемещение одного тела влечет перемещение другого. Существует несколько различных типов суставов, они будут рассмотрены далее.
+
Если таких тел несколько, они могут быть связаны между собой '''суставами'''. Сустав определяет некоторые условия, по которым перемещение одного тела влечет перемещение другого. Существует несколько различных типов суставов, они будут рассмотрены ниже.
  
В '''физическом''' пространстве вводится понятие формы. Объект здесь представлен набором примитивов, объединенных в группы. Каждая из групп примитивов либо связана с одним из твердых тел механического представления (так, что перемещение этого тела в механическом пространстве влечет перемещение соответствующей группы примитивов в физическом), либо ни с чем не связана (такая группа примитивов всегда находится на одном месте - например, это может быть земля, деревья, дома и т.д).
+
В '''физическом''' пространстве вводится понятие формы. Объект здесь представлен набором примитивов, объединенных в группы. Каждая из групп примитивов либо связана с одним из твердых тел механического представления (так, что перемещение этого тела в механическом пространстве влечет перемещение соответствующей группы примитивов в физическом), либо ни с чем не связана (такая группа примитивов всегда находится на одном месте: земля, деревья, дома и т.д).
  
 
Под примитивом здесь понимается один из нескольких геометрических примитивов: паралеллепипед, сфера, цилиндр и несколько других.
 
Под примитивом здесь понимается один из нескольких геометрических примитивов: паралеллепипед, сфера, цилиндр и несколько других.
  
В '''графическом''' пространстве, объект представляет собой набор графических примитивов, как то
+
В '''графическом''' пространстве, объект представляет собой набор графических примитивов, таких как:
* полигональных поверхностей с различными графическими свойствами (начиная от текстурирования и заканчивая шейдерами),
+
* полигональные поверхностеи с различными графическими свойствами (начиная от текстурирования и заканчивая шейдерами),
* источников освещения,
+
* источники освещения,
* камер.
+
* камеры.
Графическая модель также связана с механическим или физическим представлением - т.е. движок автоматически изменяет положение графических примитивов в соответствии с перемещениями физических.
+
Графическая модель также связана с механическим или физическим представлением т.е. движок автоматически изменяет положение графических примитивов в соответствии с перемещениями физических.
 +
 
 +
Как уже было отмечено выше, объект может быть представлен как во всех трех представлениях, так и не иметь одного или нескольких представлений. Рассмотрим примеры объектов и проанализируем, какие представления они имеют.
 +
 
 +
# ''Аватар''. Имеет представления во всех трех пространствах. Является полноценным "физическим" объектом.
 +
# ''Фаербол'', эмиттеры частиц (дым, огонь и т. д) либо другие графические фокусы. Представляются в графическом пространстве.
 +
# ''Поля сил'' как проявления заклинаний или обычного ветра. Представляются в физическом пространстве.
  
 
== Данные объекта ==
 
== Данные объекта ==
  
Данные объекта хранятся в файле DISS в формате BXL. Объект также может зависеть от других файлов (скрипты, текстуры и др.), ссылки на которые приведены в основном файле.
+
Данные объекта хранятся в [[DISS]] файле в формате [[BXL]]. Объект также может зависеть от других файлов (скрипты, текстуры и др.), ссылки на которые приводятся в основном файле.
  
Полный набор свойств объекта, которые можно задать в его файле, достаточно обширен, поэтому сейчас я не буду приводить его полностью - когда этот формат будет окончательно утвержден, будет и документация по нему. В этом разделе я приведу несколько примеров простых объектов с описанием, а в последующих разделах буду приводить информацию о других тегах, если это потребуется.
+
Полный набор свойств объекта, которые можно задать в его файле, достаточно обширен, поэтому сейчас я не буду приводить его полностью когда этот формат будет окончательно утвержден, будет и документация по нему. В этом разделе я приведу несколько примеров простых объектов с описанием, а в последующих разделах буду приводить информацию о других тегах, если это потребуется.
  
Все примеры приведены в формате XML; для конвертирования из XML в BXL существует утилита bxd - на данный момент она реализована на Perl. Для конвертирования объекта, наберите команду
+
Все примеры приведены в формате XML; для конвертирования из XML в BXL существует утилита bxd на данный момент она реализована на Perl. Для конвертирования объекта, наберите команду
 
  bxd filename.model.xml -f filename.model
 
  bxd filename.model.xml -f filename.model
где filename.model.xml - имя файла с XML описанием.
+
где filename.model.xml имя файла с XML описанием.
  
 
=== Простейший физический объект ===
 
=== Простейший физический объект ===
Строка 62: Строка 68:
 
;1-11:Все описание объекта заключено в тег '''model''', у которого нет параметров (кроме стандартной ссылки на BXD-описание для корректного конвертирования в BXL);
 
;1-11:Все описание объекта заключено в тег '''model''', у которого нет параметров (кроме стандартной ссылки на BXD-описание для корректного конвертирования в BXL);
 
;2:Тег '''material_script''' указывает на путь к файлу описания материалов. Формат этого файла описан в [http://www.ogre3d.org/docs/manual/manual_14.html документации OGRE]. Важно отметить, что внутри этого файла, все ссылки на текстуры, шейдеры и пр. делаются также указанием DISS-пути к соответствующему файлу;
 
;2:Тег '''material_script''' указывает на путь к файлу описания материалов. Формат этого файла описан в [http://www.ogre3d.org/docs/manual/manual_14.html документации OGRE]. Важно отметить, что внутри этого файла, все ссылки на текстуры, шейдеры и пр. делаются также указанием DISS-пути к соответствующему файлу;
;3:Тег '''body''' описывает '''твердое тело''', которое становится частью нашего объекта. В рамках одного объекта таких тел может быть несколько - каждое из них будет описываться отдельным тегом body;
+
;3:Тег '''body''' описывает '''твердое тело''', которое становится частью нашего объекта. В рамках одного объекта таких тел может быть несколько каждое из них будет описываться отдельным тегом body;
 
;4:В рамках тега '''geometry''' содержится информация о геометрических примитивах, связанных с данным твердым телом, т.е. о его физическом представлении;
 
;4:В рамках тега '''geometry''' содержится информация о геометрических примитивах, связанных с данным твердым телом, т.е. о его физическом представлении;
;5:Куб в пространстве легко описывается примитивом '''box''' - паралеллепипедом с указанными шириной, высотой и глубиной (оси x, y и z соответственно). Обратите внимание, что по-умолчанию примитив находится в центре локальных координат данного твердого тела. Сместить его можно тегом '''position''', следующим образом:
+
;5:Куб в пространстве легко описывается примитивом '''box''' паралеллепипедом с указанными шириной, высотой и глубиной (оси x, y и z соответственно). Обратите внимание, что по-умолчанию примитив находится в центре локальных координат данного твердого тела. Сместить его можно тегом '''position''', следующим образом:
<sorce lang="xml">
+
<source lang="xml">
 
     <geom type="box" width="1" height="1" depth="1">
 
     <geom type="box" width="1" height="1" depth="1">
 
         <position x="1" y="0" z="0" />
 
         <position x="1" y="0" z="0" />
Строка 73: Строка 79:
 
;7-9:В рамках тега '''surfaces''' задаются графические примитивы, связанные с объектом. В нашем случае такой примитив только один: тег '''node''' указывает имя файла с графическим описанием куба в формате OGRE Mesh (конвертеры в этот формат можно скачать с [http://www.ogre3d.org официального сайта OGRE]).
 
;7-9:В рамках тега '''surfaces''' задаются графические примитивы, связанные с объектом. В нашем случае такой примитив только один: тег '''node''' указывает имя файла с графическим описанием куба в формате OGRE Mesh (конвертеры в этот формат можно скачать с [http://www.ogre3d.org официального сайта OGRE]).
  
Еще раз обращаю Ваше внимание на то, что физическая и графическая модели объекта хоть и связаны, но разделены. Например, если бы мы в теге geometry указали бы в качестве примитива не куб, а шар, - данный объект все равно выглядел бы кубом (потому что графическое представление мы бы не поменяли), но вел бы себя с точки зрения физики как шар (мог бы покатиться по земле, например).
+
Еще раз обращаю Ваше внимание на то, что физическая и графическая модели объекта хоть и связаны, но разделены. Например, если бы мы в теге geometry указали бы в качестве примитива не куб, а шар, данный объект все равно выглядел бы кубом (потому что графическое представление мы бы не поменяли), но вел бы себя с точки зрения физики как шар (мог бы покатиться по земле, например).
  
 
И еще один важный момент. Поскольку в данном описании нигде не указаны механические параметры куба, в механическом пространстве этот куб не представлен. Таким образом, он всегда будет статичен в пространстве и не сможет сдвинуться с места (если только его не сдвинуть скриптом).
 
И еще один важный момент. Поскольку в данном описании нигде не указаны механические параметры куба, в механическом пространстве этот куб не представлен. Таким образом, он всегда будет статичен в пространстве и не сможет сдвинуться с места (если только его не сдвинуть скриптом).
Строка 105: Строка 111:
 
;14-16:В теге '''externals''' приводятся дополнительные данные объекта. В данном случае, это тег '''event_receiver''', который определяет обработчик события.
 
;14-16:В теге '''externals''' приводятся дополнительные данные объекта. В данном случае, это тег '''event_receiver''', который определяет обработчик события.
  
Обработчик события, как и многое другое, задается при помощи URL. Под URL всегда понимается некоторая строка, включающая в себя тип сущности (в данном случае - обработчика) и адрес этой сущности, который зависит от ее типа. Тип и адрес разделены двоеточием.
+
Обработчик события, как и многое другое, задается при помощи URL. Под URL всегда понимается некоторая строка, включающая в себя тип сущности (в данном случае обработчика) и адрес этой сущности, который зависит от ее типа. Тип и адрес разделены двоеточием.
  
 
Единственный на данный момент реализованный обработчик событий имеет тип gide. Этот обработчик передает все события некоторому объекту Gide-класса. В адресе указано имя файла скрипта (в DISS) и имя класса, разделенные символом "!".
 
Единственный на данный момент реализованный обработчик событий имеет тип gide. Этот обработчик передает все события некоторому объекту Gide-класса. В адресе указано имя файла скрипта (в DISS) и имя класса, разделенные символом "!".

Версия 11:56, 7 декабря 2007

Содержание

Введение

Ключевым понятием в 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) и имя класса, разделенные символом "!".

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

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