X3D Model Documentation: ProjectileInterpolatorArena.x3d

  1  <?xml version="1.0" encoding="UTF-8"?>
  2 
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "https://www.web3d.org/specifications/x3d-3.0.dtd">
  3  <X3D profile='Immersive' version='3.0 xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='https://www.web3d.org/specifications/x3d-3.0.xsd'>
  4       <head>
  5            <meta name='titlecontent=' ProjectileInterpolatorArena.x3d '/>
  6            <meta name='descriptioncontent='A projectile motion application which displays range and max height values accoding to Vi and theta inputs. Calculations for drag force with air density are also taken into account.'/>
  7            <meta name='creatorcontent='Ozan APAYDIN'/>
  8            <meta name='createdcontent='10 December 2001'/>
  9            <meta name='modifiedcontent='20 October 2019'/>
 10            <meta name='identifiercontent=' https://www.web3d.org/x3d/content/examples/Basic/StudentProjects/ProjectileInterpolatorArena.x3d '/>
 11            <meta name='generatorcontent='X3D-Edit 3.3, https://savage.nps.edu/X3D-Edit'/>
 12            <meta name='licensecontent='../license.html'/>
 13       </head>
<!--

<!--
Event Graph ROUTE Table shows event connections.
-->
<!-- to top DEF nodes index: BallTransform, FirstView, HeightText, HitSensor, HUDGroup, HudProx, HudTransform, ProjectileInterpolator, RangeText, SliderAngle, SliderVelocity, TimeConverter, TimeCycle, Timer, TrajectoryTextTransform, ValueDisplayer

Index for Viewpoint nodes: Viewpoint_1, FirstView

