package Savage.GroundVehicles.M1A1;

import org.web3d.x3d.jsail.Core.*;
import org.web3d.x3d.jsail.EnvironmentalEffects.*;
import org.web3d.x3d.jsail.fields.*;
import org.web3d.x3d.jsail.Geometry3D.*;
import org.web3d.x3d.jsail.Grouping.*;
import org.web3d.x3d.jsail.Navigation.*;
import org.web3d.x3d.jsail.PointingDeviceSensor.*;
import org.web3d.x3d.jsail.Rendering.*;
import org.web3d.x3d.jsail.Shape.*;

// Javadoc metadata annotations follow, see below for X3DJSAIL Java source code.
/**
 * <p> M1A1 Abrams tank with draggable turret and barrel. </p>
 <p> Related links: Catalog page <a href="../../../../GroundVehicles/M1A1/M1A1Index.html" target="_blank">M1A1</a>,  source <a href="../../../../GroundVehicles/M1A1/M1A1.java">M1A1.java</a>, <a href="https://www.web3d.org/x3d/content/examples/X3dResources.html" target="_blank">X3D Resources</a>, <a href="https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html" target="_blank">X3D Scene Authoring Hints</a>, and <a href="https://www.web3d.org/x3d/content/X3dTooltips.html" target="_blank">X3D Tooltips</a>. </p>
	<table style="color:black; border:0px solid; border-spacing:10px 0px;">
        <caption>Scene Meta Information</caption>
		<tr style="background-color:silver; border-color:silver;">
			<td style="text-align:center; padding:10px 0px;"><i>meta tags</i></td>
			<td style="text-align:left;   padding:10px 0px;">&nbsp; Document Metadata </td>
		</tr>

		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> title </i> </td>
			<td> <a href="../../../../GroundVehicles/M1A1/M1A1.x3d">M1A1.x3d</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> description </i> </td>
			<td> M1A1 Abrams tank with draggable turret and barrel. </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> creator </i> </td>
			<td> Scott Tufts </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> created </i> </td>
			<td> 15 September 2001 </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> modified </i> </td>
			<td> 20 October 2019 </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> reference </i> </td>
			<td> <a href="https://www.fas.org/man/dod-101/sys/land/m1.htm" target="_blank">https://www.fas.org/man/dod-101/sys/land/m1.htm</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> Image </i> </td>
			<td> <a href="../../../../GroundVehicles/M1A1/m1-951231-F-8381L-003.jpg">m1-951231-F-8381L-003.jpg</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> Image </i> </td>
			<td> <a href="https://www.fas.org/man/dod-101/sys/land/m1-951231-F-8381L-003.jpg" target="_blank">https://www.fas.org/man/dod-101/sys/land/m1-951231-F-8381L-003.jpg</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> subject </i> </td>
			<td> M1A1 Main Battle Tank Abrams </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> identifier </i> </td>
			<td> <a href="https://www.web3d.org/x3d/content/examples/Savage/GroundVehicles/M1A1/M1A1.x3d" target="_blank">https://www.web3d.org/x3d/content/examples/Savage/GroundVehicles/M1A1/M1A1.x3d</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> generator </i> </td>
			<td> X3D-Edit 3.2, <a href="https://www.web3d.org/x3d/tools/X3D-Edit" target="_blank">https://www.web3d.org/x3d/tools/X3D-Edit</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> license </i> </td>
			<td> <a href="../../../../GroundVehicles/M1A1/../../license.html">../../license.html</a> </td>
		</tr>
		<tr style="background-color:silver; border-color:silver;">
			<td style="text-align:center;" colspan="2">  &nbsp; </td>
		</tr>
	</table>

	<p>
		This program uses the
		<a href="https://www.web3d.org/specifications/java/X3DJSAIL.html" target="_blank">X3D Java Scene Access Interface Library (X3DJSAIL)</a>.
		It has been produced using the 
		<a href="https://www.web3d.org/x3d/stylesheets/X3dToJava.xslt" target="_blank">X3dToJava.xslt</a>
		stylesheet
	       (<a href="https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/X3dToJava.xslt" target="_blank">version control</a>)
                which is used to create Java source code from an original <code>.x3d</code> model.
	</p>

	* @author Scott Tufts
 */

public class M1A1
{
	/** Default constructor to create this object. */
	public M1A1 ()
	{
	  initialize();
	}

