Howto:Animate models: Difference between revisions

From FlightGear wiki
Jump to navigation Jump to search
mNo edit summary
(40 intermediate revisions by 13 users not shown)
Line 1: Line 1:
The real world is full of motion. To simulate this in [[FlightGear]], '''models must be animated'''.
The real world is full of motion. To simulate this in [[FlightGear]], '''models must be animated'''.


This document provides basic information for all kind of animations. For more complex animations, you are advised to check the available [[aircraft]] for examples.
FlightGear allows you to animate models in response to property changes: for example, the propellers can spin when the engine is on and the elevators can move up and down with your controller. There is no fixed limit on what parts can be animated: the only requirements are that the part is named in the 3D model file, and that there is a property in the main tree that you can use to get the positioning information.  


==A note about animation order==
This document provides basic information for all kind of animations. When animating your model, it is very helpful to find an aircraft with parts similar to yours and use it as an example. Cut and paste the code into your wrapper file and then edit to suit.
{{stub}}


== A note about animation order ==
Animations are executed by FlightGear in the order that they are read in the model's .xml file. Therefore, it is very important to pay attention to the order, especially when multiple animations are applied to the same object(s).
Animations are executed by FlightGear in the order that they are read in the model's .xml file. Therefore, it is very important to pay attention to the order, especially when multiple animations are applied to the same object(s).