Index for ExternProtoDeclare definitions: ProjectileInterpolator, ProjectileSliderBar
-->
 14       <Scene>
 15            <WorldInfo title='ProjectileInterpolatorArena.x3d'/>
 16            <ExternProtoDeclare name='ProjectileSliderBar'   url=' "ProjectileSliderBarPrototype.wrl#ProjectileSliderBar" "https://www.web3d.org/x3d/content/examples/Basic/StudentProjects/ProjectileSliderBarPrototype.wrl#ProjectileSliderBar" "ProjectileSliderBarPrototype.x3d#ProjectileSliderBar" "https://www.web3d.org/x3d/content/examples/Basic/StudentProjects/ProjectileSliderBarPrototype.x3d#ProjectileSliderBar" '>
 17                 <field name='nametype='MFStringaccessType='initializeOnly'/>
 18                 <field name='lengthtype='SFFloataccessType='initializeOnly'/>
 19                 <field name='widthtype='SFFloataccessType='initializeOnly'/>
 20                 <field name='maxValuetype='SFFloataccessType='initializeOnly'/>
 21                 <field name='minValuetype='SFFloataccessType='initializeOnly'/>
 22                 <field name='barColortype='SFColoraccessType='initializeOnly'/>
 23                 <field name='pointerColortype='SFColoraccessType='initializeOnly'/>
 24                 <field name='nameColortype='SFColoraccessType='initializeOnly'/>
 25                 <field name='currentValueColortype='SFColoraccessType='initializeOnly'/>
 26                 <field name='currentValueInttype='SFInt32accessType='outputOnly'/>
 27                 <field name='currentValueFloattype='SFFloataccessType='outputOnly'/>
 28                 <field name='precisiontype='SFInt32accessType='initializeOnly'/>
 29                 <field name='translationtype='SFVec3faccessType='initializeOnly'/>
 30            </ExternProtoDeclare>
 31            <ExternProtoDeclare name='ProjectileInterpolator'   url=' "ProjectileInterpolatorPrototype.wrl#ProjectileInterpolator" "https://www.web3d.org/x3d/content/examples/Basic/StudentProjects/ProjectileInterpolatorPrototype.wrl#ProjectileInterpolator" "ProjectileInterpolatorPrototype.x3d#ProjectileInterpolator" "https://www.web3d.org/x3d/content/examples/Basic/StudentProjects/ProjectileInterpolatorPrototype.x3d#ProjectileInterpolator" '>
 32                 <field name='Vitype='SFFloataccessType='initializeOnly'/>
 33                 <field name='thetatype='SFFloataccessType='initializeOnly'/>
 34                 <field name='B_mtype='SFFloataccessType='initializeOnly'/>
 35                 <field name='dttype='SFFloataccessType='initializeOnly'/>
 36                 <field name='fractiontype='SFFloataccessType='initializeOnly'/>
 37                 <field name='set_fractiontype='SFFloataccessType='inputOnly'/>
 38                 <field name='set_thetatype='SFFloataccessType='inputOnly'/>
 39                 <field name='set_Vitype='SFFloataccessType='inputOnly'/>
 40                 <field name='value_changedtype='SFVec3faccessType='outputOnly'/>
 41            </ExternProtoDeclare>
 42            <Viewpoint DEF='FirstViewdescription='First viewposition='60 15 150'/>
 43            <Background groundAngle='1.309 1.570796groundColor='0 0 0skyAngle='1.309 1.571'   backUrl=' "urn:web3d:media:textures/panoramas/space_1_back.jpg" "space_1_back.jpg " "https://www.web3d.org/WorkingGroups/media/textures/panoramas/space_1_back.jpg " "https://www.web3d.org/x3d/content/examples/Basic/UniversalMediaPanoramas/space_1_back.jpg " "http://www.web3dmedia.com/UniversalMedia/textures/panoramas/space_1_back.jpg " "http://www.officetowers.com/UniversalMedia/textures/panoramas/space_1_back.jpg " "http://geometrek.com/UniversalMedia/textures/panoramas/space_1_back.jpg " "http://www.sc.ehu.es/ccwgamoa/UniversalMedia/textures/panoramas/space_1_back.jpg " '   bottomUrl=' "urn:web3d:media:textures/panoramas/space_1_bottom.jpg" "space_1_bottom.jpg " "https://www.web3d.org/WorkingGroups/media/textures/panoramas/space_1_bottom.jpg " "https://www.web3d.org/x3d/content/examples/Basic/UniversalMediaPanoramas/space_1_bottom.jpg " "http://www.web3dmedia.com/UniversalMedia/textures/panoramas/space_1_bottom.jpg " "http://www.officetowers.com/UniversalMedia/textures/panoramas/space_1_bottom.jpg " "http://geometrek.com/UniversalMedia/textures/panoramas/space_1_bottom.jpg " "http://www.sc.ehu.es/ccwgamoa/UniversalMedia/textures/panoramas/space_1_bottom.jpg " '   frontUrl=' "urn:web3d:media:textures/panoramas/space_1_front.jpg" "space_1_front.jpg " "https://www.web3d.org/WorkingGroups/media/textures/panoramas/space_1_front.jpg " "https://www.web3d.org/x3d/content/examples/Basic/UniversalMediaPanoramas/space_1_front.jpg " "http://www.web3dmedia.com/UniversalMedia/textures/panoramas/space_1_front.jpg " "http://www.officetowers.com/UniversalMedia/textures/panoramas/space_1_front.jpg " "http://geometrek.com/UniversalMedia/textures/panoramas/space_1_front.jpg " "http://www.sc.ehu.es/ccwgamoa/UniversalMedia/textures/panoramas/space_1_front.jpg " '   leftUrl=' "urn:web3d:media:textures/panoramas/space_1_left.jpg" "space_1_left.jpg " "https://www.web3d.org/WorkingGroups/media/textures/panoramas/space_1_left.jpg " "https://www.web3d.org/x3d/content/examples/Basic/UniversalMediaPanoramas/space_1_left.jpg " "http://www.web3dmedia.com/UniversalMedia/textures/panoramas/space_1_left.jpg " "http://www.officetowers.com/UniversalMedia/textures/panoramas/space_1_left.jpg " "http://geometrek.com/UniversalMedia/textures/panoramas/space_1_left.jpg " "http://www.sc.ehu.es/ccwgamoa/UniversalMedia/textures/panoramas/space_1_left.jpg " '   rightUrl=' "urn:web3d:media:textures/panoramas/space_1_right.jpg" "space_1_right.jpg " "https://www.web3d.org/WorkingGroups/media/textures/panoramas/space_1_right.jpg " "https://www.web3d.org/x3d/content/examples/Basic/UniversalMediaPanoramas/space_1_right.jpg " "http://www.web3dmedia.com/UniversalMedia/textures/panoramas/space_1_right.jpg " "http://www.officetowers.com/UniversalMedia/textures/panoramas/space_1_right.jpg " "http://geometrek.com/UniversalMedia/textures/panoramas/space_1_right.jpg " "http://www.sc.ehu.es/ccwgamoa/UniversalMedia/textures/panoramas/space_1_right.jpg " '   topUrl=' "urn:web3d:media:textures/panoramas/space_1_top.jpg" "space_1_top.jpg " "https://www.web3d.org/WorkingGroups/media/textures/panoramas/space_1_top.jpg " "https://www.web3d.org/x3d/content/examples/Basic/UniversalMediaPanoramas/space_1_top.jpg " "http://www.web3dmedia.com/UniversalMedia/textures/panoramas/space_1_top.jpg " "http://www.officetowers.com/UniversalMedia/textures/panoramas/space_1_top.jpg " "http://geometrek.com/UniversalMedia/textures/panoramas/space_1_top.jpg " "http://www.sc.ehu.es/ccwgamoa/UniversalMedia/textures/panoramas/space_1_top.jpg " '/>
 44            <DirectionalLight direction='0 -1 0intensity='0.5'/>
 45 
          <!-- ROUTE information for SliderVelocity node:  [from currentValueFloat to ProjectileInterpolator.set_Vi ] -->
          <ProtoInstance name='ProjectileSliderBarDEF='SliderVelocity'>
 46                 <fieldValue name='namevalue='"Vi"'/>
 47                 <fieldValue name='lengthvalue='1.5'/>
 48                 <fieldValue name='widthvalue='1'/>
 49                 <fieldValue name='maxValuevalue='30'/>
 50                 <fieldValue name='minValuevalue='0'/>
 51                 <fieldValue name='barColorvalue='0 0 1'/>
 52                 <fieldValue name='pointerColorvalue='1 1 0'/>
 53                 <fieldValue name='nameColorvalue='1 0 1'/>
 54                 <fieldValue name='precisionvalue='1'/>
 55                 <fieldValue name='translationvalue='-0.04 0.06 0.0'/>
 56            </ProtoInstance>
 57 
          <!-- ROUTE information for SliderAngle node:  [from currentValueFloat to ProjectileInterpolator.set_theta ] -->
          <ProtoInstance name='ProjectileSliderBarDEF='SliderAngle'>
 58                 <fieldValue name='namevalue='"Theta"'/>
 59                 <fieldValue name='lengthvalue='1.5'/>
 60                 <fieldValue name='widthvalue='1'/>
 61                 <fieldValue name='maxValuevalue='90'/>
 62                 <fieldValue name='minValuevalue='0'/>
 63                 <fieldValue name='barColorvalue='1 0 0'/>
 64                 <fieldValue name='pointerColorvalue='1 1 0'/>
 65                 <fieldValue name='nameColorvalue='0 1 1'/>
 66                 <fieldValue name='precisionvalue='1'/>
 67                 <fieldValue name='translationvalue='-0.04 0.05 0.0'/>
 68            </ProtoInstance>
 69 
          <!-- ROUTE information for TimeCycle node:  [from currentValueFloat to TimeConverter.setTime ] -->
          <ProtoInstance name='ProjectileSliderBarDEF='TimeCycle'>
 70                 <fieldValue name='namevalue='"CycleInterval"'/>
 71                 <fieldValue name='lengthvalue='1.5'/>
 72                 <fieldValue name='widthvalue='1'/>
 73                 <fieldValue name='maxValuevalue='5'/>
 74                 <fieldValue name='minValuevalue='1'/>
 75                 <fieldValue name='barColorvalue='0 1 0'/>
 76                 <fieldValue name='pointerColorvalue='1 1 0'/>
 77                 <fieldValue name='nameColorvalue='0 0.3 1'/>
 78                 <fieldValue name='precisionvalue='1'/>
 79                 <fieldValue name='translationvalue='-0.04 0.04 0.0'/>
 80            </ProtoInstance>
 81 
 82            < ROUTE  fromNode='SliderVelocity' fromField='currentValueFloat' toNode='ProjectileInterpolator' toField='set_Vi'/>
 83            < ROUTE  fromNode='SliderAngle' fromField='currentValueFloat' toNode='ProjectileInterpolator' toField='set_theta'/>
 84            <Transform>
 85                 <Group DEF='HUDGroup'>
 86                      <Collision enabled='false'>
 87 
                         <!-- ROUTE information for HudProx node:  [from position_changed to HudTransform.set_translation ] [from orientation_changed to HudTransform.set_rotation ] [self-route from position_changed to center ] -->
                         <ProximitySensor DEF='HudProxsize='1000000 1000000 1000000'/>
 88 
                         <!-- ROUTE information for HudTransform node:  [from HudProx.position_changed to set_translation ] [from HudProx.orientation_changed to set_rotation ] -->
                         <Transform DEF='HudTransform'>
 89                                <Transform translation='0.05 0.06 -0.2'>
 90                                     <Transform DEF='TrajectoryTextTransform'>
 91                                          <Shape>
 92 
                                             <!-- Text RangeText is a DEF node that has 1 USE node: USE_1 -->
                                             <Text DEF='RangeTextstring='"Range 0.0"'>
 93                                                    <FontStyle size='0.01style='BOLD'/>
 94                                               </Text>
 95                                               <Appearance>
 96                                                    <Material diffuseColor='0.9 0.7 0.0'/>
 97                                               </Appearance>
 98                                          </Shape>
 99                                     </Transform>
