Model-HOWTO

Материал из FlightGear.ru.

Перейти к: навигация, поиск

Содержание


Анимация модели

Теперь самая интересная часть.

FlightGear позволяет анимировать части модели, заставив их вращаться или крутиться в ответ на изменения свойства: например, пропеллеры могут вращаться, когда двигатели запущены, или рули высоты могут двигаться вверх и вниз при движении контроллера. Нет никакого установленного предела тому, какие части могут быть анимированы: единственные требования - часть должна быть названа в 3D-файле и в дереве свойств должно быть свойство, которое вы можете использовать для получения информации о позиционировании.

В настоящее время определены следующие типы анимации:

  • none
  • billboard
  • rotate
  • scale
  • blend
  • select
  • spin
  • timed
  • translate
  • texrotate
  • textranslate
  • textmultiple
  • material
  • range
  • alpha-test
  • noshadow
  • dist-scale
  • flash

В основном используются комбинации spin, rotate и translate, чтобы анимировать основные объекты для большинства самолетов стандартной конфигурации. Spin вращает объект вокруг оси с определенной скоростью вращения, не заботясь о точной позиции. Rotate вращает объект вокруг оси в определенную позицию.

Каждая анимация описывается внутри элемента animation и включает свойство type и хотя бы одно свойство object-name:

<animation>
 <type>rotate</type>
 <object-name>Rudder</object-name>
</animation>

Разрешается опустить тэг type, при этом будет создана анимация none, которая применяется для группировки частей модели под каким-либо именем, которое можно применить в анимации далее. Группировка объектов в анимации, с типом или без, имеет эффект перераспределения объектов, указанных в теге object-name. Правило этого заключается в том, что группа вставляется между первым объектом и его родителем, после чего последующие объекты отсоединяются от своих родителей и вставляются в новую группу.

Анимация none также может применяться для перестановки элементов в имеющихся группах. Когда элементы являются прозрачными, они должны быть вынесены на передний план, чтобы через них можно было увидеть другие элементы. Но порядок расстановки при моделировании часто отличается от порядка в выходном файле, и этим зачастую очень трудно управлять в программе моделирования. Данным способом можно проигнорировать расстановку объектов, сделанную в программе моделирования, и переупорядочить объекты при загрузке. Принцип упорядочения - последовательно, в том порядке, в котором объекты описаны в теге object-name. Имейте в виду, что порядок может быть изменен последующими анимациями (последующиеанимации имеют более высокий приоритет, чем предыдущие).

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

<animation>
 <type>rotate</type>
 <object-name>LeftElevator</object-name>
 <object-name>RightElevator</object-name>
</animation>

Получившаяся ветвь будет считаться твёрдым телом при расчете высоты над препятствием (Height Over Terrain, HOT). Если объект является моделью пучка света, или каким либо иным нетвердым артефактом, было бы интересно проигнорировать детектором столкновений его взаимодействие с землёй. Для этого надо вставить

<enable-hot type="boolean">false</enable-hot>

в описание анимации. По умолчанию, enable-hot является true, и позволяет приземляться на крыши зданий.

Каждая анимация должна быть связана только с одним свойством из дерева свойств, чтобы зделать это используйте тэг property с именем свойства:

<animation>
 <type>rotate</type>
 <object-name>Rudder</object-name>
 <property>/controls/rudder</property> 
</animation>

Этот пример вращает руль согласно значению свойства /controls/rudder (или, по крайней мере, будет это делать, когда мы определим центр и ось вращения). Однако, переменная свойства /controls/rudder является нормализованным значением в диаппазоне от -1 до 1. Как же быть, если мы хотим вращать руль на большее значение? Для этого надо использовать тэг factor. В приведенном ниже примере мы используем тег factor со значением 18, что пропорционально увеличивает угол поворота от -18 до 18 градусов:

<animation>
 <type>rotate</type>
 <object-name>Rudder</object-name>
 <property>/controls/rudder</property>
 <factor>18</factor>
</animation>

Если вы хотите сменить направление вращения, вы должны установить для тэга factor значение -18.

Существует также тег offset-deg, полезный, если вы хотите сместить точку начала поворота, к примеру, чтобы руль был смещен на 1% влево от мёртвой точки, вы можете написать:

<animation>
 <type>rotate</type>
 <object-name>Rudder</object-name>
 <property>/controls/rudder</property>
 <offset-deg>-0.01</offset-deg>
 <factor>18</factor>
</animation>

Смещение будет применено после фактора.

Наконец, есть теги min и max, которые могут ограничить диапазон вращения в градусах, как в этом (очень сложном) примере шасси Cessna 310:

<animation>
 <type>rotate</type>
 <object-name>NoseWheel</object-name>
 <property>/gear/gear[0]/position-norm</property>
 <factor>120</factor>
 <offset-deg>-1</offset-deg>
 <min>-90</min>
 <max>0</max>
 <center>
   <x-m>-2.28</x-m>
   <y-m>0.0</y-m>
   <z-m>-0.65</z-m>
 </center>
 <axis>
  <x>0</x>
  <y>1</y>
  <z>0</z>
 </axis>
</animation>

В данном примере, позиция шасси (от 0.0 полностью убранного, до 1.0 полностью выпущенного) умножается на фактор 120 и на смещение -1 и ограничивается диапазоном от -90 до 0. В 3D-модели шасси выпушено по-умолчанию, таким образом, мы имеем следующие вращения в диаппазоне изменеия свойства шасси:

position-norm + offset -1 * factor 120 ограничение min/max -90:0 комментарий
0.0-1.0-120.0-90.0полностью убраны
0.25-0.75-90.0-90.0всё ещё убраны
0.5-0.5-60.0-50.01/3 выпуска
0.75-0.25-30.0-30.02/3 выпуска
1.00.00.00.0полностью выпущены (по-умолчанию)

Шасси не двигаются в первую 1/4 времени изменения значения position-norm, давая возможность открыться створкам шасси, реализованным в другой анимации. Очевидно, что это было бы намного проще сделать, имея интерполяцию.

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

<interpolation>
  <entry>
   <ind>0</ind>
   <dep>0</dep>
  </entry>
  <entry>
   <ind>16.67</ind>
   <dep>60</dep>
  </entry>
  <entry>
   <ind>25</ind>
   <dep>65</dep>
  </entry>
  <entry>
   <ind>33.3333</ind>
   <dep>70</dep>
  </entry>
  <entry>
   <ind>66.6667</ind>
   <dep>71</dep>
  </entry>
  <entry>
   <ind>100</ind>
   <dep>75</dep>
  </entry>
 </interpolation>

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

Теперь необходимо определить ось вращения для объекта, его "виртуальные петли". Это часто самая сложная часть, требущая большого количества проб, особенно, когда ось вращения не параллельна осям X, Y или Z (вспомните об элеронах стреловидного крыла). Вы должны обеспечить две группы информации: координаты точки, через которую проходит ось вращения, и вектор направления оси.

Внимание: теперь существует альтернативный способ указания оси вращения, облегчающий жизнь аниматоров. Он будет показан после примеров анимации Cessna 172.

Личные инструменты