	/** Create and initialize the X3D model for this object. */
	public final void initialize()
	{
            try { // catch-all
  x3dModel = new X3D().setProfile(X3D.PROFILE_IMMERSIVE).setVersion(X3D.VERSION_3_0)
  .setHead(new head()
    .addMeta(new meta().setName(meta.NAME_TITLE      ).setContent("M1A1.x3d"))
    .addMeta(new meta().setName(meta.NAME_DESCRIPTION).setContent("M1A1 Abrams tank with draggable turret and barrel."))
    .addMeta(new meta().setName(meta.NAME_CREATOR    ).setContent("Scott Tufts"))
    .addMeta(new meta().setName(meta.NAME_CREATED    ).setContent("15 September 2001"))
    .addMeta(new meta().setName(meta.NAME_MODIFIED   ).setContent("20 October 2019"))
    .addMeta(new meta().setName(meta.NAME_REFERENCE  ).setContent("https://www.fas.org/man/dod-101/sys/land/m1.htm"))
    .addMeta(new meta().setName(meta.NAME_IMAGE      ).setContent("m1-951231-F-8381L-003.jpg"))
    .addMeta(new meta().setName(meta.NAME_IMAGE      ).setContent("https://www.fas.org/man/dod-101/sys/land/m1-951231-F-8381L-003.jpg"))
    .addMeta(new meta().setName(meta.NAME_SUBJECT    ).setContent("M1A1 Main Battle Tank Abrams"))
    .addMeta(new meta().setName(meta.NAME_IDENTIFIER ).setContent("https://www.web3d.org/x3d/content/examples/Savage/GroundVehicles/M1A1/M1A1.x3d"))
    .addMeta(new meta().setName(meta.NAME_GENERATOR  ).setContent("X3D-Edit 3.2, https://www.web3d.org/x3d/tools/X3D-Edit"))
    .addMeta(new meta().setName(meta.NAME_LICENSE    ).setContent("../../license.html")))
  .setScene(new Scene()
    .addChild(new WorldInfo().setTitle("M1A1.x3d"))
    .addChild(new Background().setGroundAngle(new double[] {1.309,1.570796}).setGroundColor(new MFColor(new double[] {.1,.1,0.0,.4,.25,.2,.6,.6,.6})).setSkyAngle(new double[] {1.309,1.571}).setSkyColor(new MFColor(new double[] {0.0,.2,.7,0.0,.5,1.0,1.0,1.0,1.0})))
    .addChild(new Viewpoint().setDescription("Front").setOrientation(0.0,1.0,0.0,-1.57).setPosition(-10.0,0.0,-1.0))
    .addChild(new Viewpoint().setDescription("Front High").setOrientation(.4,1.0,0.0,-1.2).setPosition(-9.0,3.0,0.0))
    .addChild(new Viewpoint().setDescription("left side skirts").setOrientation(0.0,1.0,0.0,-3.14).setPosition(0.0,0.0,-8.0))
    .addChild(new Viewpoint().setDescription("roadWheel").setOrientation(0.0,1.0,0.0,-3.14).setPosition(0.0,-1.0,-4.0))
    .addChild(new Transform("hull_transform").setTranslation(-3.959,-1.7395,-3.479)
      .addChild(new Shape("hull")
        .setAppearance(new Appearance("sand_color")
          .setMaterial(new Material().setDiffuseColor(.8,.7,.6)))
        .setGeometry(new IndexedFaceSet().setSolid(false).setCoordIndex(new int[] {0,8,7,6,5,4,3,2,1,0,-1,9,17,16,15,14,13,12,11,10,9,-1,0,1,10,9,0,-1,1,2,11,10,1,-1,2,3,12,11,2,-1,3,4,13,12,3,-1,4,5,14,13,4,-1,5,6,15,14,5,-1,6,7,16,15,6,-1,7,8,17,16,7,-1,8,0,9,17,8,-1})
          .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {7.918,1.5,0.0,7.918,0.8,0.0,6.5,0.432,0.0,2.0,0.432,0.0,0.5,0.8,0.0,0.0,1.2,0.0,2.5,1.35,0.0,4.5,1.35,0.0,5.4,1.5,0.0,7.918,1.5,3.479,7.918,0.8,3.479,6.5,0.432,3.479,2.0,0.432,3.479,0.5,0.8,3.479,0.0,1.2,3.479,2.5,1.35,3.479,4.5,1.35,3.479,5.4,1.5,3.479})))))
      .addChild(new Shape()
        .setAppearance(new Appearance().setUSE("sand_color"))
        .setGeometry(new IndexedFaceSet().setSolid(false).setCoordIndex(new int[] {0,5,4,3,2,1,0,-1,0,1,7,6,0,-1,6,11,10,9,8,7,6,-1,1,7,8,2,1,-1,8,2,3,9,8,-1,9,3,4,10,9,-1,10,4,5,11,10,-1,11,5,0,6,11,-1})
          .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {7.918,1.5,3.47,7.918,1.266,3.47,1.1,1.266,3.47,2.5,1.35,3.47,4.5,1.35,3.47,5.4,1.5,3.47,7.918,1.5,4.15,7.918,1.266,4.15,1.1,1.266,4.15,2.5,1.35,4.15,4.5,1.35,4.15,5.4,1.5,4.15})))))
      .addChild(new Shape()
        .setAppearance(new Appearance().setUSE("sand_color"))
        .setGeometry(new IndexedFaceSet().setSolid(false).setCoordIndex(new int[] {0,5,4,3,2,1,0,-1,0,1,7,6,0,-1,6,11,10,9,8,7,6,-1,1,7,8,2,1,-1,8,2,3,9,8,-1,9,3,4,10,9,-1,10,4,5,11,10,-1,11,5,0,6,11,-1})
          .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {7.918,1.5,0.05,7.918,1.266,0.05,1.1,1.266,0.05,2.5,1.35,0.05,4.5,1.35,0.05,5.4,1.5,0.05,7.918,1.5,-.63,7.918,1.266,-.63,1.1,1.266,-.63,2.5,1.35,-.63,4.5,1.35,-.63,5.4,1.5,-.63})))))
      .addComments(" Left side skirts ")
      .addChild(new Transform("transform_right_skirts").setTranslation(0.0,-.02,0.0)
        .addChild(new Transform("trans_r_skrt_1").setCenter(2.5,1.35,-.63)
          .addChild(new CylinderSensor("r_skrt_1_sensor").setMaxAngle(0).setMinAngle(-1.57))
          .addChild(new Shape("right_skirt_1")
            .setAppearance(new Appearance().setUSE("sand_color"))
            .setGeometry(new IndexedFaceSet().setCreaseAngle(1.57).setSolid(false).setCoordIndex(new int[] {0,3,2,1,0,-1,4,7,6,5,4,-1,0,4,5,1,0,-1,1,5,6,2,1,-1,2,6,7,3,2,-1,3,0,4,7,3,-1})
              .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {0.5,0.8,-.63,0.0,1.2,-.63,2.5,1.35,-.63,2.5,0.62,-.63,0.5,0.8,-.67,0.0,1.2,-.67,2.5,1.35,-.67,2.5,0.62,-.67}))))))
        .addChild(new ROUTE().setFromNode("r_skrt_1_sensor").setFromField("rotation_changed").setToNode("trans_r_skrt_1").setToField("set_rotation"))
        .addChild(new Transform("trans_r_skrt_2").setCenter(2.5,1.35,-.63)
          .addChild(new CylinderSensor("r_skrt_2_sensor").setMaxAngle(1.57))
          .addChild(new Shape("right_skirt_2")
            .setAppearance(new Appearance().setUSE("sand_color"))
            .setGeometry(new IndexedFaceSet().setCreaseAngle(1.57).setSolid(false).setCoordIndex(new int[] {0,3,2,1,0,-1,4,7,6,5,4,-1,0,1,5,4,0,-1,1,2,6,5,1,-1,2,3,7,6,2,-1,3,0,4,7,3,-1})
              .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {2.51,1.35,-.63,3.3,1.35,-.63,3.3,.62,-.63,2.51,.62,-.63,2.51,1.35,-.67,3.3,1.35,-.67,3.3,.62,-.67,2.51,.62,-.67}))))))
        .addChild(new ROUTE().setFromNode("r_skrt_2_sensor").setFromField("rotation_changed").setToNode("trans_r_skrt_2").setToField("set_rotation"))
        .addChild(new Transform("trans_r_skrt_3").setCenter(4.1,1.35,-.63)
          .addChild(new CylinderSensor("r_skrt_3_sensor").setMaxAngle(0).setMinAngle(-1.57))
          .addChild(new Shape("right_skirt_3")
            .setAppearance(new Appearance().setUSE("sand_color"))
            .setGeometry(new IndexedFaceSet().setCreaseAngle(1.57).setSolid(false).setCoordIndex(new int[] {0,3,2,1,0,-1,4,7,6,5,4,-1,0,1,5,4,0,-1,1,2,6,5,1,-1,2,3,7,6,2,-1,3,0,4,7,3,-1})
              .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {3.31,1.35,-.63,4.1,1.35,-.63,4.1,.62,-.63,3.31,.62,-.63,3.31,1.35,-.67,4.1,1.35,-.67,4.1,.62,-.67,3.31,.62,-.67}))))))
        .addChild(new ROUTE().setFromNode("r_skrt_3_sensor").setFromField("rotation_changed").setToNode("trans_r_skrt_3").setToField("set_rotation"))
        .addChild(new Transform("trans_r_skrt_4").setCenter(4.1,1.35,-.63)
          .addChild(new CylinderSensor("r_skrt_4_sensor").setMaxAngle(1.57))
          .addChild(new Shape("right_skirt_4")
            .setAppearance(new Appearance().setUSE("sand_color"))
            .setGeometry(new IndexedFaceSet().setCreaseAngle(1.57).setSolid(false).setCoordIndex(new int[] {0,3,2,1,0,-1,4,7,6,5,4,-1,0,1,5,4,0,-1,1,2,6,5,1,-1,2,3,7,6,2,-1,3,0,4,7,3,-1})
              .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {4.11,1.35,-.63,4.9,1.35,-.63,4.9,.62,-.63,4.11,.62,-.63,4.11,1.35,-.67,4.9,1.35,-.67,4.9,.62,-.67,4.11,.62,-.67}))))))
        .addChild(new ROUTE().setFromNode("r_skrt_4_sensor").setFromField("rotation_changed").setToNode("trans_r_skrt_4").setToField("set_rotation"))
        .addChild(new Transform("trans_r_skrt_5").setCenter(5.7,1.35,-.63)
          .addChild(new CylinderSensor("r_skrt_5_sensor").setMaxAngle(0).setMinAngle(-2))
          .addChild(new Shape()
            .setAppearance(new Appearance("black")
              .setMaterial(new Material().setDiffuseColor(0.1,.1,.1)))
            .setGeometry(new IndexedFaceSet().setSolid(false).setCoordIndex(new int[] {0,1,5,4,0,-1})
              .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {4.91,1.35,-.63,5.7,1.35,-.63,5.7,.62,-.63,4.91,.62,-.63,4.91,1.35,-.67,5.7,1.35,-.67,5.7,.62,-.67,4.91,.62,-.67})))))
          .addChild(new Shape()
            .setAppearance(new Appearance().setUSE("sand_color"))
            .setGeometry(new IndexedFaceSet().setSolid(false).setCoordIndex(new int[] {4,5,6,7,4,-1})
              .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {4.91,1.35,-.63,5.7,1.35,-.63,5.7,.62,-.63,4.91,.62,-.63,4.91,1.35,-.67,5.7,1.35,-.67,5.7,.62,-.67,4.91,.62,-.67}))))))
        .addChild(new ROUTE().setFromNode("r_skrt_5_sensor").setFromField("rotation_changed").setToNode("trans_r_skrt_5").setToField("set_rotation"))
        .addChild(new Transform("trans_r_skrt_6").setCenter(5.7,1.35,-.63)
          .addChild(new CylinderSensor("r_skrt_6_sensor").setMaxAngle(2))
          .addChild(new Shape()
            .setAppearance(new Appearance().setUSE("black"))
            .setGeometry(new IndexedFaceSet().setSolid(false).setCoordIndex(new int[] {0,1,5,4,0,-1})
              .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {5.71,1.35,-.63,6.5,1.35,-.63,6.5,.62,-.63,5.71,.62,-.63,5.71,1.35,-.67,6.5,1.35,-.67,6.5,.62,-.67,5.71,.62,-.67})))))
          .addChild(new Shape()
            .setAppearance(new Appearance().setUSE("sand_color"))
            .setGeometry(new IndexedFaceSet().setSolid(false).setCoordIndex(new int[] {4,5,6,7,4,-1})
              .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {5.71,1.35,-.63,6.5,1.35,-.63,6.5,.62,-.63,5.71,.62,-.63,5.71,1.35,-.67,6.5,1.35,-.67,6.5,.62,-.67,5.71,.62,-.67})))))
          .addChild(new ROUTE().setFromNode("r_skrt_6_sensor").setFromField("rotation_changed").setToNode("trans_r_skrt_6").setToField("set_rotation"))
          .addChild(new Transform("trans_r_skrt_7").setCenter(6.51,1.35,-0.67)
            .addChild(new CylinderSensor("r_skrt_7_sensor").setMaxAngle(3).setMinAngle(-1.57))
            .addChild(new Shape()
              .setAppearance(new Appearance().setUSE("black"))
              .setGeometry(new IndexedFaceSet().setSolid(false).setCoordIndex(new int[] {0,1,3,2,0,-1})
                .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {6.51,1.35,-.63,7.75,1.35,-.63,6.51,1.35,-.67,7.75,1.35,-.67})))))
            .addChild(new Shape()
              .setAppearance(new Appearance().setUSE("sand_color"))
              .setGeometry(new IndexedFaceSet().setCreaseAngle(3.14).setSolid(false).setCoordIndex(new int[] {0,10,9,8,7,0,-1})
                .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {6.51,1.35,-0.67,7.75,1.35,-0.67,7.75,1.1,-0.67,7.35,1.1,-0.67,7.33,1.09,-0.67,7.31,1.075,-0.67,7.29,1.055,-0.67,7.27,1.02,-0.67,7.25,1.0,-0.67,7.25,0.62,-0.67,6.51,0.62,-0.67})))))
            .addChild(new Shape()
              .setAppearance(new Appearance().setUSE("sand_color"))
              .setGeometry(new IndexedFaceSet().setCreaseAngle(3.14).setSolid(false).setCoordIndex(new int[] {0,7,6,5,4,3,2,1,0,-1})
                .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {6.51,1.35,-0.67,7.75,1.35,-0.67,7.75,1.1,-0.67,7.35,1.1,-0.67,7.33,1.09,-0.67,7.31,1.075,-0.67,7.29,1.055,-0.67,7.27,1.02,-0.67,7.25,1.0,-0.67,7.25,0.62,-0.67,6.51,0.62,-0.67}))))))
          .addChild(new ROUTE().setFromNode("r_skrt_7_sensor").setFromField("rotation_changed").setToNode("trans_r_skrt_7").setToField("set_rotation"))))
      .addComments(" Right side skirts ")
      .addChild(new Transform("transform_left_skirts").setTranslation(0.0,-.02,0.0)
        .addChild(new Shape("left_skirt_1")
          .setAppearance(new Appearance().setUSE("sand_color"))
          .setGeometry(new IndexedFaceSet().setCreaseAngle(1.57).setSolid(false).setCoordIndex(new int[] {0,3,2,1,0,-1,4,7,6,5,4,-1,0,4,5,1,0,-1,1,5,6,2,1,-1,2,6,7,3,2,-1,3,0,4,7,3,-1})
            .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {0.5,0.8,4.15,0.0,1.2,4.15,2.5,1.35,4.15,2.5,0.62,4.15,0.5,0.8,4.19,0.0,1.2,4.19,2.5,1.35,4.19,2.5,0.62,4.19})))))
        .addChild(new Shape("left_skirt_2")
          .setAppearance(new Appearance().setUSE("sand_color"))
          .setGeometry(new IndexedFaceSet().setCreaseAngle(1.57).setSolid(false).setCoordIndex(new int[] {0,3,2,1,0,-1,4,7,6,5,4,-1,0,1,5,4,0,-1,1,2,6,5,1,-1,2,3,7,6,2,-1,3,0,4,7,3,-1})
            .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {2.51,1.35,4.15,3.3,1.35,4.15,3.3,.62,4.15,2.51,.62,4.15,2.51,1.35,4.19,3.3,1.35,4.19,3.3,.62,4.19,2.51,.62,4.19})))))
        .addChild(new Shape("left_skirt_3")
          .setAppearance(new Appearance().setUSE("sand_color"))
          .setGeometry(new IndexedFaceSet().setCreaseAngle(1.57).setSolid(false).setCoordIndex(new int[] {0,3,2,1,0,-1,4,7,6,5,4,-1,0,1,5,4,0,-1,1,2,6,5,1,-1,2,3,7,6,2,-1,3,0,4,7,3,-1})
            .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {3.31,1.35,4.15,4.1,1.35,4.15,4.1,.62,4.15,3.31,.62,4.15,3.31,1.35,4.19,4.1,1.35,4.19,4.1,.62,4.19,3.31,.62,4.19})))))
        .addChild(new Shape("left_skirt_4")
          .setAppearance(new Appearance().setUSE("sand_color"))
          .setGeometry(new IndexedFaceSet().setCreaseAngle(1.57).setSolid(false).setCoordIndex(new int[] {0,3,2,1,0,-1,4,7,6,5,4,-1,0,1,5,4,0,-1,1,2,6,5,1,-1,2,3,7,6,2,-1,3,0,4,7,3,-1})
            .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {4.11,1.35,4.15,4.9,1.35,4.15,4.9,.62,4.15,4.11,.62,4.15,4.11,1.35,4.19,4.9,1.35,4.19,4.9,.62,4.19,4.11,.62,4.19})))))
        .addChild(new Group("left_skirt_5")
          .addChild(new Shape()
            .setAppearance(new Appearance().setUSE("black"))
            .setGeometry(new IndexedFaceSet().setSolid(false).setCoordIndex(new int[] {0,1,5,4,0,-1})
              .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {4.91,1.35,4.15,5.7,1.35,4.15,5.7,.62,4.15,4.91,.62,4.15,4.91,1.35,4.19,5.7,1.35,4.19,5.7,.62,4.19,4.91,.62,4.19})))))
          .addChild(new Shape()
            .setAppearance(new Appearance().setUSE("sand_color"))
            .setGeometry(new IndexedFaceSet().setSolid(false).setCoordIndex(new int[] {4,5,6,7,4,-1})
              .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {4.91,1.35,4.15,5.7,1.35,4.15,5.7,.62,4.15,4.91,.62,4.15,4.91,1.35,4.19,5.7,1.35,4.19,5.7,.62,4.19,4.91,.62,4.19}))))))
        .addChild(new Group("left_skirt_6")
          .addChild(new Shape()
            .setAppearance(new Appearance().setUSE("black"))
            .setGeometry(new IndexedFaceSet().setSolid(false).setCoordIndex(new int[] {0,1,5,4,0,-1})
              .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {5.71,1.35,4.15,6.5,1.35,4.15,6.5,.62,4.15,5.71,.62,4.15,5.71,1.35,4.19,6.5,1.35,4.19,6.5,.62,4.19,5.71,.62,4.19})))))
          .addChild(new Shape()
            .setAppearance(new Appearance().setUSE("sand_color"))
            .setGeometry(new IndexedFaceSet().setSolid(false).setCoordIndex(new int[] {4,5,6,7,4,-1})
              .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {5.71,1.35,4.15,6.5,1.35,4.15,6.5,.62,4.15,5.71,.62,4.15,5.71,1.35,4.19,6.5,1.35,4.19,6.5,.62,4.19,5.71,.62,4.19}))))))
        .addChild(new Group("left_skirt_7")
          .addChild(new Shape()
            .setAppearance(new Appearance().setUSE("black"))
            .setGeometry(new IndexedFaceSet().setSolid(false).setCoordIndex(new int[] {0,1,3,2,0,-1})
              .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {6.51,1.35,4.15,7.75,1.35,4.15,6.51,1.35,4.19,7.75,1.35,4.19})))))
          .addChild(new Shape()
            .setAppearance(new Appearance().setUSE("sand_color"))
            .setGeometry(new IndexedFaceSet().setCreaseAngle(3.14).setSolid(false).setCoordIndex(new int[] {0,10,9,8,7,0,-1})
              .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {6.51,1.35,4.19,7.75,1.35,4.19,7.75,1.1,4.19,7.35,1.1,4.19,7.33,1.09,4.19,7.31,1.075,4.19,7.29,1.055,4.19,7.27,1.02,4.19,7.25,1.0,4.19,7.25,0.62,4.19,6.51,0.62,4.19})))))
          .addChild(new Shape()
            .setAppearance(new Appearance().setUSE("sand_color"))
            .setGeometry(new IndexedFaceSet().setCreaseAngle(3.14).setSolid(false).setCoordIndex(new int[] {0,7,6,5,4,3,2,1,0,-1})
              .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {6.51,1.35,4.19,7.75,1.35,4.19,7.75,1.1,4.19,7.35,1.1,4.19,7.33,1.09,4.19,7.31,1.075,4.19,7.29,1.055,4.19,7.27,1.02,4.19,7.25,1.0,4.19,7.25,0.62,4.19,6.51,0.62,4.19})))))))
      .addChild(new Transform().setRotation(1.0,0.0,0.0,-1.57)
        .addChild(new Transform("trans_r_mudflap").setCenter(1.1,0.0,1.266).setTranslation(0.0,0.63,0.0)
          .addChild(new CylinderSensor("rt_mf_sensor").setMaxAngle(.3))
          .addChild(new Shape("right_mud_flap")
            .setAppearance(new Appearance().setUSE("sand_color"))
            .setGeometry(new IndexedFaceSet().setSolid(false).setCoordIndex(new int[] {0,1,2,3,0,-1,0,3,5,4,0,-1})
              .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {0.1,0.0,1.25,1.1,0.0,1.266,1.1,-0.63,1.266,0.1,-0.63,1.25,0.0,0.0,1.16,0.0,-0.63,1.16})))))))
      .addChild(new ROUTE().setFromNode("rt_mf_sensor").setFromField("rotation_changed").setToNode("trans_r_mudflap").setToField("set_rotation"))
      .addChild(new Transform().setRotation(1.0,0.0,0.0,-1.57)
        .addChild(new Transform("trans_l_mudflap").setCenter(1.1,3.479,1.266).setTranslation(0.0,-7.638,0.0)
          .addChild(new CylinderSensor("lf_mf_sensor").setMaxAngle(.3))
          .addChild(new Shape("left_mud_flap")
            .setAppearance(new Appearance().setUSE("sand_color"))
            .setGeometry(new IndexedFaceSet().setSolid(false).setCoordIndex(new int[] {0,1,2,3,0,-1,0,3,5,4,0,-1})
              .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {0.1,3.479,1.25,1.1,3.479,1.266,1.1,4.159,1.266,0.1,4.159,1.25,0.0,3.479,1.16,0.0,4.159,1.16})))))))
      .addChild(new ROUTE().setFromNode("lf_mf_sensor").setFromField("rotation_changed").setToNode("trans_l_mudflap").setToField("set_rotation")))
    .addComments(" This is the left side road wheels of the tank. ")
    .addChild(new Transform("transform_roadwheel").setTranslation(0.0,-1.2395,0.375)
      .addChild(new Group("wheel_group")
        .addChild(new Transform().setTranslation(.3,0.0,0.0)
          .addChild(new Transform("wheel").setRotation(1.0,0.0,0.0,1.57)
            .addChild(new Shape("wheel_base")
              .setAppearance(new Appearance().setUSE("sand_color"))
              .setGeometry(new Cylinder().setHeight(.025).setRadius(.25)))
            .addChild(new Group("bolt_group_wheel")
              .addChild(new Transform().setTranslation(0.0,-.14,-0.14)
                .addChild(new Shape("nut")
                  .setAppearance(new Appearance().setUSE("sand_color"))
                  .setGeometry(new Cylinder().setHeight(0.005).setRadius(0.01)))
                .addChild(new Shape("bolt")
                  .setAppearance(new Appearance()
                    .setMaterial(new Material().setDiffuseColor(.6,.7,.7)))
                  .setGeometry(new Cylinder().setHeight(.0125).setRadius(0.00625))))
              .addChild(new Transform().setTranslation(0.115,-.14,-.05948)
                .addChild(new Shape().setUSE("nut"))
                .addChild(new Shape().setUSE("bolt")))
              .addChild(new Transform().setTranslation(-0.115,-.14,-.05948)
                .addChild(new Shape().setUSE("nut"))
                .addChild(new Shape().setUSE("bolt")))
              .addChild(new Transform().setTranslation(-0.075,-.14,.075)
                .addChild(new Shape().setUSE("nut"))
                .addChild(new Shape().setUSE("bolt")))
              .addChild(new Transform().setTranslation(0.075,-.14,.075)
                .addChild(new Shape().setUSE("nut"))
                .addChild(new Shape().setUSE("bolt"))))
            .addChild(new Shape("rubber")
              .setAppearance(new Appearance().setUSE("black"))
              .setGeometry(new Extrusion().setCreaseAngle(.4).setCrossSection(getExtrusion_8_190_crossSection()).setSpine(new MFVec3f(new double[] {0.0,-0.015,0.0,0.0,0.205,0.0}))))
            .addChild(new Transform().setTranslation(0.0,-.025,0.0)
              .addChild(new Shape()
                .setGeometry(new Cylinder().setHeight(.05).setRadius(.15))
                .setAppearance(new Appearance().setUSE("sand_color"))))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(.3,-.025,0.0)
          .addChild(new Shape()
            .setGeometry(new Cylinder().setHeight(.125).setRadius(.1))
            .setAppearance(new Appearance().setUSE("sand_color")))
          .addChild(new Transform()
            .addChild(new Shape()
              .setGeometry(new Sphere().setRadius(.0975))
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(0.9,0.9,0.9).setTransparency(.8))))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,-3.14).setTranslation(.3,0.0,-.1150)
          .addChild(new Transform().setUSE("wheel"))))
      .addChild(new Transform().setTranslation(.8,0.0,0.0)
        .addChild(new Group().setUSE("wheel_group")))
      .addChild(new Transform().setTranslation(-.8,0.0,0.0)
        .addChild(new Group().setUSE("wheel_group")))
      .addChild(new Transform().setTranslation(1.6,0.0,0.0)
        .addChild(new Group().setUSE("wheel_group")))
      .addChild(new Transform().setTranslation(-1.6,0.0,0.0)
        .addChild(new Group().setUSE("wheel_group")))
      .addChild(new Transform().setTranslation(-2.4,0.0,0.0)
        .addChild(new Group().setUSE("wheel_group")))
      .addChild(new Transform().setTranslation(2.4,0.0,0.0)
        .addChild(new Group().setUSE("wheel_group")))
      .addChild(new Transform().setTranslation(-3.709,.375,0.0)
        .addChild(new Group().setUSE("wheel_group")))
      .addChild(new Transform("sprocket").setRotation(1.0,0.0,0.0,1.57).setTranslation(3.5,.3734,-.06)
        .addChild(new Shape()
          .setAppearance(new Appearance().setUSE("sand_color"))
          .setGeometry(new Cylinder().setHeight(.6).setRadius(.25).setTop(false)))
        .addChild(new Group()
          .addChild(new Transform().setTranslation(0.0,-.29,0.0)
            .addChild(new Shape("sprocket_bottom")
              .setAppearance(new Appearance().setUSE("sand_color"))
              .setGeometry(new Extrusion().setCreaseAngle(3.14).setCrossSection(new MFVec2f(new double[] {-0.25,0.0,-0.24,0.07,-0.22,0.118743421,-0.2,0.15,-0.17,0.183303028,-0.14,0.207123152,-0.1,0.229128785,-0.05,0.244948974,0.0,0.25,0.05,0.244948974,0.1,0.229128785,0.14,0.207123152,0.17,0.183303028,0.2,0.15,0.22,0.118743421,0.24,0.07,0.25,0.0,0.29,0.0,0.28,0.075498344,0.26,0.128452326,0.24,0.162788206,0.22,0.188944436,0.185,0.223327114,0.15,0.248193473,0.11,0.268328157,0.06,0.283725219,0.0,0.29,-0.06,0.283725219,-0.11,0.268328157,-0.15,0.248193473,-0.185,0.223327114,-0.22,0.188944436,-0.24,0.162788206,-0.26,0.128452326,-0.28,0.075498344,-0.29,0.0,-0.25,0.0})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,0.0,.01,0.0})))))
          .addChild(new Transform().setRotation(0.0,1.0,0.0,3.14).setTranslation(0.0,-.29,0.0)
            .addChild(new Shape().setUSE("sprocket_bottom")))
          .addChild(new Transform().setTranslation(0.0,.28,0.0)
            .addChild(new Shape().setUSE("sprocket_bottom")))
          .addChild(new Transform().setRotation(0.0,1.0,0.0,3.14).setTranslation(0.0,.28,0.0)
            .addChild(new Shape().setUSE("sprocket_bottom"))))
        .addChild(new Transform().setTranslation(0.0,-0.3,0.0)
          .addChild(new Shape()
            .setAppearance(new Appearance().setUSE("sand_color"))
            .setGeometry(new Cylinder().setHeight(.15).setRadius(.075))))))
    .addComments(" This is the left side track assembly ")
    .addChild(new Transform("transform_track").setTranslation(0.0,-1.5095,0.31525)
      .addChild(new Transform().setTranslation(0.0,-0.01,0.0)
        .addChild(new Transform("track_block").setRotation(1.0,0.0,0.0,1.57)
          .addChild(new Shape("heat_tube")
            .setAppearance(new Appearance("metal")
              .setMaterial(new Material().setShininess(.8)))
            .setGeometry(new Cylinder().setHeight(.6).setRadius(.01)))
          .addChild(new Transform().setTranslation(.225,0.0,0.0)
            .addChild(new Shape().setUSE("heat_tube")))
          .addChild(new Transform().setTranslation(.1125,.14,0.0)
            .addChild(new Shape("pad")
              .setAppearance(new Appearance().setUSE("black"))
              .setGeometry(new Box().setSize(.26,.27,.025))))
          .addChild(new Transform().setTranslation(.1125,-.14,0.0)
            .addChild(new Shape().setUSE("pad")))
          .addChild(new Transform().setTranslation(-.021,-.005,0.0)
            .addChild(new Shape()
              .setAppearance(new Appearance().setUSE("metal"))
              .setGeometry(new Extrusion().setCreaseAngle(3.14).setCrossSection(new MFVec2f(new double[] {-0.028,-0.01077033,-0.03,.0001,-.0325,0.0,0.0325,0.0,.0325,.0001,0.028,-0.01077033,0.002,-0.049959984,0.0,-0.05,-0.002,-0.049959984})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,.0,0.0,.01,.0}))))
            .addChild(new Shape()
              .setGeometry(new IndexedFaceSet().setCoordIndex(new int[] {0,2,3,1,0,-1})
                .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {-0.028,0.0,-0.01077,-0.002,0.0,-0.04996,-0.028,0.01,-0.01077,-0.002,0.01,-0.04996,-0.028,0.0,-0.01077}))))
              .setAppearance(new Appearance().setUSE("metal"))))
          .addChild(new Transform().setTranslation(-.021,0.0,0.005525)
            .addChild(new Shape()
              .setAppearance(new Appearance().setUSE("metal"))
              .setGeometry(new Box().setSize(.065,.01,.0115))))
          .addChild(new Transform().setTranslation(.0025,.28,0.0)
            .addChild(new Shape("end_connector")
              .setAppearance(new Appearance().setUSE("metal"))
              .setGeometry(new Extrusion().setCreaseAngle(3.14).setCrossSection(new MFVec2f(new double[] {0.0,0.0125,0.005,0.011456439,0.008,0.009604686,0.01,0.0075,0.0125,0.0,0.01,-0.0075,0.008,-0.009604686,0.005,-0.011456439,0.0,-0.0125,-0.005,-0.011456439,-0.007,-0.010356158,-0.0345,-0.01036,-0.0365,-0.01146,-0.0415,-0.0125,-0.0465,-0.01146,-0.0495,-0.0096,-0.0515,-0.0075,-0.054,0.0,-0.0515,0.0075,-0.0495,0.0096,-0.0465,0.01146,-0.0415,0.0125,-0.0365,0.01146,-0.0345,0.01036,-0.007,0.010356158,-0.005,0.011456439,0.0,0.0125})).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,0.0,.015,0.0})))))
          .addChild(new Transform().setTranslation(0.0,-.295,0.0)
            .addChild(new Shape().setUSE("end_connector")))))
      .addChild(new Transform().setTranslation(-.265,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setTranslation(-.53,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setTranslation(-.795,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setTranslation(-1.06,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setTranslation(-1.325,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setTranslation(-1.59,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setTranslation(-1.855,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setTranslation(-2.12,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setTranslation(-2.385,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-.3).setTranslation(-2.64,.0579,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-.3).setTranslation(-2.8925,0.135,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-.3).setTranslation(-3.145,0.213,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-.3).setTranslation(-3.3975,0.291,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-.67).setTranslation(-3.611,0.442,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-1.24).setTranslation(-3.714,0.68,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-2.3).setTranslation(-3.575,0.885,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.04).setTranslation(-3.325,0.937,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(-3.061,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(-2.796,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(-2.531,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(-2.266,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(-2.001,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(-1.736,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(-1.471,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(-1.206,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(-0.941,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(-0.676,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(-0.411,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(-0.146,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(0.119,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(0.384,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(0.649,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(0.914,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(1.179,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(1.444,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(1.709,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(1.974,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(2.239,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(2.504,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(2.769,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(3.034,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.14).setTranslation(3.299,0.941,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.15).setTranslation(3.564,0.94,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-3.8).setTranslation(3.78,0.8025,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-4.82).setTranslation(3.788,0.555,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-5.5).setTranslation(3.624,0.359,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-5.85).setTranslation(3.3925,0.2375,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-5.85).setTranslation(3.152,0.1275,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-5.8).setTranslation(2.9155,0.0075,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setTranslation(2.654,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setTranslation(2.385,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setTranslation(2.12,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setTranslation(1.855,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setTranslation(1.59,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setTranslation(1.325,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setTranslation(1.06,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setTranslation(.795,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setTranslation(.53,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block")))
      .addChild(new Transform().setTranslation(.265,-0.01,0.0)
        .addChild(new Transform().setUSE("track_block"))))
    .addComments(" Support wheel for the left side of tank ")
    .addChild(new Group("support_roller_group")
      .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(-1.6,-0.6616,-.1)
        .addChild(new Shape()
          .setAppearance(new Appearance().setUSE("sand_color"))
          .setGeometry(new Cylinder().setHeight(.6).setRadius(.03))))
      .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setScale(.3,.3,.3).setTranslation(-1.6,-.6616,.2)
        .addChild(new Shape().setUSE("wheel_base"))
        .addChild(new Shape().setUSE("rubber"))
        .addChild(new Transform().setScale(.5,.5,.5).setTranslation(0.0,0.15,0.0)
          .addChild(new Group().setUSE("bolt_group_wheel")))))
    .addChild(new Transform().setTranslation(2.8,0.0,0.0)
      .addChild(new Group().setUSE("support_roller_group")))
    .addComments(" This is the right side road wheels of the tank. ")
    .addChild(new Transform("right_side_full_wheels").setRotation(1.0,0.0,0.0,-3.14).setTranslation(0.0,-1.2395,-3.85)
      .addChild(new Group().setUSE("wheel_group"))
      .addChild(new Transform().setTranslation(.8,0.0,0.0)
        .addChild(new Group().setUSE("wheel_group")))
      .addChild(new Transform().setTranslation(-.8,0.0,0.0)
        .addChild(new Group().setUSE("wheel_group")))
      .addChild(new Transform().setTranslation(1.6,0.0,0.0)
        .addChild(new Group().setUSE("wheel_group")))
      .addChild(new Transform().setTranslation(-1.6,0.0,0.0)
        .addChild(new Group().setUSE("wheel_group")))
      .addChild(new Transform().setTranslation(2.4,0.0,0.0)
        .addChild(new Group().setUSE("wheel_group")))
      .addChild(new Transform().setTranslation(-2.4,0.0,0.0)
        .addChild(new Group().setUSE("wheel_group")))
      .addChild(new Transform().setTranslation(-3.709,-.375,0.0)
        .addChild(new Group().setUSE("wheel_group")))
      .addChild(new Transform().setTranslation(2.8,0.1,-.45)
        .addChild(new Group().setUSE("support_roller_group")))
      .addChild(new Transform().setTranslation(0.0,0.1,-.45)
        .addChild(new Group().setUSE("support_roller_group")))
      .addChild(new Transform().setTranslation(0.0,-.748,0.0)
        .addChild(new Transform().setUSE("sprocket"))))
    .addComments(" right side track ")
    .addChild(new Transform().setTranslation(0.0,0.0,-4.1)
      .addChild(new Transform().setUSE("transform_track")))
    .addComments(" turret stuff ")
    .addChild(new Transform("turret_group_transform").setTranslation(-1.0,.2,-1.7395)
      .addChild(new Group("turret_group")
        .addChild(new CylinderSensor("turret_sensor"))
        .addChild(new Transform("turret_transform").setRotation(1.0,0.0,0.0,-1.57)
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57)
            .addChild(new Shape("turret")
              .setAppearance(new Appearance().setUSE("sand_color"))
              .setGeometry(new IndexedFaceSet().setSolid(false).setCoordIndex(new int[] {0,1,2,3,4,5,6,0,-1,1,2,8,7,14,1,-1,2,3,9,8,2,-1,3,4,10,9,3,-1,4,5,11,10,4,-1,6,5,11,12,13,6,-1,7,14,16,7,-1,12,13,15,12,-1,13,14,16,15,13,-1,1,6,13,14,1,-1,7,8,17,7,-1,8,9,17,8,-1,9,10,17,9,-1,10,11,17,10,-1,11,12,17,11,-1,12,15,17,12,-1,15,16,17,15,-1,16,7,17,16,-1})
                .setCoord(new Coordinate().setPoint(new MFVec3f(new double[] {-1.814,0.21,0.0,-1.814,0.21,0.305,-0.990,0.21,1.625,2.5,0.21,1.625,2.5,0.21,-1.625,-0.990,0.21,-1.625,-1.814,0.21,-0.305,-2.0,-0.35,0.777,-1.237,-0.35,2.031,2.7,-0.35,2.031,2.7,-0.35,-2.031,-1.237,-0.35,-2.031,-2.0,-0.35,-0.777,-1.95,-0.16,-0.37,-1.95,-0.16,0.37,-1.95,-0.35,-0.37,-1.95,-0.35,0.37,0.0,-0.63,0.0})))))
            .addChild(new Transform().setTranslation(0.8,0.165,1.1)
              .addChild(new Shape()
                .setAppearance(new Appearance().setUSE("black"))
                .setGeometry(new Cylinder().setHeight(.1).setRadius(.4)))
              .addChild(new Transform("trans_ldr_hatch")
                .addChild(new Shape()
                  .setAppearance(new Appearance().setUSE("sand_color"))
                  .setGeometry(new Cylinder().setHeight(.2).setRadius(.4)))))
            .addChild(new Transform().setTranslation(0.8,0.165,-1.1)
              .addChild(new Shape()
                .setAppearance(new Appearance().setUSE("black"))
                .setGeometry(new Cylinder().setHeight(.1).setRadius(.3)))
              .addChild(new Transform()
                .addChild(new Shape()
                  .setAppearance(new Appearance().setUSE("sand_color"))
                  .setGeometry(new Cylinder().setHeight(.3).setRadius(.3)))))
            .addChild(new Transform().setTranslation(-0.8,.18,1.1)
              .addChild(new Shape()
                .setAppearance(new Appearance().setUSE("sand_color"))
                .setGeometry(new Cylinder().setHeight(.2).setRadius(.25))))
            .addChild(new Transform().setTranslation(-0.5,.21,-1.1)
              .addChild(new Shape()
                .setGeometry(new Box().setSize(.12,.12,.25))
                .setAppearance(new Appearance().setUSE("sand_color"))))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(-1.7,-.1,0.0)
          .addChild(new Shape()
            .setAppearance(new Appearance().setUSE("sand_color"))
            .setGeometry(new Cylinder().setHeight(.4).setRadius(.175))))
        .addChild(new Group("guntube_group")
          .addChild(new Transform("guntube_motion").setRotation(1.0,0.0,0.0,-1.57)
            .addChild(new Transform("transform_guntube").setRotation(0.0,1.0,0.0,-1.57).setTranslation(-1.8,-0.07,0.0)
              .addChild(new CylinderSensor("guntube_sensor").setMaxAngle(-1.05).setMinAngle(-1.77))
              .addChild(new Shape("guntube_top")
                .setAppearance(new Appearance().setUSE("metal"))
                .setGeometry(new Extrusion().setCreaseAngle(.8).setCrossSection(new MFVec2f(new double[] {0.0,0.12,0.02,0.118321596,0.04,0.113137085,0.06,0.103923048,0.08,0.089442719,0.1,0.066332496,0.12,0.0,0.1,0.0,0.08,0.06,0.06,0.08,0.04,0.091651514,0.02,0.09797959,0.0,0.1,-0.02,0.09797959,-0.04,0.091651514,-0.06,0.08,-0.08,0.06,-0.1,0.0,-0.12,0.0,-0.1,0.066332496,-0.08,0.089442719,-0.06,0.103923048,-0.04,0.113137085,-0.02,0.118321596,0.0,0.12})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,0.0,0.0,3.25}))))
              .addChild(new Shape("guntube_bottom")
                .setAppearance(new Appearance().setUSE("metal"))
                .setGeometry(new Extrusion().setCreaseAngle(.4).setCrossSection(new MFVec2f(new double[] {0.0,-0.12,0.02,-0.118321596,0.04,-0.113137085,0.06,-0.103923048,0.08,-0.089442719,0.1,-0.066332496,0.12,0.0,0.1,0.0,0.08,-0.06,0.06,-0.08,0.04,-0.091651514,0.02,-0.09797959,0.0,-0.1,-0.02,-0.09797959,-0.04,-0.091651514,-0.06,-0.08,-0.08,-0.06,-0.1,0.0,-0.12,0.0,-0.1,-0.066332496,-0.08,-0.089442719,-0.06,-0.103923048,-0.04,-0.113137085,-0.02,-0.118321596,0.0,-0.12})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,0.0,0.0,3.25}))))
              .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57)
                .addChild(new Transform().setTranslation(0.0,.75,0.0)
                  .addChild(new Shape("bore_evacuator")
                    .setAppearance(new Appearance().setUSE("sand_color"))
                    .setGeometry(new Cylinder().setHeight(.7).setRadius(.15))))
                .addChild(new Transform().setTranslation(0.0,1.58625,0.0)
                  .addChild(new Shape("guntube_shroud")
                    .setAppearance(new Appearance().setUSE("sand_color"))
                    .setGeometry(new Cylinder().setHeight(3.1).setRadius(.13))))
                .addChild(new Transform().setTranslation(.15,3.1,0.0)
                  .addChild(new Shape()
                    .setAppearance(new Appearance()
                      .setMaterial(new Material().setDiffuseColor(.9,.9,.9)))
                    .setGeometry(new Cylinder().setHeight(.06).setRadius(.02))))
                .addChild(new Transform().setRotation(0.0,1.0,0.0,1.57).setTranslation(.13,3.1,0.0)
                  .addChild(new Shape()
                    .setAppearance(new Appearance().setUSE("sand_color"))
                    .setGeometry(new Box().setSize(.04,.06,.01)))))
              .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(0.0,.25,.35)
                .addChild(new Shape()
                  .setAppearance(new Appearance().setUSE("sand_color"))
                  .setGeometry(new Cylinder().setHeight(.4).setRadius(.025)))))))
        .addChild(new Transform().setTranslation(2.5,.3,0.0)
          .addChild(new Shape()
            .setAppearance(new Appearance().setUSE("sand_color"))
            .setGeometry(new Cylinder().setHeight(.25).setRadius(.01)))
          .addChild(new Transform().setTranslation(0.0,.1225,0.0)
            .addChild(new Shape()
              .setAppearance(new Appearance().setUSE("sand_color"))
              .setGeometry(new Box().setSize(.02,.005,.03))))))
      .addChild(new ROUTE().setFromNode("turret_sensor").setFromField("rotation_changed").setToNode("turret_group_transform").setToField("set_rotation"))
      .addChild(new ROUTE().setFromNode("guntube_sensor").setFromField("rotation_changed").setToNode("transform_guntube").setToField("set_rotation"))));
            }
            catch (Exception ex)
            {       
                System.err.println ("*** Further hints on X3DJSAIL errors and exceptions at");
                System.err.println ("*** https://www.web3d.org/specifications/java/X3DJSAIL.html");
                throw (ex);
            }
	}
	// end of initialize() method

		/** Define subarrays using type double[] */
		private double[] getExtrusion_8_190_crossSection_1()
		{
			double[] value = {0.255,0.0,0.254,0.022561028,0.252,0.039,0.25,0.050249378,0.245,0.070710678,0.24,0.08616844,0.2325,0.1047318,0.225,0.12,0.2,0.15819292,0.175,0.18547237,0.15,0.206215906,0.125,0.222261108,0.1,0.234574082,0.075,0.243721152,0.05,0.250049995,0.025,0.253771551,0.0,0.255,-0.025,0.253771551,-0.05,0.250049995,-0.075,0.243721152,-0.1,0.234574082,-0.125,0.222261108,-0.15,0.206215906,-0.175,0.18547237,-0.2,0.15819292,-0.225,0.12,-0.2325,0.1047318,-0.24,0.08616844,-0.245,0.070710678,-0.25,0.050249378,-0.252,0.039,-0.254,0.022561028,-0.25425,0.019543221,-0.2545,0.01596089,-0.25475,0.011288822,-0.25495,0.005049505,-0.255,0.0,-0.25495,-0.005049505,-0.25475,-0.011288822,-0.2545,-0.01596089,-0.25425,-0.019543221,-0.254,-0.022561028,-0.252,-0.039,-0.25,-0.050249378,-0.245,-0.070710678,-0.24,-0.08616844,-0.2325,-0.1047318,-0.225,-0.12,-0.2,-0.15819292,-0.175,-0.18547237,-0.15,-0.206215906,-0.125,-0.222261108,-0.1,-0.234574082,-0.075,-0.243721152,-0.05,-0.250049995,-0.025,-0.253771551,0.0,-0.255,0.025,-0.253771551,0.05,-0.250049995,0.075,-0.243721152,0.1,-0.234574082,0.125,-0.222261108,0.15,-0.206215906,0.175,-0.18547237,0.2,-0.15819292,0.225,-0.12,0.2325,-0.1047318,0.24,-0.08616844,0.245,-0.070710678,0.25,-0.050249378,0.252,-0.039,0.254,-0.022561028,0.25425,-0.019543221,0.2545,-0.01596089,0.25475,-0.011288822,0.25495,-0.005049505,0.26995,-0.005195912,0.26975,-0.01161626,0.2695,-0.016424068,0.26925,-0.020110632,0.269,-0.023216374,0.2685,-0.028420943,0.266,-0.046303348,0.2625,-0.063196123,0.2575,-0.081201909,0.25,-0.10198039,0.225,-0.149248116,0.2,-0.181383571,0.175,-0.205608852,0.15,-0.224499443,0.125,-0.239321959,0.1,-0.250798724,0.075,-0.259374247,0.05,-0.265329983,0.025,-0.268840101,0.0,-0.27,-0.025,-0.268840101,-0.05,-0.265329983,-0.075,-0.259374247,-0.1,-0.250798724};
			return value;
		}
		private double[] getExtrusion_8_190_crossSection_2()
		{
			double[] value = {-0.125,-0.239321959,-0.15,-0.224499443,-0.175,-0.205608852,-0.2,-0.181383571,-0.225,-0.149248116,-0.25,-0.10198039,-0.2575,-0.081201909,-0.2625,-0.063196123,-0.266,-0.046303348,-0.2685,-0.028420943,-0.269,-0.023216374,-0.26925,-0.020110632,-0.2695,-0.016424068,-0.26975,-0.01161626,-0.26995,-0.005195912,-0.26975,0.01161626,-0.2695,0.016424068,-0.26925,0.020110632,-0.269,0.023216374,-0.2685,0.028420943,-0.266,0.046303348,-0.2625,0.063196123,-0.2575,0.081201909,-0.25,0.10198039,-0.225,0.149248116,-0.2,0.181383571,-0.175,0.205608852,-0.15,0.224499443,-0.125,0.239321959,-0.1,0.250798724,-0.075,0.259374247,-0.05,0.265329983,-0.025,0.268840101,0.0,0.27,0.025,0.268840101,0.05,0.265329983,0.075,0.259374247,0.1,0.250798724,0.125,0.239321959,0.15,0.224499443,0.175,0.205608852,0.2,0.181383571,0.225,0.149248116,0.25,0.10198039,0.2575,0.081201909,0.2625,0.063196123,0.266,0.046303348,0.2685,0.028420943,0.2695,0.016424068,0.26975,0.01161626,0.26995,0.005195912,0.27,0.0,0.255,0.0};
			return value;
		}

		/** Large attribute array: Extrusion crossSection field, scene-graph level=8, element #190, 306 total numbers made up of 153 2-tuple values.
		 * Reassemble split array as single method to improve readability and runnability.
		 * Provide large array values via separate methods, hoping to avoid 'code too large' Java compilation errors. 
		 * Individual Java methods (including aggregated initializations) are limited to 64KB.
		 * @see https://stackoverflow.com/questions/2407912/code-too-large-compilation-error-in-java
		 * @see https://stackoverflow.com/questions/11437905/java-too-many-constants-jvm-error
		 */
		private MFVec2f getExtrusion_8_190_crossSection()
		{
			MFVec2f Extrusion_8_190_crossSection = new MFVec2f()/*2.finalize*/
				.append(new MFVec2f(getExtrusion_8_190_crossSection_1()))
				.append(new MFVec2f(getExtrusion_8_190_crossSection_2()));
			return Extrusion_8_190_crossSection;
		}

	/** The initialized model object, created within initialize() method. */
	private X3D x3dModel;

	/** 
	 * Provide a 
	 * <a href="https://dzone.com/articles/java-copy-shallow-vs-deep-in-which-you-will-swim" target="_blank">shallow copy</a>
	 * of the X3D model.
	 * @see <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/Core/X3D.html">X3D</a>
	 * @return M1A1 model
	 */
	public X3D getX3dModel()
	{	  
		return x3dModel;
	}
	   
    /** 
     * Default main() method provided for test purposes, uses CommandLine to set global ConfigurationProperties for this object.
     * @param args array of input parameters, provided as arguments
     * @see <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/Core/X3D.html#handleArguments-java.lang.String:A-">X3D.handleArguments(args)</a>
     * @see <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/Core/X3D.html#validationReport--">X3D.validationReport()</a>
     * @see <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/CommandLine.html">CommandLine</a>
     * @see <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/CommandLine.html#USAGE">CommandLine.USAGE</a>
     * @see <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/ConfigurationProperties.html">ConfigurationProperties</a>
     */
    public static void main(String args[])
    {
        System.out.println("Build this X3D model, showing validation diagnostics...");
        X3D thisExampleX3dModel = new M1A1().getX3dModel();
//      System.out.println("X3D model construction complete.");
	
        // next handle command line arguments
        boolean hasArguments = (args != null) && (args.length > 0);
        boolean validate = true; // default
        boolean argumentsLoadNewModel = false;
        String  fileName = new String();

        if (args != null)
        {
                for (String arg : args)
                {
                        if (arg.toLowerCase().startsWith("-v") || arg.toLowerCase().contains("validate"))
                        {
                                validate = true; // making sure
                        }
                        if (arg.toLowerCase().endsWith(X3D.FILE_EXTENSION_X3D) ||
                                arg.toLowerCase().endsWith(X3D.FILE_EXTENSION_CLASSICVRML) ||
                                arg.toLowerCase().endsWith(X3D.FILE_EXTENSION_X3DB) ||
                                arg.toLowerCase().endsWith(X3D.FILE_EXTENSION_VRML97) ||
                                arg.toLowerCase().endsWith(X3D.FILE_EXTENSION_EXI) ||
                                arg.toLowerCase().endsWith(X3D.FILE_EXTENSION_GZIP) ||
                                arg.toLowerCase().endsWith(X3D.FILE_EXTENSION_ZIP) ||
                                arg.toLowerCase().endsWith(X3D.FILE_EXTENSION_HTML) ||
                                arg.toLowerCase().endsWith(X3D.FILE_EXTENSION_XHTML))
                        {
                                argumentsLoadNewModel = true;
                                fileName = arg;
                        }
                }
        }
        if      (argumentsLoadNewModel)
                System.out.println("WARNING: \"Savage.GroundVehicles.M1A1.M1A1\" model invocation is attempting to load file \"" + fileName + "\" instead of simply validating itself... file loading ignored.");
        else if (hasArguments) // if no arguments provided, this method produces usage warning
                thisExampleX3dModel.handleArguments(args);
	
        if (validate)
        {
            //  System.out.println("--- TODO fix duplicated outputs ---"); // omit when duplicated outputs problem is solved/refactored
		String validationResults = thisExampleX3dModel.validationReport();
            //  System.out.println("-----------------------------------"); // omit when duplicated outputs problem is solved/refactored
                System.out.print("Savage.GroundVehicles.M1A1.M1A1 self-validation test confirmation: ");
                if (!validationResults.equals("success"))
                    System.out.println();
                System.out.println(validationResults.trim());

                // experimental: test X3DJSAIL output files
                // GroundVehicles/M1A1/M1A1_JavaExport.* file validation is checked when building X3D Example Archives
                String filenameX3D  = "GroundVehicles/M1A1/M1A1_JavaExport.x3d"; 
                String filenameX3DV = "GroundVehicles/M1A1/M1A1_JavaExport.x3dv"; 
                String filenameJSON = "GroundVehicles/M1A1/M1A1_JavaExport.json";
                thisExampleX3dModel.toFileX3D        (filenameX3D);
                thisExampleX3dModel.toFileClassicVRML(filenameX3DV);
// TODO         thisExampleX3dModel.toFileJSON       (filenameJSON);
        }
    }
}