100                                     <Transform translation='0.0 -0.015 0.0'>
101                                          <Shape>
102 
                                             <!-- Text HeightText is a DEF node that has 1 USE node: USE_1 -->
                                             <Text DEF='HeightTextstring='"Max Height 0.0"'>
103                                                    <FontStyle size='0.01style='BOLD'/>
104                                               </Text>
105                                               <Appearance>
106                                                    <Material diffuseColor='0 1 0'/>
107                                               </Appearance>
108                                          </Shape>
109                                     </Transform>
110                                </Transform>
111                           </Transform>
112                      </Collision>
113                 </Group>
114            </Transform>
115            < ROUTE  fromNode='HudProx' fromField='position_changed' toNode='HudTransform' toField='set_translation'/>
116            < ROUTE  fromNode='HudProx' fromField='position_changed' toNode='HudProx' toField='center'/>
117            < ROUTE  fromNode='HudProx' fromField='orientation_changed' toNode='HudTransform' toField='set_rotation'/>
118 
          <!-- ROUTE information for ValueDisplayer node:  [from ProjectileInterpolator.value_changed to setTextValues ] [from HitSensor.isActive to reset ] -->
          <Script DEF='ValueDisplayerdirectOutput='true'>
119                 <field name='setTextValuestype='SFVec3faccessType='inputOnly'/>
120                 <field name='resettype='SFBoolaccessType='inputOnly'/>
121                 <field name='RangeTexttype='SFNodeaccessType='initializeOnly'>
122                      <Text USE='RangeText'/>
123                 </field>
124                 <field name='HeightTexttype='SFNodeaccessType='initializeOnly'>
125                      <Text USE='HeightText'/>
126                 </field>
  <![CDATA[
      
ecmascript:
var maxValue;

function initialize() {
   maxValue = 0;
}

function setTextValues(values, timeEvent) {
   var precision = 2;
   RangeText.string[0] ='Range            ' + roundOff(values[0], precision);
   if(values[1] > maxValue) {
      maxValue = roundOff(values[1], precision);
      Browser.println ('maximum' + maxValue);
   }

   Browser.println ('values' + values[1]);
   HeightText.string[0] ='Max Height   ' + maxValue;
}

function reset(bool, eventTime) {
   maxValue = 0;
}

//A function to round the values regarding to given precision.
function roundOff(value, precision) {

   var result;
   var isNegative = false;
   var wholeInt = Math.round(value * Math.pow(10, precision));
 
   //Negative numbers creates exceptional condition, therefor they are converted
   //to positive values.
   if(wholeInt < 0) {
      wholeInt = -wholeInt;
      isNegative = true;
   }

   var whole = wholeInt.toString();
   
   var decPoint = whole.length - precision;
   
   //Exception when precision is bigger than the string length   
   if(decPoint < 0) {
      i = -decPoint;
      for(i; i > 0; i--) {  
         whole ='0' + whole;
      }

      //Calculate decPoint according to new string expanded with 0s      
      decPoint = whole.length - precision;
   }

   if(whole !='0') {
      //Put the decimal point on the appropriate place
      result = whole.substring(0, decPoint);
      result +='.';
      result += whole.substring(decPoint, whole.length);
   }
   else { //If the string is'0', then result is'0'
      result = whole;
   }
   
   //Negative numbers are altered.
   if(isNegative) {
      result ='-' + result;
   }
   //Convert the String value to Float.
   resultFloat = parseFloat(result); 
  
  
   return resultFloat;
  
}

    
]]>
128            </Script>
129            < ROUTE  fromNode='ProjectileInterpolator' fromField='value_changed' toNode='ValueDisplayer' toField='setTextValues'/>
130            <Transform translation='0.0 -0.7 0.0'>
131                 <Collision>
132                      <Shape>
133                           <Appearance>
134                                <ImageTexture   url=' "grass_1.jpg " "https://www.web3d.org/x3d/content/examples/Basic/StudentProjects/grass_1.jpg " "https://www.web3d.org/WorkingGroups/media/textures/nature/grass_1.jpg " '/>
135                                <TextureTransform scale='8 4'/>
136                           </Appearance>
137                           <ElevationGrid xDimension='4xSpacing='40zSpacing='25height='-0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75'/>
138                      </Shape>
139                 </Collision>
140            </Transform>
141            <Transform translation='0 0 12.5'>
142 
               <!-- ROUTE information for BallTransform node:  [from ProjectileInterpolator.value_changed to set_translation ] -->
               <Transform DEF='BallTransform'>
