Анимация моделей
Материал из FlightGear
Реальный мир полон движения. Чтобы внести это в FlightGear, модель должна быть анимирована.
Этот документ предоставляет основную информацию о всех видах анимации. Для более полного понимания, посмотрите доступные самолёты в качестве примеров.
Содержание |
Заметка, относительно порядка анимаций
Анимация выполняется в FlightGear в порядке, определяемом очередностью чтения из файла .xml модели. Следовательно, вы должны быть очень внимательны к этому порядку, особенно, при наличии множественных анимаций, применяемых к объектам.
Специальные части кода
Axis
Блок <axis> применяется в любой анимации, имеющей целью вращение или перемещение.
<axis> <x>0</x> <y>1</y> <z>0</z> </axis>
Оси схожи с осями 3D-модели. Есть пара отличий между вращением и перемещением.
- В анимации вращения ось указывает, вокруг какой точки вращается объект. Положительные/отрицательные занчения заставляют объект вращаться против/по часовой стрелке соответственно.
- В анимации перемещения эта часть указывает, относительно каких осей будет перемещаться объект. Если ось Х будет осчитываться в сторону уменьшения, то указание -Х в этой части файла заставит объект перемещаться вперед.
Вы можете также указать две точки, через которые FlightGear вычислит корректную ось. Применение этого тега сделает неработоспособным и излишним тэг <center>. Такой способ указания координат чрезвычайно полезен для анимации управляющих поверхностей (руль высоты, элероны и т.д.).
<axis> <x1-m> 4.9</x1-m> <y1-m> 7.1</y1-m> <z1-m>-1.0</z1-m> <x2-m> 5.9</x2-m> <y2-m>11.2</y2-m> <z2-m>-0.5</z2-m> </axis>
Center
Многие анимации (к примеру, rotate, spin) движутся вокруг центральной точки.
<center> <x-m>-1.50</x-m> <y-m> 1 </y-m> <z-m> 0.25</z-m> </center>
Так как оси соответствуют таковым в 3D-модели, координаты точки вращения можно легко найти прямо в 3D-редакторе.
Conditions
Во многих анимациях можно применять сравнения.
- equals: - значение свойства равно значению другого свойства или переменной.
- greater-than: - значение свойства больше, чем значение другого свойства или переменной.
- greater-than-equals:- значение свойства больше, либо равно значению другого свойства или переменной.
- less-than: - значение свойства меньше, чем значение другого свойства или переменной.
- less-than-equals: - значение свойства меньше, либо равно значению другого свойства или переменной.
В примере ниже условие верно, если n1 имеет значение больше 25.
<condition> <greater-than> <property>engines/engine[1]/n1</property> <value>25</value> </greater-than> </condition>
Также, здесь можно использовать специальные теги:
- and:
- not:
- or:
В примере ниже условие верно, когда n1 больше 25% или равно 0%.
<condition>
<or>
<greater-than>
<property>engines/engine[1]/n1</property>
<value>25</value>
</greater-than>
<equals>
<property>engines/engine[1]/n1</property>
<value>0</value>
</equals>
<or>
</condition>
Пример реализации выглядит так:
<animation> <object-name>Object</object-name> <type>rotate</type> <property>suface-positions/left-aileron-pos-norm</property> <factor>25</factor> <condition> <greater-than> <property>suface-positions/left-aileron-pos-norm</property> <value>10</value> </greater-than> </condition> <center> <x-m>-1.50</x-m> <y-m> 1 </y-m> <z-m> 0.25</z-m> </center> <axis> <x>0</x> <y>1</y> <z>0</z> </axis> </animation>
Interpolation
При изменяющихся коэффициентах можно создать таблицу интерполяции.
<interpolation> <entry> <ind> 0.0</ind> <dep> 0.0</dep> </entry> <entry> <ind> 0.667</ind> <dep> 0.0</dep> </entry> <entry> <ind> 1.0</ind> <dep> 0.5</dep> </entry> </interpolation>
Строки выше представляют собой следующую таблицу:
| Input | Output |
|---|---|
| 0.0 | 0.0 |
| 0.667 | 0.0 |
| 1.0 | 0.5 |
Вы можете добавить столько вхождений, сколько пожелаете. Интерполяции часто применяются для анимации шасси (к примеру, створки шасси открываются при начале перемещения шасси и закрываются, когда шасси полностью выпущены или убраны).
Name
В имени анимации вы можете группировать несколько объектов.
<animation> <name>Collection1</name> <object-name>Object1</object-name> <object-name>Object2</object-name> <object-name>Object3</object-name> </animation>
В примере выше создаётся виртуальный объект с именем Collection1. В дальнейшем, вы можете анимировать эту группу объектов, используя:
<object-name>Collection1</object-name>
Object-name
Эти имена прописаны в 3D-модели. Каждый объект в модели имеет уникальное имя, для простоты рекомендуется давать объектам понятные имена (к примеру, LeftElevator, Rudder). Анимация будет применена только к тем объектам, которые указаны в строчках object-name (один объект на строку!). Анимация без указания объектов будет действовать на всю модель.
Типы анимаций
Alpha-test
<animation> <type>alpha-test</type> <object-name>Object</object-name> <alpha-factor>0.01</alpha-factor> </animation>
Billboard
Эти объекты будут всегда повёрнуты одной стороной к наблюдателю. Часто используется в 2D-объектах, таких как облака, деревья или огни.
<animation> <type>billboard</type> <object-name>Object</object-name> <spherical type="bool">true</spherical> </animation>
- spherical:
Dist-scale
Меняет размер объекта в зависимости от расстояния до наблюдателя.
<animation> <type>dist-scale</type> <object-name>Object</object-name> <interpolation> <entry> <ind>0</ind> <dep>1</dep> </entry> <entry> <ind>300</ind> <dep>4</dep> </entry> <entry> <ind>1500</ind> <dep>8</dep> </entry> </interpolation> </animation>
Enable-hot
Объекты сценариев в FlightGear автоматически отпределяются как "твёрдые тела", что означает, что самолёты могут ехать по ним или сталкиваться. Для некоторых объектов (таких как знаки, лучи маяка) это может быть нежелательно. "Твёрдость" можно отключить при помощи следующей анимации:
<animation> <object-name>Object</object-name> <enable-hot type="bool">false</enable-hot> </animation>
- enable-hot: может быть истиной или ложью (true или false). Напоминаем, что объекты являются "твёрдыми" по-умолчанию, если вам не требуется изменять этот параметр, вы можете смело пропускать эту анимацию.
Flash
<animation> <type>flash</type> <object-name>Object</object-name> <offset>0.0</offset> <factor>1.0</factor> <power>2</power> <two-sides type="bool">false</two-sides> <min>0.0</min> <max>1.0</max> <center> <x-m>0.0</x-m> <y-m>0.0</y-m> <z-m>0.0</z-m> </center> <axis> <x>0.0</x> <y>-1</y> <z>0.1</z> </axis> </animation>
- offset:
- factor:
- power:
- two-sides:
- min:
- max:
Interactions
<animation> <type>interaction</type> <object-name>Object</object-name> <interaction-type>carrier-wire</interaction-type> </animation>
- interaction-type: может иметь следующие значения:
- carrier-catapult: - стартовая катапульта для самолётов
- carrier-wire: - трос-аэрофинишёр. Примеры использования данных анимаций можно посмотреть в реализациях авианосцев.
Material
Этот тип анимации может быть использован разными способами.
Смена ливрей
Используется для смены ливрей через меню.
<animation> <type>material</type> <object-name>Object</object-name> <property-base>sim/model/livery</property-base> <texture-prop>engine</texture-prop> <texture>KLM.png</texture> </animation>
Подсветка
<animation> <type>material</type> <object-name>Object</object-name> <emission> <red>1.0</red> <green>0.2</green> <blue>0.0</blue> <factor-prop>controls/lighting/panel-norm</factor-prop> </emission> </animation>
Цвета эмисси умножаются на значение <factor-prop>. 1 - максимальная интенсивность цвета, 0 - минимальная. Цвета вычисляются согласно цветовой модели RGB.
Noshadow
<animation> <type>noshadow</type> <object-name>Object</object-name> </animation>
Pick
Range
Используется, чтобы предотвратить отрисовку объектов (типа приборов), которые будут слишком мелкими с позиции наблюдателя.
<animation> <type>range</type> <min-m>0</min-m> <max-m>30</max-m> </animation>
Вы также можете использовать дефолтные свойства уровня детализации (LOD), которые могут быть установлены в меню View > Adjust LOD rangers:
- /sim/rendering/static-lod/bare - расстояние, на котором должна быть видна только внешняя визуальная модель.
- /sim/rendering/static-lod/rough - расстояние, на котором долно быть видно большую часть деталей.
- /sim/rendering/static-lod/detailed - расстояние, на котором должно быть видно всё до мелочей.
Код анимации будет выглядеть как-то так:
<animation> <type>range</type> <min-m>0</min-m> <max-property>sim/rendering/static-lod/bare</max-property> </animation>
Вы можете использовать оба расстояния (max и min) внутри свойства, или только одно из них.
- min-property:
- max-property:
Rotate
Один из наиболее важных и часто применяющихся типов анимации. Поворачивает объект относительно определённого центра на величину в градусах, указанную в переменной.
<animation> <object-name>Object</object-name> <type>rotate</type> <property>suface-positions/left-aileron-pos-norm</property> <factor>25</factor> <center> <x-m>-1.50</x-m> <y-m> 1 </y-m> <z-m> 0.25</z-m> </center> <axis> <x>0</x> <y>1</y> <z>0</z> </axis> </animation>
- factor: необязателен.
Scale
Данная анимация масштабирует (изменяет размер) объекта.
<animation> <type>scale</type> <object-name>Object</object-name> <property>sim/time/sun-angle-rad</property> <x-min>1.0</x-min> <y-min>1.0</y-min> <z-min>1.0</z-min> <x-factor>1.4</x-factor> <y-factor>1.4</y-factor> <z-factor>2.0</z-factor> </animation>
- ?-min: минимальный коэффициент масштабирования для каждой оси. Если коэффициент масштабирования объекта станет меньше этого, анимация будет остановлена.
- ?-factor: коэффициент масштабирования для каждой оси (factor*property=масштаб).
Select
Эта анимация выбирает (или отменяет выбор) объектов, в зависимости от выполнения заданных условий. Пример ниже покажет объект, когда значение n1 у переменной engine[1] больше 25%.
<animation> <object-name>Object</object-name> <type>select</type> <condition> <greater-than> <property>engines/engine[0]/n1</property> <value>25</value> </greater-than> </condition> </animation>
Shader
<animation> <type>shader</type> <shader>chrome</shader> <texture>chrome2.png</texture> <object-name>Object</object-name> </animation>
- shader: - тип шейдера.
- texture: - путь к текстуре, используемой шейдером.
Spin
Очень похожа на анимацию rotate, но значение переменной отвечает за количество оборотов, а не позицию в градусах.
<animation> <object-name>Object</object-name> <type>spin</type> <property>engines/engine[0]/n1</property> <factor>25</factor> <center> <x-m>-1.50</x-m> <y-m> 1 </y-m> <z-m> 0.25</z-m> </center> <axis> <x>0</x> <y>1</y> <z>0</z> </axis> </animation>
- factor: не обязателен.
Textranslate
Очень полезная анимация для кокпитов! Эта анимация двигает текстуру по поверхности.
<animation> <type>textranslate</type> <object-name>Object</object-name> <property>autopilot/settings/target-speed-kt</property> <factor>0.001</factor> <step>100</step> <axis> <x>0</x> <y>1</y> <z>0</z> </axis> </animation>
- factor:
- step:
property * factor * step * texture width/height = количеству пикселей, на которое должна быть передвинута текстура. Если размер вашей текстуры равен 256 пикселей, то сдвиг на 0.1 передвинет текстуру на 26 пикселей.
Timed
Меняет объекты с заданным интервалом. В примере выполняется переключение между моделями с включенным и выключенным светом. Свет включается на 0.2 секунды и гаснет на 0.8.
<animation> <type>timed</type> <object-name>BacklightOn</object-name> <object-name>BacklightOff</object-name> <use-personality type="bool">true</use-personality> <branch-duration-sec>0.8</branch-duration-sec> <branch-duration-sec>0.2</branch-duration-sec> </animation>
Translate
То же, что и textranslate, но анимация передвинет сам объект (вместе с его текстурой). В анимации ниже объект будет передвинут на 5 метров по оси y.
<animation> <type>translate</type> <object-name>Object</object-name> <property>controls/seat/pilot/position-norm</property> <factor>5</factor> <axis> <x>0</x> <y>1</y> <z>0</z> </axis> </animation>