==Special code parts==
== A note about .ac files ==
===Axis===
{{Main article|AC files: Understanding and changing .ac code#Identifying an object}}
 
When referring to an .ac file in your xml animation, it is important that the <code><object name></code> exactly matches the object named in the .ac file (this includes cases!).
 
'''Note for SketchUp users:''' when exporting to AC3D in Sketchup, the .ac file will name the objects in your model to "blah" by default. You need to amend the relevant object names in your .ac file using text edit, so that the xml will work.
 
== Special code parts ==
=== Axis ===
An axis part is required in every animation that involves a rotating or moving thing.
An axis part is required in every animation that involves a rotating or moving thing.
<source>
   <axis>
   <axis>
   <x>0</x>
   <x>0</x>
Line 16: Line 25:
   <z>0</z>
   <z>0</z>
   </axis>
   </axis>
</source>


The axis are similar to the ones of the 3D model. There is a difference between rotation and translation:
The axis are similar to the ones of the 3D model. There is a difference between rotation and translation:
Line 23: Line 33:
You could also define two points, between which FlightGear will calculate the correct axis. This makes the use of a [[#Center|<nowiki><center></nowiki>]] tag redundant! Such coordinates are extremely useful for animating control surfaces (rudder, elevators etc.).
You could also define two points, between which FlightGear will calculate the correct axis. This makes the use of a [[#Center|<nowiki><center></nowiki>]] tag redundant! Such coordinates are extremely useful for animating control surfaces (rudder, elevators etc.).


<source>
   <axis>   
   <axis>   
   <x1-m> 4.9</x1-m>
   <x1-m> 4.9</x1-m>
Line 31: Line 42:
   <z2-m>-0.5</z2-m>
   <z2-m>-0.5</z2-m>
   </axis>
   </axis>
</source>


===Center===
=== Center ===
Various animations ([[#Rotate|rotate]], [[#Spin|spin]]) move around a center point.
Various animations ([[#Rotate|rotate]], [[#Spin|spin]]) move around a center point.


  <nowiki><center></nowiki>
<source>
  <center>
   <x-m>-1.50</x-m>
   <x-m>-1.50</x-m>
   <y-m> 1  </y-m>
   <y-m> 1  </y-m>
   <z-m> 0.25</z-m>
   <z-m> 0.25</z-m>
   <nowiki></center></nowiki>
   </center>
</source>


The axis are similar to the ones of the 3D model, so finding coordinates is easily done in 3D modeling software.
The axis are similar to the ones of the 3D model, so finding coordinates is easily done in 3D modeling software.


===Conditions===
=== Conditions ===
Multiple animations can make use of a conditional.
Multiple animations can make use of a conditional. Check <tt>$FGDATA/Docs/README.conditions</tt> for some more details.


* '''equals:''' property value is equal to value/property.
* '''equals:''' property value (or second property) is equal to value/(first)property.
* '''greater-than:''' property value is larger than value/property.
* '''greater-than:''' property value (or second property) is larger than value/(first)property.
* '''greater-than-equals:''' property value is greater than or equal to value/property.
* '''greater-than-equals:''' property value (or second property) is greater than or equal to value/(first)property.
* '''less-than:''' property value is smaller than value/property.
* '''less-than:''' property value (or second property) is smaller than value/(first)property.
* '''less-than-equals:''' property value is smaller than or equal to value/property.
* '''less-than-equals:''' property value (or second property) is smaller than or equal to value/(first)property.


The example below is true when n1 has a value greater than 25.
The example below is true when n1 has a value greater than 25.
<source>
   <condition>
   <condition>
   <greater-than>
   <greater-than>
Line 59: Line 74:
   </greater-than>
   </greater-than>
   </condition>
   </condition>
</source>


Then there are some special tags:
Then there are some special tags:
Line 67: Line 83:


In the example below, the condition is true when either n1 is greater than 25% or equal to 0%.
In the example below, the condition is true when either n1 is greater than 25% or equal to 0%.
<source>
   <condition>
   <condition>
   <or>
   <or>
Line 77: Line 94:
     <value>0</value>
     <value>0</value>
     </equals>
     </equals>
   <or>
   </or>
   </condition>
   </condition>
</source>


An example of implementation into an animation looks as follows:
An example of implementation into an animation looks as follows:


<source>
  <animation>
  <animation>
   <object-name>Object</object-name>
   <object-name>Object</object-name>
Line 93: Line 112:
   </greater-than>
   </greater-than>
   </condition>
   </condition>
   <nowiki><center></nowiki>
   <center>
   <x-m>-1.50</x-m>
   <x-m>-1.50</x-m>
   <y-m> 1  </y-m>
   <y-m> 1  </y-m>
   <z-m> 0.25</z-m>
   <z-m> 0.25</z-m>
   <nowiki></center></nowiki>
   </center>
   <axis>
   <axis>
   <x>0</x>
   <x>0</x>
Line 104: Line 123:
   </axis>
   </axis>
  </animation>
  </animation>
</source>


===Interpolation===
=== Interpolation ===
For non-fixed factors, an interpolation "table" can be created.  
For non-fixed factors, an interpolation "table" can be created.  


<source>
   <interpolation>
   <interpolation>
   <entry>
   <entry>
Line 122: Line 143:
   </entry>
   </entry>
   </interpolation>
   </interpolation>
</source>


The lines above represent the following table:
The lines above represent the following table:
Line 141: Line 163:
You can add as many entries as you need. Interpolation tables are often used for gear animations (eg. to open doors during gear-movements and close them again once the gear is either retracted or fully extended).
You can add as many entries as you need. Interpolation tables are often used for gear animations (eg. to open doors during gear-movements and close them again once the gear is either retracted or fully extended).


===Name===
=== Name ===
With an name animation, you can group multiple objects.  
With a name animation, you can group multiple objects.  


<source>
  <animation>
  <animation>
   <name>Collection1</name>
   <name>Collection1</name>
Line 150: Line 173:
   <object-name>Object3</object-name>
   <object-name>Object3</object-name>
  </animation>
  </animation>
</source>


The example above creates a "virtual object" with the name Collection1. In animation, we can animate this group of objects, by using:
The example above creates a "virtual object" with the name Collection1. In animation, we can animate this group of objects, by using:


<source>
  <object-name>Collection1</object-name>
  <object-name>Collection1</object-name>
</source>


===Object-name===
=== Object-name ===
These names are set in the 3D model. Each single object has a unique name; for easy identification it is advised to use descriptive names (LeftElevator, Rudder etc.). Animations are only applied to those objects that are mentioned in an object-name line (one object per line!). Animations lacking those, will be applied to the entire model.
These names are set in the 3D model. Each single object has a unique name; for easy identification it is advised to use descriptive names (LeftElevator, Rudder etc.). Animations are only applied to those objects that are mentioned in an object-name line (one object per line!). Animations lacking those, will be applied to the entire model.


==Animation types==
=== Property ===
===Alpha-test===
Each animation must be associated with exactly one property from the main FlightGear property tree (remember that the properties in the wrapper file are not part of the main tree), using <code><property></code> to provide the property path:
 
<source>
<animation>
  <type>rotate</type>
  <object-name>Rudder</object-name>
  <property>controls/rudder</property>
</animation>
</source>
 
Note the omission of the leading slash '/' when reffering to the property. This assures that when the model is used for AI or multiplayer traffic the animations will follow that of the AI controller instead of that of the user.
 
=== Expressions ===
For some animations it is possible to define complex animations by using [[Expressions|Expressions]]. This even allows to drive the animation from multiple properties without the need for additional Nasal scripts. Here is an example for a translate animation depending on two properties and the cosine function:
<syntaxhighlight lang="xml">
<animation>
    <type>translate</type>
    <expression>
      <product>
        <property>/my/factor-property</property>
        <cos>
          <deg2rad>
            <property>/my/angular-property</property>
          </deg2rad>
        </cos>
      </product>
    </expression>
    [..]more elements[..]
</animation>
</syntaxhighlight>
 
Animations which can utilize [[Expressions|Expressions]] are:
* [[Howto:Animate_models#Translate|Translate]]
* [[Howto:Animate_models#Rotate|Rotate]]
* [[Howto:Animate_models#Scale|Scale]]
* [[Howto:Animate_models#Range|Range]]
* [[Howto:Animate_models#Blend|Blend]]
 
See more detailed info at [[Expressions|Expressions]]
 
== Animation types ==
=== Alpha-test ===
<source>
  <animation>
  <animation>
   <type>alpha-test</type>
   <type>alpha-test</type>
Line 165: Line 233:
   <alpha-factor>0.01</alpha-factor>
   <alpha-factor>0.01</alpha-factor>
  </animation>
  </animation>
</source>
This "animation" is a way to set an alpha test on a model branch. The effect is to avoid depth buffer writing of pixel that are not seen because they are transparent. This is particulary useful when modeling a metallic structure or a tree with a billboard. The threshold of transparency is set with the <alpha-factor> element.  See also [[Pixel testing in effects]].
=== Blend ===
Blends an object with the surrounding. Comparable to a translucency animation.
<source>
<animation>
  <type>blend</type>
  <property>/velocities/airspeed-kt</property>
  <factor>0.00025</factor>
  <min>0.2</min>
  <max>0.7</max>
</animation>
</source>
* '''property:'''
* '''factor:'''
* '''min:'''
* '''max:'''
* '''[[Howto:Animate_models#Expressions|expression]]:''' is optional. For more details see [[Expressions|Expressions]]


===Billboard===
=== Billboard ===
This faces an object towards the viewer. Often used on 2D objects, like clouds, trees and lights.
This faces an object towards the viewer. Often used on 2D objects, like clouds, trees and lights.


<source>
  <animation>
  <animation>
   <type>billboard</type>
   <type>billboard</type>
Line 174: Line 264:
   <spherical type="bool">true</spherical>
   <spherical type="bool">true</spherical>
  </animation>
  </animation>
</source>


* '''spherical:'''
* '''spherical:'''


===Dist-scale===
=== Dist-scale ===
Used to scale an object, based on the distance to the viewer.
Used to scale an object, based on the distance to the viewer.


<source>
  <animation>
  <animation>
   <type>dist-scale</type>
   <type>dist-scale</type>
Line 198: Line 290:
   </interpolation>
   </interpolation>
  </animation>
  </animation>
</source>
You can optionally add [[#Center|&lt;center&gt;]] coordinates, to scale the object around that point.


===Enable-hot===
=== Enable-hot ===
Scenery objects are automatically defined as solid by FlightGear, meaning that an aircraft can taxi on them and/or crash when touching. For certain objects (groundmarkings, beacon light-beams etc.) this might be an unwanted feature. The solidness can be disabled with the following animation:
Scenery objects are automatically defined as solid by FlightGear, meaning that an aircraft can taxi on them and/or crash when touching. For certain objects (groundmarkings, beacon light-beams etc.) this might be an unwanted feature. The solidness can be disabled with the following animation:


<source>
  <animation>
  <animation>
   <object-name>Object</object-name>
   <object-name>Object</object-name>
   <enable-hot type="bool">false</enable-hot>
   <enable-hot type="bool">false</enable-hot>
  </animation>
  </animation>
</source>


* '''enable-hot:''' can be either true or false. Remember that objects are automatically solid, so it should not be nesecarily to set this at all when wanting solidness.
* '''enable-hot:''' can be either true or false. Remember that objects are automatically solid, so it should not be nesecarily to set this at all when wanting solidness.


===Flash===
=== Flash ===
 
Used to scale an object based on the cosine of the angle between the axis provided in the animation and the view vector.
 
<source>
  <animation>
  <animation>
   <type>flash</type>
   <type>flash</type>
Line 219: Line 320:
   <min>0.0</min>
   <min>0.0</min>
   <max>1.0</max>
   <max>1.0</max>
   <nowiki><center></nowiki>
   <center>
   <x-m>0.0</x-m>
   <x-m>0.0</x-m>
   <y-m>0.0</y-m>
   <y-m>0.0</y-m>
   <z-m>0.0</z-m>
   <z-m>0.0</z-m>
   <nowiki></center></nowiki>
   </center>
   <axis>
   <axis>
   <x>0.0</x>
   <x>0.0</x>
Line 230: Line 331:
   </axis>
   </axis>
  </animation>
  </animation>
</source>


*'''offset:'''
* '''offset:'''
*'''factor:'''
* '''factor:'''
*'''power:'''
* '''power:'''
*'''two-sides:'''
* '''two-sides:''' if false, nothing is drawn if the cosine is negative.
*'''min:'''
* '''min:'''
*'''max:'''
* '''max:'''
 
scale = factor * pow( cosine, power ) + offset
 
scale is then clamped between min and max.
 
and this scale factor is applied to the object, from the center specified. It works best if scale is less than 1. Otherwise, there will be clipping issues.
 
=== Interactions ===
<source>
<animation>
  <type>interaction</type>
  <object-name>Object</object-name>
  <interaction-type>carrier-wire</interaction-type>
</animation>
</source>
 
* '''interaction-type:''' can have the following values:
** '''carrier-catapult:'''
** '''carrier-wire:''' makes the object act as an arresting wire, as used on [[aircraft carrier]]s.


===Material===
=== Knob / slider (v. 2.11-) ===
An animation type that can be used in various ways.
{{Main article|Knob / slider animation}}


====Changing liveries====
=== Material ===
Used for the [[Livery over MP]] system.
An animation type that can be used in various ways. Of course you can combine the below mentiond systems into one (big) animation.


<source>
  <animation>  
  <animation>  
   <type>material</type>  
   <type>material</type>  
   <object-name>Object</object-name>
   <object-name>Object</object-name>
   <property-base>sim/model/livery</property-base>  
   <property-base>sim/model/c172p/material</property-base>
   <texture-prop>engine</texture-prop>  
   <global type="bool">true</global> <!-- This tag is no longer supported -->
   <texture>KLM.png</texture>
   ...
  lines as mentioned below
  ...
  </animation>
  </animation>
</source>
'''Optional:'''
* '''property-base:''' when using prop(erties), you might want to set a property-base. All props will be relative to this path.
* '''global (depreciated):''' by setting this to <tt>true</tt>, all objects using the same material as the defined object(s) (via <tt><object-name></tt>) will be affected by the animation. This is preferred to listing several objects in <object-name> tags. It's not only faster, but also doesn't break animations by forcing objects together. <span style="color:red; text-decoration: underline;">This tag is no longer supported</span>
'''Notes:'''
* Numbers are clamped to 0.0-1.0, except "shininess", which is clamped to 0-128.
* By appending <tt>-prop</tt> each of the material properties can read its value from another property.
==== Ambient ====
<source>
  <ambient>
  <red>1.0</red>
  <green>0.2</green>
  <blue>0.0</blue>
  </ambient>
</source>
==== Diffuse ====
<source>
  <diffuse>
  <red>1.0</red>
  <green>0.2</green>
  <blue>0.0</blue>
  </diffuse>
</source>


====Illumination====
==== Emission ====
{{Main article|Howto: Illuminate faces}}
{{Main article|Howto: Illuminate faces}}
<animation>
<source>
  <type>material</type>
  <object-name>Object</object-name>
   <emission>
   <emission>
   <red>1.0</red>
   <red>1.0</red>
Line 263: Line 412:
   <factor-prop>controls/lighting/panel-norm</factor-prop>
   <factor-prop>controls/lighting/panel-norm</factor-prop>
   </emission>
   </emission>
</animation>
</source>
 
Emission colors are multiplied by the factor-prop value. 1 is maximum color intensity, while 0 is the minimum. Colors are calculated according to the [http://en.wikipedia.org/wiki/RGB_color_model RGB color model].
 
==== Shininess ====
Shininess is clamped to 0-128.
<source>
  <shininess>105</shininess>
</source>
 
==== Specular ====
<source>
  <specular>
  <red>1.0</red>
  <green>0.2</green>
  <blue>0.0</blue>
  </specular>
</source>
 
==== Texture ====
Used for the [[Livery over MP]] system.
 
<source>
  <property-base>sim/model/livery</property-base>
  <texture-prop>engine</texture-prop>
  <texture>KLM.png</texture>
</source>
 
==== Transparency ====
<source>
  <transparency>
  <alpha-prop>rotors/tail/rpm</alpha-prop>
  <factor>-0.0015</factor>
  <offset>1</offset>
  </transparency>
</source>


Emission colors are multiplied by the factor-prop value. 1 is maximum coclor intensity, while 0 is the minimum. Colors are calculated according to the [http://en.wikipedia.org/wiki/RGB_color_model RGB color model].
==== Threshold ====
<source>
  <threshold>0.001</threshold>
</source>


===Noshadow===
=== Noshadow ===
<source>
  <animation>
  <animation>
   <type>noshadow</type>
   <type>noshadow</type>
   <object-name>Object</object-name>
   <object-name>Object</object-name>
  </animation>
  </animation>
</source>


===Pick===
=== Pick ===
{{Main article|Howto: Make a clickable panel#Pick}}
{{Main article|Howto: Make a clickable panel#Pick}}


===Range===
=== Range ===
To prevent objects -like instruments- being drawn when the aircraft is actually too far away for them to be seen anyway, a range animation is used.  
To prevent objects -like instruments- being drawn when the aircraft is actually too far away for them to be seen anyway, a range animation is used.  


<syntaxhighlight lang="xml">
  <animation>
  <animation>
   <type>range</type>
   <type>range</type>
Line 284: Line 474:
   <max-m>30</max-m>
   <max-m>30</max-m>
  </animation>
  </animation>
</syntaxhighlight>


* '''min-m:''' the shortest distance (in meters) from the object center at which it is visible.
* '''min-m:''' the shortest distance (in meters) from the object center at which it is visible.
Line 289: Line 480:


You could also use the generic level of detail (LOD) properties, which can be set by the user through View > Adjust LOD rangers:  
You could also use the generic level of detail (LOD) properties, which can be set by the user through View > Adjust LOD rangers:  
* <tt>/sim/rendering/static-lod/bare</tt> distance at which only a rough exterior model is required.
{| class="wikitable"
* <tt>/sim/rendering/static-lod/rough</tt> distance at which most should be visible.
! Property
* <tt>/sim/rendering/static-lod/detailed</tt> distance at which all details should be visible.
! Description
! Default value
|-
|<tt>/sim/rendering/static-lod/bare</tt>
| only a rough exterior model
| 30,000 m
|-
|<tt>/sim/rendering/static-lod/rough</tt>  
| most should be visible
| 9,000 m
|-
|<tt>/sim/rendering/static-lod/detailed</tt>  
| all details should be visible
| 1,500 m
|}


The animation code will look like this:
The animation code will look like this:
<syntaxhighlight lang="xml">
  <animation>
  <animation>
   <type>range</type>
   <type>range</type>
Line 299: Line 505:
   <max-property>sim/rendering/static-lod/bare</max-property>
   <max-property>sim/rendering/static-lod/bare</max-property>
  </animation>
  </animation>
</syntaxhighlight>


You can have both ranges (max and min) bound to a property, or just one of them.
You can have both ranges (max and min) bound to a property, or just one of them.
* '''min-property:'''  
* '''min-property:'''  
* '''max-property:'''
* '''max-property:'''
* '''[[Howto:Animate_models#Expressions|expression]]:''' is optional. For more details see [[Expressions|Expressions]]


===Rotate===
=== Rotate ===
One of the most important and frequently used animations of all. It rotates an object to an absolute position in degrees, as provided by the property-value.
One of the most important and frequently used animations of all. It rotates an object to an absolute position in degrees, as provided by the property-value.


<source>
  <animation>
  <animation>
   <object-name>Object</object-name>
   <object-name>Object</object-name>
Line 312: Line 521:
   <property>suface-positions/left-aileron-pos-norm</property>
   <property>suface-positions/left-aileron-pos-norm</property>
   <factor>25</factor>
   <factor>25</factor>
   <nowiki><center></nowiki>
   <offset-deg>25</offset-deg>
  <center>
   <x-m>-1.50</x-m>
   <x-m>-1.50</x-m>
   <y-m> 1  </y-m>
   <y-m> 1  </y-m>
   <z-m> 0.25</z-m>
   <z-m> 0.25</z-m>
   <nowiki></center></nowiki>
   </center>
   <axis>
   <axis>
   <x>0</x>
   <x>0</x>
Line 323: Line 533:
   </axis>
   </axis>
  </animation>
  </animation>
</source>


* '''factor:''' is optional.
* '''factor:''' is optional.
* '''offset-deg:''' is optional. Offset in degrees.
* '''[[Howto:Animate_models#Expressions|expression]]:''' is optional. For more details see [[Expressions|Expressions]]


===Scale===
=== Scale ===
A scale animation scales (resizes) an object.
A scale animation scales (resizes) an object. This can be either property-value dependant (first example) or a fixed scale (second example).


<source>
  <animation>
  <animation>
   <type>scale</type>
   <type>scale</type>
Line 340: Line 554:
   <z-factor>2.0</z-factor>
   <z-factor>2.0</z-factor>
  </animation>
  </animation>
</source>


* ?-min: the mimimum scale factor for each axis. If the property value would result in a smaller factor than this setting, the scale animation will hold.
* ?-min: the mimimum scale factor for each axis. If the property value would result in a smaller factor than this setting, the scale animation will hold.
* ?-factor: the scale factor for each axis (factor*property=scale factor).
* ?-factor: the scale factor for each axis (factor*property=scale factor).


===Select===
<source>
<animation>
  <type>scale</type>
  <x-offset>0.5</x-offset>
  <y-offset>0.5</y-offset>
  <z-offset>0.5</z-offset>
</animation>
</source>
 
* x.offset: the scale factor.
* '''[[Howto:Animate_models#Expressions|expression]]:''' is optional. For more details see [[Expressions|Expressions]]
 
=== Select ===
This animation selects (or unselects) objects when certain conditions are true (or false). The example below shows the object when the n1 of engine[1] is higher than 25%.
This animation selects (or unselects) objects when certain conditions are true (or false). The example below shows the object when the n1 of engine[1] is higher than 25%.


<source>
  <animation>
  <animation>
   <object-name>Object</object-name>
   <object-name>Object</object-name>
Line 357: Line 585:
   </condition>
   </condition>
  </animation>
  </animation>
</source>


===Shader===
=== Shader ===
<source>
  <animation>
  <animation>
   <type>shader</type>
   <type>shader</type>
Line 365: Line 595:
   <object-name>Object</object-name>
   <object-name>Object</object-name>
  </animation>
  </animation>
</source>


* '''shader:'''  
* '''shader:'''  
* '''texture:''' path to the texture used by the shader.
* '''texture:''' path to the texture used by the shader.


===Spin===
=== Spin ===
Very similar to [[#Rotate|rotate]], but the property provides a value in revolutions per minute (RPM) rather than an absolute position in degrees, and offset cannot be used.
Very similar to [[#Rotate|rotate]], but the property provides a value in revolutions per minute (RPM) rather than an absolute position in degrees, and offset cannot be used.


<source>
  <animation>
  <animation>
   <object-name>Object</object-name>
   <object-name>Object</object-name>
Line 377: Line 609:
   <property>engines/engine[0]/n1</property>
   <property>engines/engine[0]/n1</property>
   <factor>25</factor>
   <factor>25</factor>
   <nowiki><center></nowiki>
   <center>
   <x-m>-1.50</x-m>
   <x-m>-1.50</x-m>
   <y-m> 1  </y-m>
   <y-m> 1  </y-m>
   <z-m> 0.25</z-m>
   <z-m> 0.25</z-m>
   <nowiki></center></nowiki>
   </center>
   <axis>
   <axis>
   <x>0</x>
   <x>0</x>
Line 388: Line 620:
   </axis>
   </axis>
  </animation>
  </animation>
</source>


* '''factor:''' is optional.
* '''factor:''' is optional.


===Textranslate===
=== Texture Animations ===
 
Applying different matrix transformations to the textures of an object.
 
==== Textranslate ====
A very important animation for cockpits! This animation moves textures over a surface.
A very important animation for cockpits! This animation moves textures over a surface.


<source>
  <animation>
  <animation>
   <type>textranslate</type>
   <type>textranslate</type>
   <object-name>Object</object-name>
   <object-name>Object</object-name>
   <property>autopilot/settings/target-speed-kt</property>
   <property>autopilot/settings/target-speed-kt</property>
  <bias>0.0001</bias>
   <factor>0.001</factor>
   <factor>0.001</factor>
   <step>100</step>
   <step>100</step>
Line 403: Line 642:
   <x>0</x>
   <x>0</x>
   <y>1</y>
   <y>1</y>
  <z>0</z>
   </axis>
   </axis>
  </animation>
  </animation>
</source>


* '''factor:'''
* '''bias:''' Adds an offset to the property before factor/step. A small value is needed to compensate for [http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems floating point accuracy].
* '''step:'''
* '''factor:''' property * factor * texture width/height = the amount of pixels that the texture should be translated. If your texture is 256 pixels, an textranslate of 0.1 will result in the texture moving with 26 pixels, into the direction specified by the axis settings.
property * factor * step * texture width/height = the amount of pixels that the texture should be translated. If your texture is 256 pixels, an textranslate of 0.1 will result in the texture moving with 26 pixels, into the direction specified by the axis settings.
* '''step:''' the step size at which the texture is translated. If this is set to 0.1, the texture will only be translated at 0.1, 0.2, 0.3 etc.
* axis: the direction in which the texture is translated. Y is up/down, while X is left/right.
 
==== Texrotate ====
 
<source>
<animation>
  <object-name>Object</object-name>
  <type>texrotate</type>
  <property>some/property/path</property>
  <factor>25</factor>
  <offset-deg>25</offset-deg>
  <center>
    <x>0.5</x>
    <y>0.5</y>
    <z>0</z>
  </center>
  <axis>
    <x>0</x>
    <y>0</y>
    <z>1</z>
  </axis>
</animation>
</source>
 
==== Textrapezoid ====
 
<source>
<animation>
  <type>textrapezoid</type>
  <object-name>HUD.l.canvas</object-name>
  <property>/hud/trapezoid-correction</property>
  <side>bottom</side>
</animation>
</source>
 
* '''side''': side of quad which should be scaled (''top'' (default)/''right''/''bottom''/''left'')
 
==== Texmultiple ====
 
Only one texture matrix can be applied to each object. With ''textmultiple'' multiple texture animations can be combined into a single matrix, applied to the specified object.
 
<source>
<animation>
  <type>texmultiple</type>
  <object-name>HUD.l.canvas</object-name>
  <transform>
    <subtype>textranslate</subtype>
    <property>/hud/offset-x</property>
    <axis>
    <x>1</x>
    <y>0</y>
    <z>0</z>
  </axis>
  </transform>
  <transform>
    <subtype>textranslate</subtype>
    <property>/hud/offset-y</property>
    <axis>
    <x>0</x>
    <y>1</y>
    <z>0</z>
  </axis>
  </transform>
  <transform>
    <subtype>textrapezoid</subtype>
    <property>/hud/trapezoid-correction</property>
  </transform>
</animation>
</source>


===Timed===
=== Timed ===
Swtiches between objects at specified intervals. This example switches between a lights-on model and a lights-off model. Lights on are shown 0.2 seconds, while lights off are displayed for 0.8 seconds.
Swtiches between objects at specified intervals. This example switches between a lights-on model and a lights-off model. Lights on are shown 0.2 seconds, while lights off are displayed for 0.8 seconds.


<source>
  <animation>
  <animation>
   <type>timed</type>
   <type>timed</type>
Line 422: Line 731:
   <branch-duration-sec>0.2</branch-duration-sec>
   <branch-duration-sec>0.2</branch-duration-sec>
  </animation>
  </animation>
</source>
=== Tracking ===
The new (in 2.11) [[Tracking animation|'''locked-track animation''']] can do exactly the same thing as the [http://wiki.blender.org/index.php/Doc:2.6/Manual/Constraints/Tracking/Locked_Track Locked Track constraint] available in Blender. However it can also be used to simulate simple inverse kinematic systems consisting of two bones connected with a revolute joint (aka hinge). See [[Tracking animation|detailed explanantion]]
=== Translate ===
The same as [[#Textranslate|textranslate]], but this animation moves a whole object (so including fixed textures). The example below will move an object in the y-direction:


===Translate===
{| class="wikitable" border="0" cellspacing="0"
The same as [[#Textranslate|textranslate]], but this animation moves a whole object (so including fixed textures). The example below will move an object 5 meters in the y-direction.
!Property value
!Output
|-
| -1
| -2.5
|-
| 0
| 2.5
|-
| 1
| 7.5
|}


<source>
  <animation>
  <animation>
   <type>translate</type>
   <type>translate</type>
Line 431: Line 759:
   <property>controls/seat/pilot/position-norm</property>
   <property>controls/seat/pilot/position-norm</property>
   <factor>5</factor>
   <factor>5</factor>
  <offset-m>2.5</offset-m>
   <axis>
   <axis>
   <x>0</x>
   <x>0</x>
Line 437: Line 766:
   </axis>
   </axis>
  </animation>
  </animation>
</source>
* '''factor:''' is optional.
* '''offset-m:''' is optional. Offset in meters.
* '''[[Howto:Animate_models#Expressions|expression]]:''' is optional. For more details see [[Expressions|Expressions]]
==References==
{{Appendix|all|
* {{cite web |url=http://www.opensubscriber.com/message/flightgear-devel@flightgear.org/958955.html |title="material" animation (and the bo105 as an example) |first=Melchior |last=Franz |date=22 March 2005 |work=FlightGear-devel mailinglist }}
* {{cite web |url=http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg01546.html |title=flash animation |first=Frederic |last=Bouvier |date=22 Feb 2006 |work=FlightGear-devel mailinglist }}
}}


[[Category:Aircraft enhancement|Animate models]]
[[Category:Aircraft enhancement|Animate models]]

Revision as of 21:26, 18 April 2014

The real world is full of motion. To simulate this in FlightGear, models must be animated.

FlightGear allows you to animate models in response to property changes: for example, the propellers can spin when the engine is on and the elevators can move up and down with your controller. There is no fixed limit on what parts can be animated: the only requirements are that the part is named in the 3D model file, and that there is a property in the main tree that you can use to get the positioning information.

This document provides basic information for all kind of animations. When animating your model, it is very helpful to find an aircraft with parts similar to yours and use it as an example. Cut and paste the code into your wrapper file and then edit to suit.

A note about animation order

Animations are executed by FlightGear in the order that they are read in the model's .xml file. Therefore, it is very important to pay attention to the order, especially when multiple animations are applied to the same object(s).

A note about .ac files

1rightarrow.png See AC files: Understanding and changing .ac code#Identifying an object for the main article about this subject.

When referring to an .ac file in your xml animation, it is important that the <object name> exactly matches the object named in the .ac file (this includes cases!).

Note for SketchUp users: when exporting to AC3D in Sketchup, the .ac file will name the objects in your model to "blah" by default. You need to amend the relevant object names in your .ac file using text edit, so that the xml will work.

Special code parts

Axis

An axis part is required in every animation that involves a rotating or moving thing.

  <axis>
   <x>0</x>
   <y>1</y>
   <z>0</z>
  </axis>

The axis are similar to the ones of the 3D model. There is a difference between rotation and translation:

  • In rotation animations, the axis part defines around what axis the object rotates. Negative/positive values make the difference between counterclockwise and clockwise rotations.
  • In translate animations, the part defines along what axis the object moves. If the x-axis is poiting backwards, an x-value of -1 will result in forward motion.

You could also define two points, between which FlightGear will calculate the correct axis. This makes the use of a <center> tag redundant! Such coordinates are extremely useful for animating control surfaces (rudder, elevators etc.).

  <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

Various animations (rotate, spin) move around a center point.

  <center>
   <x-m>-1.50</x-m>
   <y-m> 1   </y-m>
   <z-m> 0.25</z-m>
  </center>

The axis are similar to the ones of the 3D model, so finding coordinates is easily done in 3D modeling software.

Conditions

Multiple animations can make use of a conditional. Check $FGDATA/Docs/README.conditions for some more details.

  • equals: property value (or second property) is equal to value/(first)property.
  • greater-than: property value (or second property) is larger than value/(first)property.
  • greater-than-equals: property value (or second property) is greater than or equal to value/(first)property.
  • less-than: property value (or second property) is smaller than value/(first)property.
  • less-than-equals: property value (or second property) is smaller than or equal to value/(first)property.

The example below is true when n1 has a value greater than 25.

  <condition>
   <greater-than>
    <property>engines/engine[1]/n1</property>
    <value>25</value>
   </greater-than>
  </condition>

Then there are some special tags:

  • and:
  • not:
  • or:

In the example below, the condition is true when either n1 is greater than 25% or equal to 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>

An example of implementation into an animation looks as follows:

 <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

For non-fixed factors, an interpolation "table" can be created.

  <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>

The lines above represent the following table:

Input Output
0.0 0.0
0.667 0.0
1.0 0.5

You can add as many entries as you need. Interpolation tables are often used for gear animations (eg. to open doors during gear-movements and close them again once the gear is either retracted or fully extended).

Name

With a name animation, you can group multiple objects.

 <animation>
  <name>Collection1</name>
  <object-name>Object1</object-name>
  <object-name>Object2</object-name>
  <object-name>Object3</object-name>
 </animation>

The example above creates a "virtual object" with the name Collection1. In animation, we can animate this group of objects, by using:

 <object-name>Collection1</object-name>

Object-name

These names are set in the 3D model. Each single object has a unique name; for easy identification it is advised to use descriptive names (LeftElevator, Rudder etc.). Animations are only applied to those objects that are mentioned in an object-name line (one object per line!). Animations lacking those, will be applied to the entire model.

Property

Each animation must be associated with exactly one property from the main FlightGear property tree (remember that the properties in the wrapper file are not part of the main tree), using <property> to provide the property path:

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

Note the omission of the leading slash '/' when reffering to the property. This assures that when the model is used for AI or multiplayer traffic the animations will follow that of the AI controller instead of that of the user.

Expressions

For some animations it is possible to define complex animations by using Expressions. This even allows to drive the animation from multiple properties without the need for additional Nasal scripts. Here is an example for a translate animation depending on two properties and the cosine function:

 <animation>
     <type>translate</type>
     <expression>
       <product>
         <property>/my/factor-property</property>
         <cos>
           <deg2rad>
             <property>/my/angular-property</property>
           </deg2rad>
         </cos>
       </product>
     </expression>
     [..]more elements[..]
 </animation>

Animations which can utilize Expressions are:

See more detailed info at Expressions

Animation types

Alpha-test

 <animation>
  <type>alpha-test</type>
  <object-name>Object</object-name>
  <alpha-factor>0.01</alpha-factor>
 </animation>

This "animation" is a way to set an alpha test on a model branch. The effect is to avoid depth buffer writing of pixel that are not seen because they are transparent. This is particulary useful when modeling a metallic structure or a tree with a billboard. The threshold of transparency is set with the <alpha-factor> element. See also Pixel testing in effects.

Blend

Blends an object with the surrounding. Comparable to a translucency animation.

 <animation>
  <type>blend</type>
  <property>/velocities/airspeed-kt</property>
  <factor>0.00025</factor>
  <min>0.2</min>
  <max>0.7</max>
 </animation>

Billboard

This faces an object towards the viewer. Often used on 2D objects, like clouds, trees and lights.

 <animation>
  <type>billboard</type>
  <object-name>Object</object-name>
  <spherical type="bool">true</spherical>
 </animation>
  • spherical:

Dist-scale

Used to scale an object, based on the distance to the viewer.

 <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>

You can optionally add <center> coordinates, to scale the object around that point.

Enable-hot

Scenery objects are automatically defined as solid by FlightGear, meaning that an aircraft can taxi on them and/or crash when touching. For certain objects (groundmarkings, beacon light-beams etc.) this might be an unwanted feature. The solidness can be disabled with the following animation:

 <animation>
  <object-name>Object</object-name>
  <enable-hot type="bool">false</enable-hot>
 </animation>
  • enable-hot: can be either true or false. Remember that objects are automatically solid, so it should not be nesecarily to set this at all when wanting solidness.

Flash

Used to scale an object based on the cosine of the angle between the axis provided in the animation and the view vector.

 <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: if false, nothing is drawn if the cosine is negative.
  • min:
  • max:

scale = factor * pow( cosine, power ) + offset

scale is then clamped between min and max.

and this scale factor is applied to the object, from the center specified. It works best if scale is less than 1. Otherwise, there will be clipping issues.

Interactions

 <animation> 
  <type>interaction</type> 
  <object-name>Object</object-name> 
  <interaction-type>carrier-wire</interaction-type> 
 </animation>
  • interaction-type: can have the following values:
    • carrier-catapult:
    • carrier-wire: makes the object act as an arresting wire, as used on aircraft carriers.

Knob / slider (v. 2.11-)

1rightarrow.png See Knob / slider animation for the main article about this subject.

Material

An animation type that can be used in various ways. Of course you can combine the below mentiond systems into one (big) animation.

 <animation> 
  <type>material</type> 
  <object-name>Object</object-name>
  <property-base>sim/model/c172p/material</property-base>
  <global type="bool">true</global> <!-- This tag is no longer supported -->
  ...
  lines as mentioned below
  ...
 </animation>

Optional:

  • property-base: when using prop(erties), you might want to set a property-base. All props will be relative to this path.
  • global (depreciated): by setting this to true, all objects using the same material as the defined object(s) (via <object-name>) will be affected by the animation. This is preferred to listing several objects in <object-name> tags. It's not only faster, but also doesn't break animations by forcing objects together. This tag is no longer supported

Notes:

  • Numbers are clamped to 0.0-1.0, except "shininess", which is clamped to 0-128.
  • By appending -prop each of the material properties can read its value from another property.

Ambient

  <ambient>
   <red>1.0</red>
   <green>0.2</green>
   <blue>0.0</blue>
  </ambient>

Diffuse

  <diffuse>
   <red>1.0</red>
   <green>0.2</green>
   <blue>0.0</blue>
  </diffuse>

Emission

1rightarrow.png See Howto: Illuminate faces for the main article about this subject.

  <emission>
   <red>1.0</red>
   <green>0.2</green>
   <blue>0.0</blue>
   <factor-prop>controls/lighting/panel-norm</factor-prop>
  </emission>

Emission colors are multiplied by the factor-prop value. 1 is maximum color intensity, while 0 is the minimum. Colors are calculated according to the RGB color model.

Shininess

Shininess is clamped to 0-128.

  <shininess>105</shininess>

Specular

  <specular>
   <red>1.0</red>
   <green>0.2</green>
   <blue>0.0</blue>
  </specular>

Texture

Used for the Livery over MP system.

  <property-base>sim/model/livery</property-base> 
  <texture-prop>engine</texture-prop> 
  <texture>KLM.png</texture>

Transparency

  <transparency>
   <alpha-prop>rotors/tail/rpm</alpha-prop>
   <factor>-0.0015</factor>
   <offset>1</offset>
  </transparency>

Threshold

  <threshold>0.001</threshold>

Noshadow

 <animation>
  <type>noshadow</type>
  <object-name>Object</object-name>
 </animation>

Pick

1rightarrow.png See Howto: Make a clickable panel#Pick for the main article about this subject.

Range

To prevent objects -like instruments- being drawn when the aircraft is actually too far away for them to be seen anyway, a range animation is used.

 <animation>
  <type>range</type>
  <min-m>0</min-m>
  <max-m>30</max-m>
 </animation>
  • min-m: the shortest distance (in meters) from the object center at which it is visible.
  • max-m: the largest distance (in meters) from the object center at which it is visible.

You could also use the generic level of detail (LOD) properties, which can be set by the user through View > Adjust LOD rangers:

Property Description Default value
/sim/rendering/static-lod/bare only a rough exterior model 30,000 m
/sim/rendering/static-lod/rough most should be visible 9,000 m
/sim/rendering/static-lod/detailed all details should be visible 1,500 m

The animation code will look like this:

 <animation>
  <type>range</type>
  <min-m>0</min-m>
  <max-property>sim/rendering/static-lod/bare</max-property>
 </animation>

You can have both ranges (max and min) bound to a property, or just one of them.

Rotate

One of the most important and frequently used animations of all. It rotates an object to an absolute position in degrees, as provided by the property-value.

 <animation>
  <object-name>Object</object-name>
  <type>rotate</type>
  <property>suface-positions/left-aileron-pos-norm</property>
  <factor>25</factor>
  <offset-deg>25</offset-deg>
  <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: is optional.
  • offset-deg: is optional. Offset in degrees.
  • expression: is optional. For more details see Expressions

Scale

A scale animation scales (resizes) an object. This can be either property-value dependant (first example) or a fixed scale (second example).

 <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: the mimimum scale factor for each axis. If the property value would result in a smaller factor than this setting, the scale animation will hold.
  • ?-factor: the scale factor for each axis (factor*property=scale factor).
 <animation>
  <type>scale</type>
  <x-offset>0.5</x-offset>
  <y-offset>0.5</y-offset>
  <z-offset>0.5</z-offset>
 </animation>

Select

This animation selects (or unselects) objects when certain conditions are true (or false). The example below shows the object when the n1 of engine[1] is higher than 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: path to the texture used by the shader.

Spin

Very similar to rotate, but the property provides a value in revolutions per minute (RPM) rather than an absolute position in degrees, and offset cannot be used.

 <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: is optional.

Texture Animations

Applying different matrix transformations to the textures of an object.

Textranslate

A very important animation for cockpits! This animation moves textures over a surface.

 <animation>
  <type>textranslate</type>
  <object-name>Object</object-name>
  <property>autopilot/settings/target-speed-kt</property>
  <bias>0.0001</bias>
  <factor>0.001</factor>
  <step>100</step>
  <axis>
   <x>0</x>
   <y>1</y>
  </axis>
 </animation>
  • bias: Adds an offset to the property before factor/step. A small value is needed to compensate for floating point accuracy.
  • factor: property * factor * texture width/height = the amount of pixels that the texture should be translated. If your texture is 256 pixels, an textranslate of 0.1 will result in the texture moving with 26 pixels, into the direction specified by the axis settings.
  • step: the step size at which the texture is translated. If this is set to 0.1, the texture will only be translated at 0.1, 0.2, 0.3 etc.
  • axis: the direction in which the texture is translated. Y is up/down, while X is left/right.

Texrotate

<animation>
  <object-name>Object</object-name>
  <type>texrotate</type>
  <property>some/property/path</property>
  <factor>25</factor>
  <offset-deg>25</offset-deg>
  <center>
    <x>0.5</x>
    <y>0.5</y>
    <z>0</z>
  </center>
  <axis>
    <x>0</x>
    <y>0</y>
    <z>1</z>
  </axis>
</animation>

Textrapezoid

<animation>
  <type>textrapezoid</type>
  <object-name>HUD.l.canvas</object-name>
  <property>/hud/trapezoid-correction</property>
  <side>bottom</side>
</animation>
  • side: side of quad which should be scaled (top (default)/right/bottom/left)

Texmultiple

Only one texture matrix can be applied to each object. With textmultiple multiple texture animations can be combined into a single matrix, applied to the specified object.

<animation>
  <type>texmultiple</type>
  <object-name>HUD.l.canvas</object-name>
  <transform>
    <subtype>textranslate</subtype>
    <property>/hud/offset-x</property>
    <axis>
     <x>1</x>
     <y>0</y>
     <z>0</z>
   </axis>
  </transform>
  <transform>
    <subtype>textranslate</subtype>
    <property>/hud/offset-y</property>
    <axis>
     <x>0</x>
     <y>1</y>
     <z>0</z>
   </axis>
  </transform>
  <transform>
    <subtype>textrapezoid</subtype>
    <property>/hud/trapezoid-correction</property>
  </transform>
</animation>

Timed

Swtiches between objects at specified intervals. This example switches between a lights-on model and a lights-off model. Lights on are shown 0.2 seconds, while lights off are displayed for 0.8 seconds.

 <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>

Tracking

The new (in 2.11) locked-track animation can do exactly the same thing as the Locked Track constraint available in Blender. However it can also be used to simulate simple inverse kinematic systems consisting of two bones connected with a revolute joint (aka hinge). See detailed explanantion

Translate

The same as textranslate, but this animation moves a whole object (so including fixed textures). The example below will move an object in the y-direction:

Property value Output
-1 -2.5
0 2.5
1 7.5
 <animation>
  <type>translate</type>
  <object-name>Object</object-name>
  <property>controls/seat/pilot/position-norm</property>
  <factor>5</factor>
  <offset-m>2.5</offset-m>
  <axis>
   <x>0</x>
   <y>1</y>
   <z>0</z>
  </axis>
 </animation>
  • factor: is optional.
  • offset-m: is optional. Offset in meters.
  • expression: is optional. For more details see Expressions

References

References