143                      <Shape>
144                           <Appearance>
145                                <Material diffuseColor='1 0 0'/>
146                           </Appearance>
147                           <Sphere radius='1.5'/>
148                      </Shape>
149                      <Viewpoint description='BallViewposition='0 10 70'/>
150 
                    <!-- ROUTE information for HitSensor node:  [from touchTime to Timer.set_startTime ] [from isActive to ValueDisplayer.reset ] -->
                    <TouchSensor DEF='HitSensor'/>
151                 </Transform>
152            </Transform>
153 
          <!-- TimeSensor Timer is a DEF node that has 1 USE node: USE_1
          <!-- ROUTE information for Timer node:  [from HitSensor.touchTime to set_startTime ] [from fraction_changed to ProjectileInterpolator.set_fraction ] -->
          <TimeSensor DEF='TimercycleInterval='3.5'/>
154            < ROUTE  fromNode='Timer' fromField='fraction_changed' toNode='ProjectileInterpolator' toField='set_fraction'/>
155            < ROUTE  fromNode='HitSensor' fromField='touchTime' toNode='Timer' toField='set_startTime'/>
156            < ROUTE  fromNode='HitSensor' fromField='isActive' toNode='ValueDisplayer' toField='reset'/>
157            < ROUTE  fromNode='ProjectileInterpolator' fromField='value_changed' toNode='BallTransform' toField='set_translation'/>
158 
          <!-- ROUTE information for TimeConverter node:  [from TimeCycle.currentValueFloat to setTime ] -->
          <Script DEF='TimeConverterdirectOutput='true'>
