1
0
Fork 0

Merge branch 'master' of gitorious.org:fg/fgdata

This commit is contained in:
Torsten Dreyer 2011-01-24 20:00:16 +01:00
commit 70c2a6a974
3 changed files with 573 additions and 1 deletions

View file

@ -0,0 +1,528 @@
<?xml version="1.0"?>
<!--
Joystick binding for ThrustMaster T.Flight Hotas X
Adrien Bailly
Original file by 'flug':
http://www.flightgear.org/forums/viewtopic.php?f=2&t=5517
Axis # (direction) mapped to
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
axis 0: (left-right) aileron
axis 1: (forward-backward) elevator
axis 2: (slider) throttle
axis 3: (twist) rudder
axis 4: (top hat) view left/right
Note that internally, FG numbers buttons starting with 0. The markings on the
HOTAS-X start with Button 1, and I have used the HOTAS-X number markings below:
Button # Location Function
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
button 1: (joystick R1) Brakes & reset view
button 2: (joystick L1) Push-To-Talk (for fgcom)
button 3: (joystick R3) Trim nose down
button 4: (joystick L3) Trim nose up
NO MODIFIER:
button 5: (throttle) Flaps up
button 6: (throttle) Flaps down
button 7: (throttle) Gear up/down
button 8: (throttle) Switch view
MODIFIER 1 (keep button R2 down):
button 5: (throttle) Mixture rich
button 6: (throttle) Mixture lean
button 7 (throttle) Propeller coarse
button 8: (throttle) Propeller fine
MODIFIER 2 (keep button L2 down):
button 5: (throttle) Battery ON/OFF
button 6: (throttle) Fuel selector
button 7 (throttle) Magnetos
button 8: (throttle) ???
MODIFIER 1+2 (keep buttons L2 and R2 down):
button 5: (throttle) ???
button 6: (throttle) ???
button 7 (throttle) ???
button 8: (throttle) ???
button 9: (throttle R2) Modifier 1
button 10: (throttle L2) Modifier 2
button SE: (base SE) ???
button ST: (base ST) ???
HAT SWITCH
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
With the rocker switch and throttle twist controlling view direction, it is easy
to look all around in different directions.
-->
<PropertyList>
<name type="string">T.Flight Hotas X</name>
<name type="string">Hotas X</name>
<name type="string">Thrustmaster Hotas X</name>
<name type="string">Thrustmaster T.Flight Hotas X</name>
<nasal>
<script>
<![CDATA[
setprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1", 0);
setprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2", 0);
]]>
</script>
</nasal>
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~ Axis Bindings ~~~~~~~~~~~~~~~~~~~~~~~~ -->
<axis n="0">
<desc>Joystick: Aileron</desc>
<binding>
<command>property-scale</command>
<property>/controls/flight/aileron</property>
<factor type="double">1.0</factor>
<power type="double">1.0</power>
</binding>
</axis>
<axis n="1">
<desc>Joystick: Elevator</desc>
<binding>
<command>property-scale</command>
<property>/controls/flight/elevator</property>
<factor type="double">-1.0</factor>
<power type="double">1.0</power>
</binding>
</axis>
<axis n= "2">
<desc>Throttle</desc>
<binding>
<command>nasal</command>
<script>controls.throttleAxis()</script>
</binding>
</axis>
<axis n="3">
<desc>Rudder</desc>
<binding>
<command>property-scale</command>
<property>/controls/flight/rudder</property>
<power type="double">1.0</power>
</binding>
</axis>
<!-- Throttle rocker switch axis pans l/r -->
<axis n="4">
<desc>Throttle rocker switch: View Left/Right</desc>
<dead-band type="double">0.05</dead-band>
<binding>
<command>property-scale</command>
<property>/sim/current-view/heading-offset-deg</property>
<factor type="double">-180</factor>
<power type="double">1.2</power>
</binding>
</axis>
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~ Hat Switch ~~~~~~~~~~~~~~~~~~~~~~~~ -->
<axis n="5">
<desc>Hat Switch: View Direction (use mod buttons for different effects)</desc>
<low>
<repeatable>true</repeatable>
<binding>
<command>property-adjust</command>
<property>/sim/current-view/goal-heading-offset-deg</property>
<step type="double">5.0</step>
</binding>
</low>
<high>
<repeatable>true</repeatable>
<binding>
<command>property-adjust</command>
<property>/sim/current-view/goal-heading-offset-deg</property>
<step type="double">-5.0</step>
</binding>
</high>
</axis>
<axis n="6">
<desc>Hat Switch: View Elevation (use mod buttons for different effects)</desc>
<low>
<repeatable>true</repeatable>
<binding>
<command>property-adjust</command>
<property>/sim/current-view/goal-pitch-offset-deg</property>
<step type="double">5.0</step>
</binding>
</low>
<high>
<repeatable>true</repeatable>
<binding>
<command>property-adjust</command>
<property>/sim/current-view/goal-pitch-offset-deg</property>
<step type="double">-5.0</step>
</binding>
</high>
</axis>
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~ Button Bindings ~~~~~~~~~~~~~~~~~~~~~~~~ -->
<!-- Trigger (R1) -->
<button n="0">
<desc>Button R1(1) (trigger): Brakes + reset to pilot view</desc>
<repeatable type="bool">true</repeatable>
<binding>
<command>nasal</command>
<script>
controls.applyBrakes(1.0);
setprop("/sim/current-view/view-number", 0);
view.resetView();
</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>
controls.applyBrakes(0.0);
</script>
</binding>
</mod-up>
</button>
<!-- Button right of Hat switch, Labeled L1(2) -->
<button n="1">
<desc>Button L1(2) (joystick center): Push-To-Talk (for fgcom)</desc>
<binding>
<command>nasal</command>
<script>
controls.ptt(1); # push-to-talk (fgcom) ON
</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>
controls.ptt(0); # push-to-talk (fgcom) OFF
</script>
</binding>
</mod-up>
</button>
<!-- Front button, right of trigger, (R3) -->
<button n="2">
<desc>Button R3(3): Elevator trim down</desc>
<repeatable type="bool">true</repeatable>
<binding>
<command>nasal</command>
<script>
controls.elevatorTrim(1);
gui.popupTip(sprintf("Elevator trim: %d", 100 * getprop("/controls/flight/elevator-trim")));
</script>
</binding>
</button>
<!-- Button far right of Hat switch, Labeled L3(4) -->
<button n="3">
<desc>Button L3(4): Elevator trim down</desc>
<repeatable type="bool">true</repeatable>
<binding>
<command>nasal</command>
<script>
controls.elevatorTrim(-1);
gui.popupTip(sprintf("Elevator trim: %d", 100 * getprop("/controls/flight/elevator-trim")));
</script>
</binding>
</button>
<!-- Throttle Button labeled 5 -->
<button n="4">
<desc>Button (5): Flaps up / Mixture rich / Battery on-off / ???</desc>
<repeatable type="bool">false</repeatable>
<binding>
<command>nasal</command>
<script>
mod1 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1");
mod2 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2");
if(mod1==0 and mod2==0) {
controls.flapsDown(-1);
gui.popupTip(sprintf("Flaps: %d deg", 30*getprop("/controls/flight/flaps")+0.1));
}
elsif(mod1==1 and mod2==0) {
controls.adjMixture(10);
gui.popupTip(sprintf("Mixture rich"));
}
elsif(mod1 == 0 and mod2==1) {
j = getprop("/controls/electric/battery-switch");
if(j == 0) {
setprop("/controls/electric/battery-switch", 1);
gui.popupTip(sprintf("Battery ON"));
} else {
setprop("/controls/electric/battery-switch", 0);
gui.popupTip(sprintf("Battery OFF"));
}
}
elsif(mod1==1 and mod2==1) {
}
</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>
mod1 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1");
mod2 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2");
if(mod1==0 and mod2==0) {
controls.flapsDown(0);
gui.popupTip(sprintf("Flaps: %d deg", 30*getprop("/controls/flight/flaps")+0.1));
}
elsif(mod1==1 and mod2==0) {
# mixture
}
elsif(mod1 == 0 and mod2==1) {
}
elsif(mod1==1 and mod2==1) {
}
</script>
</binding>
</mod-up>
</button>
<!-- Throttle Button labeled 6 -->
<button n="5">
<desc>Button (6): Flaps down / Mixture lean / Fuel selector / ???</desc>
<repeatable type="bool">false</repeatable>
<binding>
<command>nasal</command>
<script>
mod1 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1");
mod2 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2");
if(mod1==0 and mod2==0) {
controls.flapsDown(1);
gui.popupTip(sprintf("Flaps: %d deg", 30*getprop("/controls/flight/flaps")+0.1));
}
elsif(mod1==1 and mod2==0) {
controls.adjMixture(-10);
gui.popupTip(sprintf("Mixture lean"));
}
elsif(mod1 == 0 and mod2==1) {
k = getprop("/controls/fuel/tank/fuel_selector");
if (k == 0) {
setprop("/controls/fuel/tank/fuel_selector", 1);
setprop("/controls/engines/engine/fuel-pump", 1);
} else {
setprop("/controls/fuel/tank/fuel_selector", 0);
setprop("/controls/engines/engine/fuel-pump", 0);
}
}
elsif(mod1==1 and mod2==1) {
}
</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>
mod1 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1");
mod2 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2");
if(mod1==0 and mod2==0) {
controls.flapsDown(0);
gui.popupTip(sprintf("Flaps: %d deg", 30*getprop("/controls/flight/flaps")+0.1));
}
elsif(mod1==1 and mod2==0) {
# mixture
}
elsif(mod1 == 0 and mod2==1) {
}
elsif(mod1==1 and mod2==1) {
}
</script>
</binding>
</mod-up>
</button>
<!-- Throttle Button labeled 7 (circle)-->
<button n="6">
<desc>Button (7): Landing Gear Toggle / Propeller coarse / Magnetos / ???</desc>
<repeatable type="bool">false</repeatable>
<binding>
<command>nasal</command>
<script>
mod1 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1");
mod2 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2");
if(mod1==0 and mod2==0) {
controls.gearToggle();
}
elsif(mod1==1 and mod2==0) {
controls.adjPropeller(10);
gui.popupTip(sprintf("Propeller coarse"));
}
elsif(mod1 == 0 and mod2==1) {
l = getprop("/controls/engines/engine/magnetos");
if (l == 0) {
props.setAll("/controls/engines/engine", "magnetos", 1);
} elsif ( l == 1 ) {
props.setAll("/controls/engines/engine", "magnetos", 2);
} elsif ( l == 2 ) {
props.setAll("/controls/engines/engine", "magnetos", 3);
} elsif ( l == 3 ) {
props.setAll("/controls/engines/engine", "magnetos", 0);
}
}
elsif(mod1==1 and mod2==1) {
}
</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>
mod1 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1");
mod2 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2");
if(mod1==0 and mod2==0) {
# gear
}
elsif(mod1==1 and mod2==0) {
# propeller
}
elsif(mod1 == 0 and mod2==1) {
# magnetos
}
elsif(mod1==1 and mod2==1) {
}
</script>
</binding>
</mod-up>
</button>
<!-- Throttle Button labeled 8 (triangle) -->
<button n="7">
<desc>Button (8): Switch view / Propeller fine / Starter / ???</desc>
<repeatable type="bool">false</repeatable>
<binding>
<command>nasal</command>
<script>
mod1 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1");
mod2 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2");
if(mod1==0 and mod2==0) {
view.stepView(1);
}
elsif(mod1==1 and mod2==0) {
controls.adjPropeller(-10);
gui.popupTip(sprintf("Propeller fine"));
}
elsif(mod1==0 and mod2==1) {
setprop("/controls/engines/engine/starter", 1);
setprop("/controls/engines/engine[1]/starter", 1);
setprop("/controls/engines/engine[2]/starter", 1);
setprop("/controls/engines/engine[3]/starter", 1);
setprop("/controls/engines/engine[4]/starter", 1);
gui.popupTip(sprintf("Cranking..."));
}
elsif(mod1==1 and mod2==1) {
}
</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>
mod1 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1");
mod2 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2");
if(mod1==0 and mod2==0) {
# switch views
}
elsif(mod1==1 and mod2==0) {
# propeller
}
elsif(mod1==0 and mod2==1) {
setprop("/controls/engines/engine/starter", 0);
setprop("/controls/engines/engine[1]/starter", 0);
setprop("/controls/engines/engine[2]/starter", 0);
setprop("/controls/engines/engine[3]/starter", 0);
setprop("/controls/engines/engine[4]/starter", 0);
}
elsif(mod1==1 and mod2==1) {
}
</script>
</binding>
</mod-up>
</button>
<!-- Throttle Button labeled R2(9) -->
<button n="8">
<desc>Button R2(9): Modifier 1</desc>
<repeatable type="bool">false</repeatable>
<binding>
<command>nasal</command>
<script>
setprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1", 1);
</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>
setprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1", 0);
</script>
</binding>
</mod-up>
</button>
<!-- Throttle Button labeled L2(10) -->
<button n="9">
<desc>Button L2(10): Modifier2</desc>
<repeatable type="bool">false</repeatable>
<binding>
<command>nasal</command>
<script>
setprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2", 1);
</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>
setprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2", 0);
</script>
</binding>
</mod-up>
</button>
<!-- Base Button SE -->
<button n="10">
<desc>Button SE: ???</desc>
<repeatable type="bool">false</repeatable>
<binding>
<command>nasal</command>
<script>
gui.popupTip(sprintf("Button n=10 unused"));
</script>
</binding>
</button>
<!-- Base Button ST -->
<button n="11">
<desc>Button ST: ???</desc>
<repeatable type="bool">false</repeatable>
<binding>
<command>nasal</command>
<script>
gui.popupTip(sprintf("Button n=11 unused"));
</script>
</binding>
</button>
</PropertyList>