159                 <field name='TimerNodetype='SFNodeaccessType='initializeOnly'>
160                      <TimeSensor USE='Timer'/>
161                 </field>
162                 <field name='setTimetype='SFFloataccessType='inputOnly'/>
  <![CDATA[
      
ecmascript:
function initialize() {
}

function setTime(inputTime, timeEvent) {
   TimerNode.cycleInterval = inputTime;
}

    
]]>
164            </Script>
165            < ROUTE  fromNode='TimeCycle' fromField='currentValueFloat' toNode='TimeConverter' toField='setTime'/>
166       </Scene>
167  </X3D>
<!--

<!--
Event Graph ROUTE Table shows event connections.
-->
<!-- to top DEF nodes index: BallTransform, FirstView, HeightText, HitSensor, HUDGroup, HudProx, HudTransform, ProjectileInterpolator, RangeText, SliderAngle, SliderVelocity, TimeConverter, TimeCycle, Timer, TrajectoryTextTransform, ValueDisplayer

Index for Viewpoint nodes: Viewpoint_1, FirstView

Index for ExternProtoDeclare definitions: ProjectileInterpolator, ProjectileSliderBar
-->
X3D Tooltips element index: Appearance, Background, Collision, DirectionalLight, ElevationGrid, ExternProtoDeclare, field, fieldValue, FontStyle, Group, head, ImageTexture, Material, meta, ProtoInstance, ProximitySensor, ROUTE, Scene, Script, Shape, Sphere, Text, TextureTransform, TimeSensor, TouchSensor, Transform, Viewpoint, WorldInfo, X3D, plus documentation for accessType definitions, type definitions, XML data types, and field types

Event Graph ROUTE Table entries with 11 ROUTE connections total, showing X3D event-model relationships for this scene.

Each row shows an event cascade that may occur during a single timestamp interval between frame renderings, as part of the X3D execution model.

HitSensor
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
Timer
TimeSensor
set_startTime
SFTime
then
 
 
 
Timer
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(2)
ProjectileInterpolator
ProtoInstance
set_fraction
SFFloat
then
 
 
 
ProjectileInterpolator
ProtoInstance
value_changed
SFVec3f

ROUTE
event to
(3)
ValueDisplayer
Script
setTextValues
SFVec3f
  then
 
 
 
ProjectileInterpolator
ProtoInstance
value_changed
SFVec3f

ROUTE
event to
(3)
BallTransform
Transform
set_translation
SFVec3f
HitSensor
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
ValueDisplayer
Script
reset
SFBool

      TimeConverter
Script
No direct ROUTE connection found for events to/from this node.
Contains SFNode field with direct access to another node. 

      ValueDisplayer
Script
No direct ROUTE connection found for events to/from this node.
Contains SFNode fields with direct access to another node. 

HudProx
ProximitySensor
position_changed
SFVec3f

ROUTE
event to
(1)
HudTransform
Transform
set_translation
SFVec3f
HudProx
ProximitySensor
orientation_changed
SFRotation

ROUTE
event to
(1)
HudTransform
Transform
set_rotation
SFRotation

      ProjectileInterpolator
ProtoInstance
value_changed
SFVec3f

ROUTE
event to
(1)
ValueDisplayer
Script
setTextValues
SFVec3f
ProjectileInterpolator
ProtoInstance
value_changed
SFVec3f

ROUTE
event to
(1)
BallTransform
Transform
set_translation
SFVec3f

SliderAngle
ProtoInstance
currentValueFloat
SFFloat

ROUTE
event to
(1)
ProjectileInterpolator
ProtoInstance
set_theta
SFFloat
then
 
 
 
ProjectileInterpolator
ProtoInstance
value_changed
SFVec3f

ROUTE
event to
(2)
ValueDisplayer
Script
setTextValues
SFVec3f
  then
 
 
 
ProjectileInterpolator
ProtoInstance
value_changed
SFVec3f

ROUTE
event to
(2)
BallTransform
Transform
set_translation
SFVec3f

SliderVelocity
ProtoInstance
currentValueFloat
SFFloat

ROUTE
event to
(1)
ProjectileInterpolator
ProtoInstance
set_Vi
SFFloat
then
 
 
 
ProjectileInterpolator
ProtoInstance
value_changed
SFVec3f

ROUTE
event to
(2)
ValueDisplayer
Script
setTextValues
SFVec3f
  then
 
 
 
ProjectileInterpolator
ProtoInstance
value_changed
SFVec3f

ROUTE
event to
(2)
BallTransform
Transform
set_translation
SFVec3f

TimeCycle
ProtoInstance
currentValueFloat
SFFloat

ROUTE
event to
(1)
TimeConverter
Script
setTime
SFFloat

Additional guidance on X3D animation can be found in the 10-Step Animation Design Process and Event Tracing hint sheets. Have fun with X3D! 😀

-->
<!-- Online at
https://www.web3d.org/x3d/content/examples/Basic/StudentProjects/ProjectileInterpolatorArenaIndex.html -->
<!-- Version control at
https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/content/examples/Basic/StudentProjects/ProjectileInterpolatorArena.x3d -->

<!-- Color-coding legend: X3D terminology <X3dNode  DEF='idNamefield='value'/> matches XML terminology <XmlElement  DEF='idNameattribute='value'/>
(Light-blue background: event-based behavior node or statement) (Grey background inside box: inserted documentation) (Magenta background: X3D Extensibility)
    <ProtoInstance name='ProtoName'> <field name='fieldName'/> </ProtoInstance> -->

to top <!-- For additional help information about X3D scenes, please see X3D Tooltips, X3D Resources, and X3D Scene Authoring Hints. -->