View file

@ -138,7 +138,6 @@ command interface /autopilot/route-manager/input:
dest.getNode("runway").clearValue();
}
print("updated runways");
gui.dialog_update("route-manager");
}

View file

@ -748,6 +748,7 @@ Shared parameters for various materials.
<name>DeciduousBroadCover</name>
<name>DeciduousForest</name>
<name>Bog</name>
<name>Heath</name>
<texture>Terrain/deciduous1.png</texture>
<texture>Terrain/deciduous2.png</texture>
<texture>Terrain/deciduous4.png</texture>
@ -869,6 +870,7 @@ Shared parameters for various materials.
<name>ShrubCover</name>
<name>ShrubGrassCover</name>
<name>ScrubCover</name>
<name>Sclerophyllous</name>
<texture>Terrain/shrub1.png</texture>
<!--
<texture>Terrain/shrub.png</texture>
@ -910,6 +912,9 @@ Shared parameters for various materials.
</condition>
<name>BuiltUpCover</name>
<name>Urban</name>
<name>Construction</name>
<name>Industrial</name>
<name>Port</name>
<effect>Effects/urban</effect>
<texture-set>
<texture>Terrain/city1.png</texture>
@ -1004,6 +1009,7 @@ Shared parameters for various materials.
</equals>
</condition>
<name>Town</name>
<name>SubUrban</name>
<texture>Terrain/Town1.png</texture>
<xsize>1024</xsize>
<ysize>1024</ysize>
@ -1067,6 +1073,8 @@ Shared parameters for various materials.
<name>Stream</name>
<name>Canal</name>
<name>Lagoon</name>
<name>Estuary</name>
<name>Watercourse</name>
<name>Saline</name>
<texture>Terrain/water-lake.png</texture>
<xsize>400</xsize>
@ -1143,6 +1151,7 @@ Shared parameters for various materials.
<name>Marsh</name>
<name>Littoral</name>
<name>FloodLand</name>
<name>SaltMarsh</name>
<name>HerbWetlandCover</name>
<name>WoodedWetlandCover</name>
<texture>Terrain/marsh2.png</texture>
@ -1261,6 +1270,7 @@ Shared parameters for various materials.
<name>Grass</name>
<name>Airport</name>
<name>AirportKeep</name>
<name>Greenspace</name>
<texture>Terrain/airport.png</texture>
<xsize>125</xsize>
<ysize>125</ysize>
@ -1362,6 +1372,8 @@ Shared parameters for various materials.
<name>IrrCropPastureCover</name>
<name>IrrCrop</name>
<name>Orchard</name>
<name>Olives</name>
<name>Vineyard</name>
<name>Rice</name>
<texture>Terrain/irrcrop1.png</texture>
<texture>Terrain/irrcrop2.png</texture>
@ -1426,6 +1438,7 @@ Shared parameters for various materials.
<effect>Effects/crop</effect>
<name>DryCropPastureCover</name>
<name>DryCrop</name>
<name>NaturalCrop</name>
<texture>Terrain/drycrop1.png</texture>
<texture>Terrain/drycrop2.png</texture>
<texture>Terrain/drycrop3.png</texture>
@ -1492,6 +1505,7 @@ Shared parameters for various materials.
<effect>Effects/cropgrass</effect>
<name>CropGrassCover</name>
<name>CropGrass</name>
<name>Grassland</name>
<texture>Terrain/cropgrass1.png</texture>
<texture>Terrain/cropgrass2.png</texture>
<texture>Terrain/cropgrass3.png</texture>
@ -1533,6 +1547,7 @@ Shared parameters for various materials.
</condition>
<name>CropWoodCover</name>
<name>CropWood</name>
<name>AgroForest</name>
<effect>Effects/landmass</effect>
<texture>Terrain/cropwood.png</texture>
<xsize>2000</xsize>
@ -1594,6 +1609,7 @@ Shared parameters for various materials.
<name>DeciduousBroadCover</name>
<name>DeciduousForest</name>
<name>Bog</name>
<name>Heath</name>
<texture>Terrain.winter/deciduous1.png</texture>
<texture>Terrain.winter/deciduous2.png</texture>
<texture>Terrain.winter/deciduous4.png</texture>
@ -1711,6 +1727,7 @@ Shared parameters for various materials.
<name>ShrubCover</name>
<name>ShrubGrassCover</name>
<name>ScrubCover</name>
<name>Sclerophyllous</name>
<texture>Terrain.winter/shrub.png</texture>
<texture>Terrain.winter/shrub2.png</texture>
<texture>Terrain.winter/shrub3.png</texture>
@ -1749,6 +1766,9 @@ Shared parameters for various materials.
</condition>
<name>BuiltUpCover</name>
<name>Urban</name>
<name>Construction</name>
<name>Industrial</name>
<name>Port</name>
<effect>Effects/urban</effect>
<texture-set>
<texture>Terrain/city1.png</texture>
@ -1843,6 +1863,7 @@ Shared parameters for various materials.
</equals>
</condition>
<name>Town</name>
<name>SubUrban</name>
<texture>Terrain.winter/Town1.png</texture>
<xsize>1024</xsize>
<ysize>1024</ysize>
@ -1914,6 +1935,8 @@ Shared parameters for various materials.
<name>Stream</name>
<name>Canal</name>
<name>Lagoon</name>
<name>Estuary</name>
<name>Watercourse</name>
<name>Saline</name>
<texture>Terrain.winter/water-lake.png</texture>
<xsize>400</xsize>
@ -1990,6 +2013,7 @@ Shared parameters for various materials.
<name>Marsh</name>
<name>Littoral</name>
<name>FloodLand</name>
<name>SaltMarsh</name>
<name>HerbWetlandCover</name>
<name>WoodedWetlandCover</name>
<texture>Terrain.winter/marsh2.png</texture>
@ -2104,6 +2128,7 @@ Shared parameters for various materials.
<name>Grass</name>
<name>Airport</name>
<name>AirportKeep</name>
<name>Greenspace</name>
<texture>Terrain.winter/airport.png</texture>
<xsize>125</xsize>
<ysize>125</ysize>
@ -2203,6 +2228,9 @@ Shared parameters for various materials.
<name>IrrCropPastureCover</name>
<name>IrrCrop</name>
<name>Orchard</name>
<name>Olives</name>
<name>Vineyard</name>
<name>Rice</name>
<texture>Terrain.winter/irrcrop1.png</texture>
<texture>Terrain.winter/irrcrop2.png</texture>
<texture>Terrain.winter/irrcrop3.png</texture>
@ -2267,6 +2295,7 @@ Shared parameters for various materials.
</condition>
<name>DryCropPastureCover</name>
<name>DryCrop</name>
<name>NaturalCrop</name>
<texture>Terrain.winter/drycrop1.png</texture>
<texture>Terrain.winter/drycrop2.png</texture>
<texture>Terrain.winter/drycrop3.png</texture>
@ -2332,6 +2361,7 @@ Shared parameters for various materials.
</condition>
<name>CropGrassCover</name>
<name>CropGrass</name>
<name>Grassland</name>
<texture>Terrain.winter/cropgrass1.png</texture>
<texture>Terrain.winter/cropgrass2.png</texture>
<texture>Terrain.winter/cropgrass3.png</texture>
@ -2374,6 +2404,7 @@ Shared parameters for various materials.
</equals>
</condition>
<name>CropWoodCover</name>
<name>AgroForest</name>
<texture>Terrain.winter/cropwood.png</texture>
<xsize>2000</xsize>
<ysize>2000</ysize>
@ -2555,6 +2586,7 @@ Shared parameters for various materials.
<name>Dirt</name>
<name>OpenMining</name>
<name>Rock</name>
<name>Dump</name>
<texture>Terrain/rock.png</texture>
<xsize>500</xsize>
<ysize>500</ysize>
@ -2566,6 +2598,7 @@ Shared parameters for various materials.
<material>
<name>Lava</name>
<name>Burnt</name>
<texture>Terrain/lava.png</texture>
<xsize>500</xsize>
<ysize>500</ysize>
@ -2575,6 +2608,18 @@ Shared parameters for various materials.
<bumpiness>0.3</bumpiness>
</material>
<material>
<name>Asphalt</name>
<texture>Terrain/asphalt.png</texture>
<xsize>400</xsize>
<ysize>400</ysize>
<solid>1</solid>
<friction-factor>1.0</friction-factor>
<rolling-friction>0.02</rolling-friction>
<bumpiness>0.01</bumpiness>
<load-resistance>1e10</load-resistance>
</material>
<material>
<name>Freeway</name>
<name>Road</name>