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='title' content='M198Howitzer.x3d'/> |
6 | <meta name='description' content='M198 Howitzer to scale'/> |
7 | <meta name='creator' content='J.P. McDonough'/> |
8 | <meta name='created' content='7 January 2004'/> |
9 | <meta name='modified' content='28 November 2019'/> |
10 | <meta name='reference' content='M198-dvic502.jpg'/> |
11 | <meta name='reference' content='Impact.avi'/> |
12 | <meta name='reference' content='http://www.army.mil/fact_files_site/m198'/> |
13 | <meta name='reference' content='https://www.fas.org/man/dod-101/sys/land/m198.htm'/> |
14 | <meta name='identifier' content='https://savage.nps.edu/Savage/Weapons/Guns/M198Howitzer.x3d'/> |
15 | <meta name='generator' content='X3D-Edit, https://savage.nps.edu/X3D-Edit'/> |
16 | <meta name='license' content='../../license.html'/> |
17 | </head> |
18 | <Scene> |
19 | <WorldInfo title='M198Howitzer.x3d'/> |
20 | <ExternProtoDeclare name='ViewPositionOrientation' appinfo='ViewPositionOrientation provides provides console output of local position and orientation as user navigates' url=' "../../../Savage/Tools/Authoring/ViewPositionOrientationPrototype.x3d#ViewPositionOrientation" "https://savage.nps.edu/Savage/Tools/Authoring/ViewPositionOrientationPrototype.x3d#ViewPositionOrientation" "../../../Savage/Tools/Authoring/ViewPositionOrientationPrototype.wrl#ViewPositionOrientation" "https://savage.nps.edu/Savage/Tools/Authoring/ViewPositionOrientationPrototype.wrl#ViewPositionOrientation" '> |
21 |
<field name='enabled' type='SFBool' accessType='inputOutput'
appinfo='Whether or not ViewPositionOrientation sends output to console.'/> |
22 |
<field name='traceEnabled' type='SFBool' accessType='initializeOnly'
appinfo='Output internal trace messages for debugging this node - developer use only can be ignored.'/> |
23 |
<field name='set_traceEnabled' type='SFBool' accessType='inputOnly'
appinfo='Ability to turn output tracing on/off at runtime.'/> |
24 |
<field name='position_changed' type='SFVec3f' accessType='outputOnly'
appinfo='Output local position.'/> |
25 |
<field name='orientation_changed' type='SFRotation' accessType='outputOnly'
appinfo='Output local orientation.'/> |
26 |
<field name='outputViewpointString' type='MFString' accessType='outputOnly'
appinfo='MFString value of new Viewpoint'/> |
27 | </ExternProtoDeclare> |
28 | <ProtoInstance name='ViewPositionOrientation' DEF='ExampleViewPositionOrientation'> |
29 | <fieldValue name='enabled' value='false'/> |
30 | </ProtoInstance> |
31 | <Sound maxBack='100' maxFront='100' minBack='0.01' minFront='0.01'> |
32 |
<!-- ROUTE information for CannonFireSound node:
[from shootRound.touchTime to startTime
]
-->
<AudioClip DEF='CannonFireSound' description='Cannon fire sound' url=' "../../GroundVehicles/T72M/CannonFire.wav" "https://savage.nps.edu/Savage/GroundVehicles/T72M/CannonFire.wav" '/> |
33 | </Sound> |
34 | <Viewpoint DEF='betweenTrails' description='between Trails' orientation='-1 0 0 0' position='0 1.4 10'/> |
35 | <Viewpoint DEF='sideViewClose' description='Side View Close' orientation='0.007 0.997 0.076 1.7635' position='9.8 2.2 -1.8'/> |
36 | <Viewpoint DEF='sideView' description='from Side' orientation='0 1 0 1.57' position='320 10 -160'/> |
37 | <Viewpoint DEF='underTube' description='under Tube' orientation='-0.02 -0.982 -0.19 3.1266' position='0 5.7 -7.4'/> |
38 | <Viewpoint DEF='downBarrel' description='down Barrel' orientation='0.012 -0.925 -0.381 3.138' position='-0.1 7.6 -6.7'/> |
39 | <!-- Roughly to scale. --> |
40 | <Group DEF='M198_Howitzer'> |
41 | <Group DEF='LowerCar'> |
42 | <Shape> |
43 | <Cylinder DEF='LowerCarriage1' height='.5'/> |
44 | |
45 | <Material DEF='cami' ambientIntensity='0.25' diffuseColor='0.054 0.233 0.39' shininess='0'/> |
46 |
<!-- ImageTexture
camo is a DEF node that has 1 USE node: USE_1 --> <ImageTexture DEF='camo' repeatS='false' repeatT='false' url=' "greenCamo.jpg ![]() ![]() |
47 | </Appearance> |
48 | </Shape> |
49 |
<!-- ROUTE information for rightTrailMover node:
[from trailSpreader.rotation_changed to set_rotation
]
-->
<Transform DEF='rightTrailMover' translation='.1 0 0'> |
50 | <Transform DEF='RightTrail' rotation='0 1 0 -1.1' translation='0 -.3 0'> |
51 | <Transform DEF='brakeResevoir' rotation='0 1 0 1.57' translation='2 .27 0'> |
52 | <Transform rotation='1 0 0 1.57' scale='1.6 1 1.2'> |
53 | <Shape> |
54 | <Cylinder height='1.2' radius='.15'/> |
55 | <Appearance USE='camiPaint'/> |
56 | </Shape> |
57 | </Transform> |
58 | </Transform> |
59 | <Transform DEF='basePlateClamp' rotation='0 1 0 1.7' scale='.05 .05 .05' translation='2.7 .6 -.2'> |
60 | |
61 | <Extrusion crossSection='0 0 1 0 1 2 3 2 3 3 0 3 0 0' solid='false' spine='0 0 0 2 0 0'/> |
62 | <Appearance USE='camiPaint'/> |
63 | </Shape> |
64 | </Transform> |
65 | <Transform rotation='0 1 0 -1.7' scale='.05 .05 .05' translation='1.7 .6 -.2'> |
66 | <Shape USE='clamp'/> |
67 | </Transform> |
68 | <Transform rotation='1 0 0 -1.57'> |
69 | <Transform scale='.22 .3 .19'> |
70 | |
71 | <Extrusion crossSection='0 0 0 3 16 2.2 20 1 20 -1 18.5 -1 18 0 0 0' spine='0 0 0 0 1.5 0'/> |
72 | <Appearance USE='camiPaint'/> |
73 | </Shape> |
74 | </Transform> |
75 | </Transform> |
76 | </Transform> |
77 | <Transform DEF='RightSpade' rotation='0 1 0 .5' scale='.07 .1 .1' translation='2.9 -0.45 3.45'> |
78 | <Transform rotation='0 1 0 3.14'> |
79 | <Transform rotation='1 0 0 -1.57'> |
80 | |
81 | <Appearance USE='camiPaint'/> |
82 | <Extrusion crossSection='0 0 5 0 4 -5 4 -4 3.85 -3.5 3.75 -3 3.5 -2 3 -1 0 -.5 0 0' spine='0 0 0 20 0 0'/> |
83 | </Shape> |
84 | </Transform> |
85 | </Transform> |
86 | </Transform> |
87 |
<!-- ROUTE information for trailSpreader node:
[from rotation_changed to rightTrailMover.set_rotation
]
-->
<CylinderSensor DEF='trailSpreader' description='Used to spread the trails' maxAngle='0' minAngle='-.5'/> |
88 | < ROUTE fromNode='trailSpreader' fromField='rotation_changed' toNode='rightTrailMover' toField='set_rotation'/> |
89 | </Transform> |
90 |
<!-- ROUTE information for leftTrailMover node:
[from lTrailSpreader.rotation_changed to set_rotation
]
-->
<Transform DEF='leftTrailMover' translation='-.1 0 0'> |
91 | <Transform DEF='leftTrail' rotation='0 1 0 -2.1' translation='-.5 -.3 -.25'> |
92 | <Transform DEF='lbasePlateClamp' rotation='0 1 0 1.7' scale='.05 .05 .05' translation='2.7 .6 -.2'> |
93 | <Shape USE='clamp'/> |
94 | </Transform> |
95 | <Transform rotation='0 1 0 -1.7' scale='.05 .05 .05' translation='1.7 .6 -.2'> |
96 | <Shape USE='clamp'/> |
97 | </Transform> |
98 | <Transform rotation='1 0 0 -1.57'> |
99 | <Transform scale='.22 .3 .19'> |
100 | <Shape USE='trail'/> |
101 | </Transform> |
102 | </Transform> |
103 | </Transform> |
104 | <Transform DEF='leftSpade' rotation='0 1 0 -.523' scale='.07 .1 .1' translation='-1.9 -0.45 3.9'> |
105 | <Transform center='.5 0 .5' rotation='0 1 0 3.14'> |
106 | <Transform rotation='1 0 0 -1.57'> |
107 | <Shape USE='spade'/> |
108 | </Transform> |
109 | </Transform> |
110 | </Transform> |
111 |
<!-- ROUTE information for lTrailSpreader node:
[from rotation_changed to leftTrailMover.set_rotation
]
-->
<CylinderSensor DEF='lTrailSpreader' description='Used to spread the trails' maxAngle='.5'/> |
112 | < ROUTE fromNode='lTrailSpreader' fromField='rotation_changed' toNode='leftTrailMover' toField='set_rotation'/> |
113 | </Transform> |
114 | <Transform translation='0 -.25 -.75'> |
115 | <Shape DEF='basePlate'> |
116 | <Cone bottomRadius='.75' height='.25'/> |
117 | <Appearance USE='camiPaint'/> |
118 | </Shape> |
119 | </Transform> |
120 | <Group DEF='wheelRaiser'> |
121 |
<!-- ROUTE information for AnimationTransform node:
[from wheelUp.value_changed to set_rotation
]
[from wheelDown.value_changed to set_rotation
]
-->
<Transform DEF='AnimationTransform' rotation='1 0 0 .1'> |
122 |
<!-- ROUTE information for ButtonChoice node:
[from SetBoxUp.triggerValue to whichChoice
]
[from SetBoxDown.triggerValue to whichChoice
]
-->
<Switch DEF='ButtonChoice' whichChoice='0'> |
123 | <Group> |
124 | <Transform scale='4 1 1' translation='0 -.3 -.3'> |
125 |
<!-- Shape
ClearSphere is a DEF node that has 1 USE node: USE_1 -->
<Shape DEF='ClearSphere'> |
126 | <Appearance> |
127 | <Material DEF='Transparent' emissiveColor='1 1 1' transparency='1.0'/> |
128 | </Appearance> |
129 | <Sphere radius='.5'/> |
130 | </Shape> |
131 | </Transform> |
132 |
<!-- ROUTE information for ClearSphere1 node:
[from touchTime to BoxUpTimer.startTime
]
[from isActive to SetBoxUp.set_boolean
]
-->
<TouchSensor DEF='ClearSphere1' description='used to raise and lower the wheels'/> |
133 |
<!-- ROUTE information for wheelUp node:
[from BoxUpTimer.fraction_changed to set_fraction
]
[from value_changed to AnimationTransform.set_rotation
]
-->
<OrientationInterpolator DEF='wheelUp' key='0 .25 .5 .75 .85 1' keyValue='1 0 0 0 1 0 0 .5 1 0 0 .75 1 0 0 1.25 1 0 0 1.7 1 0 0 2'/> |
134 | <PositionInterpolator DEF='MoveBoxUp' key='0 .5 1' keyValue='0 -3 0 0 0 0 0 3 0'/> |
135 |
<!-- ROUTE information for BoxUpTimer node:
[from ClearSphere1.touchTime to startTime
]
[from fraction_changed to wheelUp.set_fraction
]
-->
<TimeSensor DEF='BoxUpTimer' cycleInterval='3'/> |
136 | < ROUTE fromNode='BoxUpTimer' fromField='fraction_changed' toNode='wheelUp' toField='set_fraction'/> |
137 | < ROUTE fromNode='wheelUp' fromField='value_changed' toNode='AnimationTransform' toField='set_rotation'/> |
138 | < ROUTE fromNode='ClearSphere1' fromField='touchTime' toNode='BoxUpTimer' toField='startTime'/> |
139 | </Group> |
140 | <Group> |
141 | <Transform scale='4 1 1' translation='0 -.3 -.3'> |
142 | <Shape USE='ClearSphere'/> |
143 | </Transform> |
144 |
<!-- ROUTE information for ClearSphere2 node:
[from touchTime to BoxDownTimer.startTime
]
[from isActive to SetBoxDown.set_boolean
]
-->
<TouchSensor DEF='ClearSphere2' description='used to raise and lower the wheels'/> |
145 |
<!-- ROUTE information for wheelDown node:
[from BoxDownTimer.fraction_changed to set_fraction
]
[from value_changed to AnimationTransform.set_rotation
]
-->
<OrientationInterpolator DEF='wheelDown' key='0 .25 .5 .75 .85 1' keyValue='1 0 0 2 1 0 0 1.7 1 0 0 1.25 1 0 0 .75 1 0 0 .5 1 0 0 0'/> |
146 | <PositionInterpolator DEF='MoveBoxDown' key='0 0.5 1' keyValue='0 3 0 0 0 0 0 -3 0'/> |
147 |
<!-- ROUTE information for BoxDownTimer node:
[from ClearSphere2.touchTime to startTime
]
[from fraction_changed to wheelDown.set_fraction
]
-->
<TimeSensor DEF='BoxDownTimer' cycleInterval='3'/> |
148 | < ROUTE fromNode='BoxDownTimer' fromField='fraction_changed' toNode='wheelDown' toField='set_fraction'/> |
149 | < ROUTE fromNode='wheelDown' fromField='value_changed' toNode='AnimationTransform' toField='set_rotation'/> |
150 | < ROUTE fromNode='ClearSphere2' fromField='touchTime' toNode='BoxDownTimer' toField='startTime'/> |
151 | </Group> |
152 | </Switch> |
153 | <Group DEF='rightWheel'> |
154 | <Transform DEF='rightWheel1' translation='.2 -.8 -.3'> |
155 | <Transform DEF='rightTire' rotation='0 0 1 -1.57' translation='1.0 .4 0'> |
156 | |
157 | <Cylinder height='.2' radius='.4'/> |
158 | <Appearance> |
159 | |
160 | </Appearance> |
161 | </Shape> |
162 | </Transform> |
163 | <Transform DEF='rightRim' rotation='0 0 1 -1.57' translation='1.0 .4 0'> |
164 | |
165 | <Cylinder height='.22' radius='.25'/> |
166 | <Appearance USE='camiPaint'/> |
167 | </Shape> |
168 | </Transform> |
169 | </Transform> |
170 | <Transform rotation='1 0 0 -1.75'> |
171 | <Transform DEF='rWheelLift' rotation='0 1 0 1.57' scale='.25 .25 .25' translation='1 0 0'> |
172 | <Transform> |
173 | <Shape> |
174 | <Extrusion crossSection='-1 0 -0.9 0.435889894354067 -0.8 0.6 -0.7 0.714142842854285 -0.6 0.8 -0.5 0.866025403784439 -0.4 0.916515138991168 -0.3 0.953939201416946 -0.2 0.979795897113271 -0.1 0.99498743710662 0 1 0.1 0.99498743710662 0.2 0.979795897113271 0.3 0.953939201416946 0.4 0.916515138991168 0.5 0.866025403784439 0.6 0.8 0.7 0.714142842854285 0.8 0.6 0.9 0.435889894354067 1 0 0.9 -0.435889894354067 0.8 -0.6 0.7 -0.714142842854285 0.6 -0.8 0.5 -0.866025403784439 0.4 -0.916515138991168 0.3 -0.953939201416946 0.2 -0.979795897113271 0.1 -0.99498743710662 0 -1 -0.1 -0.99498743710662 -0.2 -0.979795897113271 -0.3 -0.953939201416946 -0.4 -0.916515138991168 -0.5 -0.866025403784439 -0.6 -0.8 -0.7 -0.714142842854285 -0.8 -0.6 -0.9 -0.435889894354067 -1 0' spine='0 0 0 0 0 .3'/> |
175 | <Appearance USE='camiPaint'/> |
176 | </Shape> |
177 | </Transform> |
178 | <Transform translation='1.5 1.5 .45'> |
179 | <Shape> |
180 | <Extrusion crossSection='-1 0 -0.9 0.435889894354067 -0.8 0.6 -0.7 0.714142842854285 -0.6 0.8 -0.5 0.866025403784439 -0.4 0.916515138991168 -0.3 0.953939201416946 -0.2 0.979795897113271 -0.1 0.99498743710662 0 1 0.1 0.99498743710662 0.2 0.979795897113271 0.3 0.953939201416946 0.4 0.916515138991168 0.5 0.866025403784439 0.6 0.8 0.7 0.714142842854285 0.8 0.6 0.9 0.435889894354067 1 0 0.9 -0.435889894354067 0.8 -0.6 0.7 -0.714142842854285 0.6 -0.8 0.5 -0.866025403784439 0.4 -0.916515138991168 0.3 -0.953939201416946 0.2 -0.979795897113271 0.1 -0.99498743710662 0 -1 -0.1 -0.99498743710662 -0.2 -0.979795897113271 -0.3 -0.953939201416946 -0.4 -0.916515138991168 -0.5 -0.866025403784439 -0.6 -0.8 -0.7 -0.714142842854285 -0.8 -0.6 -0.9 -0.435889894354067 -1 0' spine='0 0 0 0 0 .3'/> |
181 | <Appearance USE='camiPaint'/> |
182 | </Shape> |
183 | </Transform> |
184 | <Transform rotation='0 0 1 1' translation='1 1 0.3'> |
185 | <Shape> |
186 | <Box size='2 1 .3'/> |
187 | <Appearance USE='camiPaint'/> |
188 | </Shape> |
189 | </Transform> |
190 | </Transform> |
191 | </Transform> |
192 | </Group> |
193 | <Group DEF='leftWheel'> |
194 |
<!-- ROUTE information for leftWheel1 node:
[from wheelInterpolator.value_changed to set_rotation
]
-->
<Transform DEF='leftWheel1' translation='-1.2 -.35 -.35'> |
195 | <Transform DEF='leftTire' rotation='0 0 1 -1.57'> |
196 | <Shape USE='tire'/> |
197 | </Transform> |
198 | <Transform DEF='leftRim' rotation='0 0 1 -1.57'> |
199 | <Shape USE='rim'/> |
200 | </Transform> |
201 | </Transform> |
202 |
<!-- ROUTE information for wheelSensor node:
[from isOver to CLOCK.set_enabled
]
-->
<TouchSensor DEF='wheelSensor' description='Point at box to spin it'/> |
203 |
<!-- ROUTE information for CLOCK node:
[from wheelSensor.isOver to set_enabled
]
[from fraction_changed to wheelInterpolator.set_fraction
]
-->
<TimeSensor DEF='CLOCK' cycleInterval='4' enabled='false' loop='true'/> |
204 |
<!-- ROUTE information for wheelInterpolator node:
[from CLOCK.fraction_changed to set_fraction
]
[from value_changed to leftWheel1.set_rotation
]
-->
<OrientationInterpolator DEF='wheelInterpolator' key='0.0 0.25 0.50 0.75 1.0' keyValue='1 0.0 0 -1.57 1 0.0 0 0 1 0.0 0 1.57 1 0 0 3.14 1 0 0 -1.57'/> |
205 | <Transform rotation='1 0 0 -3.1'> |
206 | <Transform DEF='wheelLift' rotation='0 1 0 -1.57' scale='.25 .25 .25' translation='-1 0 0'> |
207 | <Transform> |
208 | <Shape> |
209 | <Extrusion crossSection='-1 0 -0.9 0.435889894354067 -0.8 0.6 -0.7 0.714142842854285 -0.6 0.8 -0.5 0.866025403784439 -0.4 0.916515138991168 -0.3 0.953939201416946 -0.2 0.979795897113271 -0.1 0.99498743710662 0 1 0.1 0.99498743710662 0.2 0.979795897113271 0.3 0.953939201416946 0.4 0.916515138991168 0.5 0.866025403784439 0.6 0.8 0.7 0.714142842854285 0.8 0.6 0.9 0.435889894354067 1 0 0.9 -0.435889894354067 0.8 -0.6 0.7 -0.714142842854285 0.6 -0.8 0.5 -0.866025403784439 0.4 -0.916515138991168 0.3 -0.953939201416946 0.2 -0.979795897113271 0.1 -0.99498743710662 0 -1 -0.1 -0.99498743710662 -0.2 -0.979795897113271 -0.3 -0.953939201416946 -0.4 -0.916515138991168 -0.5 -0.866025403784439 -0.6 -0.8 -0.7 -0.714142842854285 -0.8 -0.6 -0.9 -0.435889894354067 -1 0' spine='0 0 0 0 0 .3'/> |
210 | <Appearance USE='camiPaint'/> |
211 | </Shape> |
212 | </Transform> |
213 | <Transform translation='1.5 1.5 .45'> |
214 | <Shape> |
215 | <Extrusion crossSection='-1 0 -0.9 0.435889894354067 -0.8 0.6 -0.7 0.714142842854285 -0.6 0.8 -0.5 0.866025403784439 -0.4 0.916515138991168 -0.3 0.953939201416946 -0.2 0.979795897113271 -0.1 0.99498743710662 0 1 0.1 0.99498743710662 0.2 0.979795897113271 0.3 0.953939201416946 0.4 0.916515138991168 0.5 0.866025403784439 0.6 0.8 0.7 0.714142842854285 0.8 0.6 0.9 0.435889894354067 1 0 0.9 -0.435889894354067 0.8 -0.6 0.7 -0.714142842854285 0.6 -0.8 0.5 -0.866025403784439 0.4 -0.916515138991168 0.3 -0.953939201416946 0.2 -0.979795897113271 0.1 -0.99498743710662 0 -1 -0.1 -0.99498743710662 -0.2 -0.979795897113271 -0.3 -0.953939201416946 -0.4 -0.916515138991168 -0.5 -0.866025403784439 -0.6 -0.8 -0.7 -0.714142842854285 -0.8 -0.6 -0.9 -0.435889894354067 -1 0' spine='0 0 0 0 0 .3'/> |
216 | <Appearance USE='camiPaint'/> |
217 | </Shape> |
218 | </Transform> |
219 | <Transform rotation='0 0 1 1' translation='1 1 0.3'> |
220 | <Shape> |
221 | <Box size='2 1 .3'/> |
222 | <Appearance USE='camiPaint'/> |
223 | </Shape> |
224 | </Transform> |
225 | </Transform> |
226 | </Transform> |
227 | </Group> |
228 | </Transform> |
229 | </Group> |
230 | <Group DEF='AnimationControl'> |
231 |
<!-- ROUTE information for SetBoxDown node:
[from ClearSphere2.isActive to set_boolean
]
[from triggerValue to ButtonChoice.whichChoice
]
-->
<IntegerTrigger DEF='SetBoxDown' integerKey='0'/> |
232 |
<!-- ROUTE information for SetBoxUp node:
[from ClearSphere1.isActive to set_boolean
]
[from triggerValue to ButtonChoice.whichChoice
]
-->
<IntegerTrigger DEF='SetBoxUp' integerKey='1'/> |
233 | < ROUTE fromNode='ClearSphere1' fromField='isActive' toNode='SetBoxUp' toField='set_boolean'/> |
234 | < ROUTE fromNode='ClearSphere2' fromField='isActive' toNode='SetBoxDown' toField='set_boolean'/> |
235 | < ROUTE fromNode='SetBoxUp' fromField='triggerValue' toNode='ButtonChoice' toField='whichChoice'/> |
236 | < ROUTE fromNode='SetBoxDown' fromField='triggerValue' toNode='ButtonChoice' toField='whichChoice'/> |
237 | </Group> |
238 | </Group> |
239 | <Group DEF='upperCarriagePiece'> |
240 |
<!-- ROUTE information for rotateUpperCarriage node:
[from carriage_sensor.rotation_changed to set_rotation
]
-->
<Transform DEF='rotateUpperCarriage' center='0 -2.5 0'> |
241 | <Group DEF='upperCarriage'> |
242 | <Transform DEF='rightTrunion' rotation='1 0 0 1.57' translation='.6 1.2 .65'> |
243 | <Transform rotation='0 1 0 3.14'> |
244 |
<!-- Shape
left_stantion is a DEF node that has 1 USE node: USE_1 -->
<Shape DEF='left_stantion'> |
245 | <Extrusion crossSection='0 4 2 43 -4 5 -7 10 -712 -9 2 -9 0 -4 0 4' scale='.1 .1' spine='0 0 0 .2 0 0'/> |
246 | <Appearance USE='camiPaint'/> |
247 | </Shape> |
248 | </Transform> |
249 | </Transform> |
250 | <Transform rotation='1 0 0 1.57' translation='-.4 1.2 .65'> |
251 | <Transform rotation='0 1 0 3.14'> |
252 | <Shape USE='left_stantion'/> |
253 | </Transform> |
254 | </Transform> |
255 | <Transform DEF='leftHandwheel' rotation='0 1 0 -1.57' scale='.8 .8 .8' translation='-.75 1 .5'> |
256 | <!-- This handwheel was copied from the Savage library from the LW155 howitzer --> |
257 | |
258 | <Group DEF='handwheelGroup'> |
259 | <Transform DEF='CircularHandle'> |
260 | <Shape> |
261 | <Extrusion beginCap='false' creaseAngle='1.57' crossSection='0.1 0 0.092 -0.038 0.071 -0.071 0.038 -0.092 0 -0.1 -0.038 -0.092 -0.071 -0.071 -0.092 -0.038 -0.1 0 -0.092 0.038 -0.071 0.071 -0.038 0.092 0 0.1 0.038 0.092 0.071 0.071 0.092 0.038 0.1 0' endCap='false' scale='0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6' spine='0.3 0 0 0.276 -0.114 0 0.213 -0.213 0 0.114 -0.276 0 0 -0.3 0 -0.114 -0.276 0 -0.213 -0.213 0 -0.276 -0.114 0 -0.3 0 0 -0.276 0.114 0 -0.213 0.213 0 -0.114 0.276 0 0 0.3 0 0.114 0.276 0 0.213 0.213 0 0.276 0.114 0 0.3 0 0'/> |
262 | <Appearance> |
263 | <Material diffuseColor='.1 .10 .1'/> |
264 | </Appearance> |
265 | </Shape> |
266 | </Transform> |
267 | <Transform DEF='CrankShaft' translation='0 0 -0.05'> |
268 | <Transform DEF='Shaft' rotation='1 0 0 1.57'> |
269 | <Shape> |
270 | <Cylinder height='0.02' radius='0.08'/> |
271 | <Appearance> |
272 | <Material diffuseColor='.1 .1 .1'/> |
273 | </Appearance> |
274 | </Shape> |
275 | </Transform> |
276 | <Transform DEF='Top' rotation='1 0 0 1.57' translation='0 0 -0.1'> |
277 | <Shape> |
278 | <Cylinder height='0.2' radius='0.05'/> |
279 | <Appearance> |
280 | <Material diffuseColor='.1 .1 .1'/> |
281 | </Appearance> |
282 | </Shape> |
283 | </Transform> |
284 | <Transform DEF='TopBall' translation='0 0 -0.01'> |
285 | <Shape> |
286 | <Sphere radius='0.05'/> |
287 | <Appearance> |
288 | <Material diffuseColor='.1 .1 .1'/> |
289 | </Appearance> |
290 | </Shape> |
291 | </Transform> |
292 | </Transform> |
293 | <Transform DEF='Struts'> |
294 | |
295 | <Shape> |
296 | <Extrusion creaseAngle='3.14' crossSection='0.01 0 0.0092 -0.0038 0.0071 -0.0071 0.0038 -0.0092 0 -0.01 -0.0038 -0.0092 -0.0071 -0.0071 -0.0092 -0.0038 -0.01 0 -0.0092 0.0038 -0.0071 0.0071 -0.0038 0.0092 0 0.01 0.0038 0.0092 0.0071 0.0071 0.0092 0.0038 0.01 0' scale='4 2 2 2 2 2 2 2 2 4' spine='0 0 0 0 0.125 0 0 0.25 0 0 0.255 0 0 0.275 0'/> |
297 | <Appearance> |
298 | <Material diffuseColor='.1 .1 .1'/> |
299 | </Appearance> |
300 | </Shape> |
301 | </Transform> |
302 | <Transform DEF='StrutTwo' rotation='0 0 1 2.09'> |
303 | <Transform USE='StrutOne'/> |
304 | </Transform> |
305 | <Transform DEF='StrutThree' rotation='0 0 -1 2.09'> |
306 | <Transform USE='StrutOne'/> |
307 | </Transform> |
308 | </Transform> |
309 | </Group> |
310 | <WorldInfo info='"null node"'/> |
311 | </LOD> |
312 | </Transform> |
313 | <Transform DEF='rightHandwheel' rotation='0 1 0 1.57' scale='.8 .8 .8' translation='.75 1 .5'> |
314 | <LOD USE='Crank'/> |
315 | </Transform> |
316 | <Transform DEF='traversingWheel' rotation='0 1 0 -.85' scale='.5 .5 .5' translation='-.68 .5 .6'> |
317 | <LOD USE='Crank'/> |
318 | </Transform> |
319 | <Transform translation='0 .25 0'> |
320 | <Shape DEF='traversingPlatform'> |
321 | <Cylinder height='.35' radius='.8'/> |
322 | <Appearance USE='camiPaint'/> |
323 | </Shape> |
324 | </Transform> |
325 | <Transform DEF='rightUpperCylinder' rotation='0 0 1 1.57' translation='0 1.5 .2'> |
326 | <Transform center='0 0 1' rotation='0 0 1 -3.14'> |
327 | <Transform> |
328 |
<!-- ROUTE information for ruc node:
[from upperCylinderMover.upperRotation to set_rotation
]
-->
<Transform DEF='ruc' center='0 0 .3'> |
329 | <Transform DEF='rucL' rotation='1 0 0 -1.57' translation='0 -.48 0'> |
330 | <Transform translation='0 .050 0'> |
331 |
<!-- Shape
upperCylinder1 is a DEF node that has 1 USE node: USE_1 -->
<Shape DEF='upperCylinder1'> |
332 | <Cylinder height='.45' radius='.075'/> |
333 | <Appearance USE='camiPaint'/> |
334 | </Shape> |
335 | </Transform> |
336 | <Transform translation='0 -.22 0'> |
337 | |
338 | <Sphere radius='.05'/> |
339 | <Appearance> |
340 | <Material USE='black'/> |
341 | </Appearance> |
342 | </Shape> |
343 | </Transform> |
344 |
<!-- ROUTE information for shrinkCylinder node:
[from upperCylinderMover.extendCylinder to set_translation
]
[from upperCylinderMover.shrinkCylinder to set_scale
]
-->
<Transform DEF='shrinkCylinder' translation='0 .22 0'> |
345 |
<!-- Shape
upperExtender is a DEF node that has 1 USE node: USE_1 -->
<Shape DEF='upperExtender'> |
346 | <Cylinder height='.55' radius='.060'/> |
347 | <Appearance> |
348 |
<ImageTexture
url=' "baffle.jpg![]() ![]() |
349 | </Appearance> |
350 | </Shape> |
351 | </Transform> |
352 | </Transform> |
353 | <Transform DEF='rucR' rotation='1 0 0 -1.57' translation='0 .48 0'> |
354 | <Transform translation='0 .050 0'> |
355 | <Shape USE='upperCylinder1'/> |
356 | </Transform> |
357 | <Transform translation='0 -.22 0'> |
358 | <Shape USE='linkBolt'/> |
359 | </Transform> |
360 |
<!-- ROUTE information for shrinkCylinderR node:
[from upperCylinderMover.extendCylinder to set_translation
]
[from upperCylinderMover.shrinkCylinder to set_scale
]
-->
<Transform DEF='shrinkCylinderR' translation='0 .22 0'> |
361 | <Shape USE='upperExtender'/> |
362 | </Transform> |
363 | </Transform> |
364 | </Transform> |
365 | </Transform> |
366 | </Transform> |
367 | </Transform> |
368 | </Group> |
369 | <Transform DEF='barrelGroup' rotation='0 0 1 -1.57'> |
370 |
<!-- ROUTE information for barrelMover1 node:
[from tubeSensor.rotation_changed to set_rotation
]
-->
<Transform DEF='barrelMover1' center='-1. 0 .45' rotation='0 0 1 .01' translation='.2 0 0'> |
371 |
<!-- ROUTE information for tubeSensor node:
[from rotation_changed to barrelMover1.set_rotation
]
[from rotation_changed to upperCylinderMover.barrelRotation
]
-->
<CylinderSensor DEF='tubeSensor' description='sensor for tube elevation' maxAngle='0' minAngle='-.65'/> |
372 | < ROUTE fromNode='tubeSensor' fromField='rotation_changed' toNode='barrelMover1' toField='set_rotation'/> |
373 | <Transform DEF='theBarrel'> |
374 | <Group DEF='barrel'> |
375 | <Transform DEF='recoilTransform' rotation='0 0 1 1.57' translation='-.20 0 -.2'> |
376 |
<!-- ROUTE information for recoilMover node:
[from recoil.value_changed to set_translation
]
-->
<Transform DEF='recoilMover'> |
377 | <Transform DEF='tube1' rotation='1 0 0 -.84' translation='0 2.45 -1'> |
378 | <Transform translation='0 -2.5 0'> |
379 | <Shape> |
380 | <Extrusion DEF='tube' crossSection='-1 0 -0.9 0.435889894354067 -0.8 0.6 -0.7 0.714142842854285 -0.6 0.8 -0.5 0.866025403784439 -0.4 0.916515138991168 -0.3 0.953939201416946 -0.2 0.979795897113271 -0.1 0.99498743710662 0 1 0.1 0.99498743710662 0.2 0.979795897113271 0.3 0.953939201416946 0.4 0.916515138991168 0.5 0.866025403784439 0.6 0.8 0.7 0.714142842854285 0.8 0.6 0.9 0.435889894354067 1 0 0.9 -0.435889894354067 0.8 -0.6 0.7 -0.714142842854285 0.6 -0.8 0.5 -0.866025403784439 0.4 -0.916515138991168 0.3 -0.953939201416946 0.2 -0.979795897113271 0.1 -0.99498743710662 0 -1 -0.1 -0.99498743710662 -0.2 -0.979795897113271 -0.3 -0.953939201416946 -0.4 -0.916515138991168 -0.5 -0.866025403784439 -0.6 -0.8 -0.7 -0.714142842854285 -0.8 -0.6 -0.9 -0.435889894354067 -1 0' scale='.2 .2 .2 .2 .18 .18 .18 .18 .2 .2' spine='0 0 0 0 3.5 0 0 3.6 0 0 4.7 0 0 5.2 0'/> |
381 | <Appearance USE='camiPaint'/> |
382 | </Shape> |
383 | <Transform DEF='shinyPiece' translation='0 3 0'> |
384 | <Shape> |
385 | <Cylinder height='1.1' radius='.205'/> |
386 | |
387 | <Material diffuseColor='.7 .7 .7'/> |
388 | </Appearance> |
389 | </Shape> |
390 | </Transform> |
391 | </Transform> |
392 | <Transform DEF='breech' translation='0 -2.5 0'> |
393 | <Shape> |
394 | <Cylinder height='.1' radius='.2'/> |
395 | <Appearance USE='shiny'/> |
396 | </Shape> |
397 | </Transform> |
398 | </Transform> |
399 | <Transform DEF='muzzle_break' translation='0 .05 0'> |
400 | <Transform rotation='1 0 0 .75' translation='.25 4.48 -3.6'> |
401 | <Transform rotation='0 0 1 1.57'> |
402 | <Transform rotation='1 0 0 3.14' scale='1.6 .7 .85'> |
403 | <Shape DEF='muzzleBreak'> |
404 | <Extrusion crossSection='0 0 3 0 3 -3 2.8 -3.2 2.3 -3.7 2 -4 1 -4 .8 -3.8 .3 -3.3 0 -3 0 0' scale='.25 .25' spine='0 0 0 .25 0 0'/> |
405 | <Appearance USE='camiPaint'/> |
406 | </Shape> |
407 | </Transform> |
408 | </Transform> |
409 | </Transform> |
410 | <Transform rotation='1 0 0 .75' translation='.25 4.4 -3.2'> |
411 | <Shape> |
412 | <Box size='.01 .3 .4'/> |
413 | <Appearance> |
414 | <Material diffuseColor='.1 .1 .1'/> |
415 | </Appearance> |
416 | </Shape> |
417 | </Transform> |
418 | <Transform rotation='1 0 0 .75' translation='-.225 4.4 -3.2'> |
419 | <Shape> |
420 | <Box size='.01 .3 .4'/> |
421 | <Appearance> |
422 | <Material diffuseColor='.1 .1 .1'/> |
423 | </Appearance> |
424 | </Shape> |
425 | </Transform> |
426 | <Transform rotation='1 0 0 -.84' translation='0 4.64 -3.45'> |
427 | <Shape> |
428 | <Cylinder height='.02' radius='.17'/> |
429 | <Appearance> |
430 | <Material diffuseColor='.1 .1 .1'/> |
431 | </Appearance> |
432 | </Shape> |
433 | </Transform> |
434 | </Transform> |
435 | </Transform> |
436 | <Transform DEF='sideBars' translation='0 -.2 0'> |
437 | <Transform DEF='rightSideBar' rotation='1 0 0 .75' translation='.45 1.9 -.250'> |
438 | |
439 | <Box size='.2 .2 2.2'/> |
440 | <Appearance USE='camiPaint'/> |
441 | </Shape> |
442 | </Transform> |
443 | <Transform DEF='leftSideBar1' rotation='1 0 0 .75' translation='-.45 1.9 -.250'> |
444 | <Shape USE='sideBar'/> |
445 | </Transform> |
446 | <Transform DEF='lTravelLockAnchor' rotation='1 0 0 -2.3' translation='-.55 1.7 -.2'> |
447 | <Shape> |
448 | <Extrusion crossSection='0 0 0 .15 .15 .15 .15 0 0 0' scale='1 .85 .75 .75 .5 .5' spine='0 0 0 0 .1 0 0 .2 0'/> |
449 | <Appearance USE='camiPaint'/> |
450 | </Shape> |
451 | </Transform> |
452 | <Transform DEF='travelLockAnchor' rotation='1 0 0 -2.3' translation='.4 1.7 -.2'> |
453 | <Shape> |
454 | <Extrusion crossSection='0 0 0 .15 .15 .15 .15 0 0 0' scale='1 .85 .75 .75 .5 .5' spine='0 0 0 0 .1 0 0 .2 0'/> |
455 | <Appearance USE='camiPaint'/> |
456 | </Shape> |
457 | </Transform> |
458 | <Transform rotation='1 0 0 .65' translation='.48 2.4 -1.'> |
459 |
<!-- Shape
upperTravelLocker is a DEF node that has 1 USE node: USE_1 -->
<Shape DEF='upperTravelLocker'> |
460 | <Box size='.07 .2 .04'/> |
461 | <Appearance USE='camiPaint'/> |
462 | </Shape> |
463 | </Transform> |
464 | <Transform rotation='1 0 0 .65' translation='-.48 2.4 -1'> |
465 | <Shape USE='upperTravelLocker'/> |
466 | </Transform> |
467 | </Transform> |
468 | <Transform rotation='1 0 0 -.84' translation='0 1.65 -.1'> |
469 | <Shape DEF='barrelCover'> |
470 | <Cylinder height='2.5' radius='.4'/> |
471 | <Appearance USE='camiPaint'/> |
472 | </Shape> |
473 | </Transform> |
474 | <Transform DEF='travelLockPiece' rotation='1 0 0 -.76' translation='-.5 1.72 -.75'> |
475 |
<!-- ROUTE information for travelLockOrient node:
[from travelLockOrientor.value_changed to set_rotation
]
-->
<Transform DEF='travelLockOrient' center='0 -.5 0' rotation='1 0 0 -2.25'> |
476 | <Transform> |
477 | |
478 | <Cylinder height='1' radius='.05'/> |
479 | <Appearance USE='camiPaint'/> |
480 | </Shape> |
481 | </Transform> |
482 | <Transform translation='1 0 0'> |
483 | <Shape USE='travelLock'/> |
484 | </Transform> |
485 | <Transform rotation='0 0 1 .78' scale='1 1.38 1' translation='.5 0 0'> |
486 | <Shape USE='travelLock'/> |
487 | </Transform> |
488 | <Transform center='0 0 -.705' rotation='0 0 1 -.78' scale='1 1.38 1' translation='.5 0 0'> |
489 | <Shape USE='travelLock'/> |
490 | </Transform> |
491 | <Transform DEF='connectingCylinder' rotation='0 0 1 1.57' scale='1 .1 1' translation='0 .5 0'> |
492 | <Shape USE='travelLock'/> |
493 | </Transform> |
494 | <Transform rotation='0 0 1 1.57' scale='1 .1 1' translation='0 -.5 0'> |
495 | <Shape USE='travelLock'/> |
496 | </Transform> |
497 | <Transform rotation='0 0 1 1.57' scale='1 .1 1' translation='1 .5 0'> |
498 | <Shape USE='travelLock'/> |
499 | </Transform> |
500 | <Transform rotation='0 0 1 1.57' scale='1 .1 1' translation='1 -.5 0'> |
501 | <Shape USE='travelLock'/> |
502 | </Transform> |
503 | </Transform> |
504 |
<!-- ROUTE information for travelLockOrientor node:
[from travelLockClock.fraction_changed to set_fraction
]
[from value_changed to travelLockOrient.set_rotation
]
-->
<OrientationInterpolator DEF='travelLockOrientor' key='0 .25 .5 .75 .85 1' keyValue='1 0 0 -2.25 1 0 0 -1.7 1 0 0 -1.25 1 0 0 -.75 1 0 0 -.5 1 0 0 0'/> |
505 |
<!-- ROUTE information for travelLockSensor node:
[from touchTime to travelLockClock.set_startTime
]
-->
<TouchSensor DEF='travelLockSensor' description='rasies and lowers travel lock'/> |
506 |
<!-- ROUTE information for travelLockClock node:
[from travelLockSensor.touchTime to set_startTime
]
[from fraction_changed to travelLockOrientor.set_fraction
]
-->
<TimeSensor DEF='travelLockClock' cycleInterval='5'/> |
507 | < ROUTE fromNode='travelLockSensor' fromField='touchTime' toNode='travelLockClock' toField='set_startTime'/> |
508 | < ROUTE fromNode='travelLockClock' fromField='fraction_changed' toNode='travelLockOrientor' toField='set_fraction'/> |
509 | < ROUTE fromNode='travelLockOrientor' fromField='value_changed' toNode='travelLockOrient' toField='set_rotation'/> |
510 | </Transform> |
511 |
<!-- ROUTE information for theRound node:
[from roundPathInterpolator.value_changed to set_translation
]
[from roundOrientationInterpolator.value_changed to set_rotation
]
-->
<Transform DEF='theRound' rotation='1 0 0 -.77' translation='0 3.7 -2.5'> |
512 |
<!-- ROUTE information for theRoundSpinner node:
[from roundSpinner.value_changed to set_rotation
]
-->
<Transform DEF='theRoundSpinner'> |
513 | <Transform> |
514 | <Transform scale='.2 1 .2'> |
515 | |
516 | <Appearance USE='camiPaint'/> |
517 | <Extrusion crossSection='-1 0 -0.9 0.435889894354067 -0.8 0.6 -0.7 0.714142842854285 -0.6 0.8 -0.5 0.866025403784439 -0.4 0.916515138991168 -0.3 0.953939201416946 -0.2 0.979795897113271 -0.1 0.99498743710662 0 1 0.1 0.99498743710662 0.2 0.979795897113271 0.3 0.953939201416946 0.4 0.916515138991168 0.5 0.866025403784439 0.6 0.8 0.7 0.714142842854285 0.8 0.6 0.9 0.435889894354067 1 0 0.9 -0.435889894354067 0.8 -0.6 0.7 -0.714142842854285 0.6 -0.8 0.5 -0.866025403784439 0.4 -0.916515138991168 0.3 -0.953939201416946 0.2 -0.979795897113271 0.1 -0.99498743710662 0 -1 -0.1 -0.99498743710662 -0.2 -0.979795897113271 -0.3 -0.953939201416946 -0.4 -0.916515138991168 -0.5 -0.866025403784439 -0.6 -0.8 -0.7 -0.714142842854285 -0.8 -0.6 -0.9 -0.435889894354067 -1 0' scale='.35 .35 .5 .5 .5 .5 .3 .3 .01 .01' spine='0 0 0 0 .15 0 0 .8 0 0 .9 0 0 1 0'/> |
518 | </Shape> |
519 | </Transform> |
520 | </Transform> |
521 |
<!-- ROUTE information for spinTimer node:
[from shootRound.touchTime to set_startTime
]
[from fraction_changed to roundSpinner.set_fraction
]
-->
<TimeSensor DEF='spinTimer' cycleInterval='3' loop='true'/> |
522 |
<!-- ROUTE information for roundSpinner node:
[from spinTimer.fraction_changed to set_fraction
]
[from value_changed to theRoundSpinner.set_rotation
]
-->
<OrientationInterpolator DEF='roundSpinner' key='0.0 0.25 0.50 0.75 1.0' keyValue='0 1 0 -1.57 0 1 0 0 0 1 0 1.57 0 1 0 3.14 0 1 0 -1.57'/> |
523 | </Transform> |
524 |
<!-- ROUTE information for roundPathInterpolator node:
[from clock3.fraction_changed to set_fraction
]
[from value_changed to theRound.set_translation
]
-->
<PositionInterpolator DEF='roundPathInterpolator' key='0.057 0.0858823529 0.088235294 0.117647059 0.147058824 0.176470588 0.205882353 0.235294118 0.264705882 0.294117647 0.323529412 0.352941176 0.382352941 0.411764706 0.441176471 0.470588235 0.5 0.529411765 0.558823529 0.588235294 0.617647059 0.647058824 0.676470588 0.705882353 0.735294118 0.764705882 0.794117647 0.823529412 0.852941176 0.882352941 0.911764706 0.941176471 0.970588235' keyValue='0 3.8 -2.6 0 30.6227766 -10 0 59.2455532 -20 0 85.86832981 -30 0 110.4911064 -40 0 133.113883 -50 0 153.7366596 -60 0 172.3594362 -70 0 188.9822128 -80 0 203.6049894 -90 0 216.227766 -100 0 226.8505426 -110 0 235.4733192 -120 0 242.0960958 -130 0 246.7188724 -140 0 249.341649 -150 0 249.9644256 -160 0 248.5872022 -170 0 245.2099788 -180 0 239.8327554 -190 0 232.455532 -200 0 223.0783086 -210 0 211.7010852 -220 0 198.3238618 -230 0 182.9466384 -240 0 165.569415 -250 0 146.1921916 -260 0 124.8149682 -270 0 101.4377448 -280 0 76.06052145 -290 0 48.68329805 -300 0 19.30607465 -310 0 -1 -320'/> |
525 |
<!-- ROUTE information for roundOrientationInterpolator node:
[from clock3.fraction_changed to set_fraction
]
[from value_changed to theRound.set_rotation
]
-->
<OrientationInterpolator DEF='roundOrientationInterpolator' key='0.029411765 0.058823529 0.088235294 0.117647059 0.147058824 0.176470588 0.205882353 0.235294118 0.264705882 0.294117647 0.323529412 0.352941176 0.382352941 0.411764706 0.441176471 0.470588235 0.5 0.529411765 0.558823529 0.588235294 0.617647059 0.647058824 0.676470588 0.705882353 0.735294118 0.764705882 0.794117647 0.823529412 0.852941176 0.882352941 0.911764706 0.941176471 0.970588235' keyValue='1 0 0 -1.03580267483729 1 0 0 -1.07069156372618 1 0 0 -1.10558045261507 1 0 0 -1.14046934150396 1 0 0 -1.17535823039285 1 0 0 -1.21024711928174 1 0 0 -1.24513600817063 1 0 0 -1.28002489705952 1 0 0 -1.31491378594841 1 0 0 -1.34980267483729 1 0 0 -1.38469156372618 1 0 0 -1.41958045261507 1 0 0 -1.45446934150396 1 0 0 -1.48935823039285 1 0 0 -1.52424711928174 1 0 0 -1.55913600817063 1 0 0 -1.59402489705952 1 0 0 -1.6289137859484 1 0 0 -1.66380267483729 1 0 0 -1.69869156372618 1 0 0 -1.73358045261507 1 0 0 -1.76846934150396 1 0 0 -1.80335823039285 1 0 0 -1.83824711928174 1 0 0 -1.87313600817063 1 0 0 -1.90802489705952 1 0 0 -1.9429137859484 1 0 0 -1.97780267483729 1 0 0 -2.01269156372618 1 0 0 -2.04758045261507 1 0 0 -2.08246934150396 1 0 0 -2.11735823039285 1 0 0 -2.15224711928174'/> |
526 | <Viewpoint DEF='rideTheRound' description='ride the round' orientation='1 0 0 .45' position='0 -5 10'/> |
527 | </Transform> |
528 |
<!-- ROUTE information for RECOILTIMER node:
[from shootRound.touchTime to set_startTime
]
[from fraction_changed to recoil.set_fraction
]
-->
<TimeSensor DEF='RECOILTIMER' cycleInterval='5'/> |
529 |
<!-- ROUTE information for recoil node:
[from RECOILTIMER.fraction_changed to set_fraction
]
[from value_changed to recoilMover.set_translation
]
-->
<PositionInterpolator DEF='recoil' key='0 .2 .4 .6 .8 1' keyValue='0 0 0 0 -.20 .25 0 -.40 .5 0 -.20 .25 0 -.10 .15 0 0 0'/> |
530 | < ROUTE fromNode='RECOILTIMER' fromField='fraction_changed' toNode='recoil' toField='set_fraction'/> |
531 | < ROUTE fromNode='recoil' fromField='value_changed' toNode='recoilMover' toField='set_translation'/> |
532 | </Transform> |
533 | <Transform DEF='shotEffects' rotation='1 0 0 1.57' translation='-4.7 0 -3.5'> |
534 | <Transform DEF='hotGas' rotation='0 0 1 -.76' translation='-.3 -.3 0'> |
535 | <Group> |
536 |
<!-- ROUTE information for BallTransform node:
[from BALLSIZE.value_changed to set_scale
]
-->
<Transform DEF='BallTransform' scale='.000001 .0000001 .0000001'> |
537 | <Shape> |
538 | <Sphere DEF='EXPSHAPE' radius='25'/> |
539 | <Appearance> |
540 | <!-- explosion.png is from the Pearl Harbor scene from www.planetnine.com. --> |
541 |
<ImageTexture DEF='explosion'
url=' "explosion.png![]() ![]() ![]() |
542 | </Appearance> |
543 | </Shape> |
544 | </Transform> |
545 |
<!-- ROUTE information for BALLSIZE node:
[from BOOMCLOCK.fraction_changed to set_fraction
]
[from value_changed to BallTransform.set_scale
]
-->
<PositionInterpolator DEF='BALLSIZE' key='0.0 0.1 0.2 .3 .4 .5 .6 .7 .8 .9 1.0' keyValue='0 0 0 .003 .001 .003 .006 .002 .006 .01 .003 .01 .015 .006 .015 .02 .02 .02 .01 .01 .01 .006 .006 .006 .003 .003 .003 0 0 0 0 0 0'/> |
546 |
<!-- ROUTE information for BOOMCLOCK node:
[from shootRound.touchTime to set_startTime
]
[from fraction_changed to BALLSIZE.set_fraction
]
-->
<TimeSensor DEF='BOOMCLOCK' cycleInterval='.85'/> |
547 | </Group> |
548 | </Transform> |
549 | <Transform rotation='0 0 1 -.76'> |
550 |
<!-- ROUTE information for BoomTransform node:
[from ScaleInterp.value_changed to set_scale
]
-->
<Transform DEF='BoomTransform' scale='0.0001 0.00001 0.00001' translation='0.0 0 0.0'> |
551 | <Shape> |
552 | <Extrusion beginCap='false' creaseAngle='1.57' crossSection='1.0 0.0 0.92 -0.38 0.71 -0.71 0.38 -0.92 0.0 -1.0 -0.38 -0.92 -0.71 -0.71 -0.92 -0.38 -1.0 -0.0 -0.92 0.38 -0.71 0.71 -0.38 0.92 0.0 1.0 0.38 0.92 0.71 0.71 0.92 0.38 1.0 0.0' endCap='false' spine='2.0 0.0 0.0 1.85 0.0 0.77 1.41 0.0 1.41 0.77 0.0 1.85 0.0 0.0 2.0 -0.77 0.0 1.85 -1.41 0.0 1.41 -1.85 0.0 0.77 -2.0 0.0 0.0 -1.85 0.0 -0.77 -1.41 0.0 -1.41 -0.77 0.0 -1.85 0.0 0.0 -2.0 0.77 0.0 -1.85 1.41 0.0 -1.41 1.85 0.0 -0.77 2.0 0.0 0.0'/> |
553 | <Appearance> |
554 |
<!-- ROUTE information for BoomMaterial node:
[from TransparencyInterp.value_changed to set_transparency
]
-->
<Material DEF='BoomMaterial'/> |
555 |
<ImageTexture
url=' "Boom1.jpg![]() ![]() ![]() |
556 | </Appearance> |
557 | </Shape> |
558 |
<!-- ROUTE information for TransparencyInterp node:
[from BoomTimer.fraction_changed to set_fraction
]
[from value_changed to BoomMaterial.set_transparency
]
-->
<ScalarInterpolator DEF='TransparencyInterp' key='0 0.04 0.1 0.7 1.0' keyValue='1.0 0.2 0.3 1.0 1.0'/> |
559 |
<!-- ROUTE information for ScaleInterp node:
[from BoomTimer.fraction_changed to set_fraction
]
[from value_changed to BoomTransform.set_scale
]
-->
<PositionInterpolator DEF='ScaleInterp' key='0 0.04 0.1 0.7 1.0' keyValue='0.00001 0.00001 0.00001 0.05 0.4 0.05 0.4 0.6 0.4 0.5 0.9 0.5 0.00001 0.0001 0.00001'/> |
560 |
<!-- ROUTE information for BoomTimer node:
[from shootRound.touchTime to set_startTime
]
[from fraction_changed to ScaleInterp.set_fraction
]
[from fraction_changed to TransparencyInterp.set_fraction
]
-->
<TimeSensor DEF='BoomTimer' cycleInterval='5.0'/> |
561 | </Transform> |
562 | < ROUTE fromNode='BOOMCLOCK' fromField='fraction_changed' toNode='BALLSIZE' toField='set_fraction'/> |
563 | < ROUTE fromNode='BALLSIZE' fromField='value_changed' toNode='BallTransform' toField='set_scale'/> |
564 | < ROUTE fromNode='BoomTimer' fromField='fraction_changed' toNode='ScaleInterp' toField='set_fraction'/> |
565 | < ROUTE fromNode='ScaleInterp' fromField='value_changed' toNode='BoomTransform' toField='set_scale'/> |
566 | < ROUTE fromNode='BoomTimer' fromField='fraction_changed' toNode='TransparencyInterp' toField='set_fraction'/> |
567 | < ROUTE fromNode='TransparencyInterp' fromField='value_changed' toNode='BoomMaterial' toField='set_transparency'/> |
568 | </Transform> |
569 | </Transform> |
570 | </Group> |
571 | </Transform> |
572 | <Transform DEF='elevMechMover1'> |
573 | <Transform> |
574 | <Transform rotation='0 0 1 1.57'> |
575 | <Transform rotation='1 0 0 -.25' translation='.45 1.7 -.3'> |
576 |
<!-- Shape
elevatingMech1 is a DEF node that has 1 USE node: USE_1 -->
<Shape DEF='elevatingMech1'> |
577 | <Cylinder height='1.3' radius='.08'/> |
578 | <Appearance USE='camiPaint'/> |
579 | </Shape> |
580 | <Transform translation='0 -1 0'> |
581 |
<!-- Shape
lowerElevMechExtender is a DEF node that has 1 USE node: USE_1 -->
<Shape DEF='lowerElevMechExtender'> |
582 | <Cylinder height='1' radius='.070'/> |
583 | <Appearance> |
584 | <Material diffuseColor='.7 .7 .7'/> |
585 | </Appearance> |
586 | </Shape> |
587 | </Transform> |
588 | </Transform> |
589 | <Transform rotation='1 0 0 -.25' translation='-.45 1.7 -0.3'> |
590 | <Shape USE='elevatingMech1'/> |
591 | <Transform translation='0 -1 0'> |
592 | <Shape USE='lowerElevMechExtender'/> |
593 | </Transform> |
594 | </Transform> |
595 | </Transform> |
596 | </Transform> |
597 | </Transform> |
598 | </Transform> |
599 |
<!-- ROUTE information for upperCylinderMover node:
[from tubeSensor.rotation_changed to barrelRotation
]
[from upperRotation to ruc.set_rotation
]
[from extendCylinder to shrinkCylinder.set_translation
]
[from shrinkCylinder to shrinkCylinder.set_scale
]
[from extendCylinder to shrinkCylinderR.set_translation
]
[from shrinkCylinder to shrinkCylinderR.set_scale
]
-->
<Script DEF='upperCylinderMover'> |
600 | <field name='barrelRotation' type='SFRotation' accessType='inputOnly'/> |
601 | <field name='upperRotation' type='SFRotation' accessType='outputOnly'/> |
602 | <field name='shrinkCylinder' type='SFVec3f' accessType='outputOnly'/> |
603 | <field name='extendCylinder' type='SFVec3f' accessType='outputOnly'/> |
<![CDATA[
ecmascript: function barrelRotation (value, eventTime ) { angle = value[3]; outputAngle = .75 * angle; upperRotation = new SFRotation ( 0, 1, 0, outputAngle); extendCylinder = new SFVec3f ( 0, .22 + (-.7 * angle), 0); shrinkCylinder = new SFVec3f (1, 1.02 * (.85 - angle), 1); }
]]>
|
|
605 | </Script> |
606 | < ROUTE fromNode='tubeSensor' fromField='rotation_changed' toNode='upperCylinderMover' toField='barrelRotation'/> |
607 | < ROUTE fromNode='upperCylinderMover' fromField='upperRotation' toNode='ruc' toField='set_rotation'/> |
608 | < ROUTE fromNode='upperCylinderMover' fromField='extendCylinder' toNode='shrinkCylinder' toField='set_translation'/> |
609 | < ROUTE fromNode='upperCylinderMover' fromField='shrinkCylinder' toNode='shrinkCylinder' toField='set_scale'/> |
610 | < ROUTE fromNode='upperCylinderMover' fromField='extendCylinder' toNode='shrinkCylinderR' toField='set_translation'/> |
611 | < ROUTE fromNode='upperCylinderMover' fromField='shrinkCylinder' toNode='shrinkCylinderR' toField='set_scale'/> |
612 | </Transform> |
613 |
<!-- ROUTE information for carriage_sensor node:
[from rotation_changed to rotateUpperCarriage.set_rotation
]
-->
<CylinderSensor DEF='carriage_sensor' description='sensor for upper carriage deflection' maxAngle='.90' minAngle='-.90'/> |
614 | < ROUTE fromNode='carriage_sensor' fromField='rotation_changed' toNode='rotateUpperCarriage' toField='set_rotation'/> |
615 | </Transform> |
616 | </Group> |
617 | </Group> |
618 |
<Background
backUrl=' "sky2.jpg![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
619 | <Viewpoint DEF='target' description='as seen from target' orientation='0 0.995 -0.097 3.14' position='0 10 -372'/> |
620 | <Transform DEF='theGround' translation='0 -1.5 0'> |
621 | <Transform scale='100 .3 100'> |
622 | <Inline url=' "../../../Vrml2Sourcebook/Chapter14-ElevationGrid/Figure14.5ElevationGridTerrain.x3d" "https://www.web3d.org/x3d/content/examples/Vrml2Sourcebook/Chapter14-ElevationGrid/Figure14.5ElevationGridTerrain.x3d" "../../../Vrml2Sourcebook/Chapter14-ElevationGrid/Figure14.5ElevationGridTerrain.wrl" "https://www.web3d.org/x3d/content/examples/Vrml2Sourcebook/Chapter14-ElevationGrid/Figure14.5ElevationGridTerrain.wrl" '/> |
623 | </Transform> |
624 | </Transform> |
625 | < ROUTE fromNode='wheelSensor' fromField='isOver' toNode='CLOCK' toField='set_enabled'/> |
626 | < ROUTE fromNode='CLOCK' fromField='fraction_changed' toNode='wheelInterpolator' toField='set_fraction'/> |
627 | < ROUTE fromNode='wheelInterpolator' fromField='value_changed' toNode='leftWheel1' toField='set_rotation'/> |
628 | <Transform DEF='fireTheRound' translation='5 3 -5'> |
629 | <Billboard DEF='fireMe'> |
630 | <Transform translation='-1 -.35 0'> |
631 | <Shape> |
632 | <Text string='"FIRE!"'> |
633 | <FontStyle justify='"MIDDLE" "MIDDLE"'/> |
634 | </Text> |
635 | <Appearance> |
636 | <Material emissiveColor='.9 .9 .9'/> |
637 | </Appearance> |
638 | </Shape> |
639 | </Transform> |
640 | <Shape> |
641 | <Box DEF='sign' size='4 2 .2'/> |
642 | <Appearance> |
643 | <Material transparency='.6'/> |
644 | <ImageTexture USE='camo'/> |
645 | </Appearance> |
646 | </Shape> |
647 | </Billboard> |
648 |
<!-- ROUTE information for shootRound node:
[from touchTime to BoomTimer.set_startTime
]
[from touchTime to RECOILTIMER.set_startTime
]
[from touchTime to BOOMCLOCK.set_startTime
]
[from touchTime to clock3.set_startTime
]
[from touchTime to CannonFireSound.startTime
]
[from touchTime to spinTimer.set_startTime
]
-->
<TouchSensor DEF='shootRound' description='touch muzzlebreak to shoot round'/> |
649 |
<!-- ROUTE information for clock3 node:
[from shootRound.touchTime to set_startTime
]
[from fraction_changed to roundPathInterpolator.set_fraction
]
[from fraction_changed to roundOrientationInterpolator.set_fraction
]
-->
<TimeSensor DEF='clock3' cycleInterval='15'/> |
650 | </Transform> |
651 | <Transform DEF='targetSphere' translation='0 0 -320'> |
652 | <Transform> |
653 | <Shape> |
654 | <Box size='10 1 10'/> |
655 | <Appearance USE='camiPaint'/> |
656 | </Shape> |
657 |
<!-- ROUTE information for explosionsoundsensor node:
[from enterTime to explosionSound.startTime
]
-->
<ProximitySensor DEF='explosionsoundsensor' size='200 400 300'/> |
658 | </Transform> |
659 | <Sound DEF='explosionSounds' maxBack='100' maxFront='100' minBack='.01' minFront='.01'> |
660 |
<!-- ROUTE information for explosionSound node:
[from explosionsoundsensor.enterTime to startTime
]
-->
<AudioClip DEF='explosionSound' description='explosion sound' url=' "ShellExplode.au" "https://savage.nps.edu/Savage/Weapons/Guns/ShellExplode.au" '/> |
661 | </Sound> |
662 | < ROUTE fromNode='explosionsoundsensor' fromField='enterTime' toNode='explosionSound' toField='startTime'/> |
663 | </Transform> |
664 | <Transform scale='.2 1 .2' translation='5 0 0'> |
665 | <Shape USE='artyRound'/> |
666 | </Transform> |
667 | <Transform scale='.2 1 .2' translation='5.2 0 0'> |
668 | <Shape USE='artyRound'/> |
669 | </Transform> |
670 | <Transform scale='.2 1 .2' translation='5.4 0 0'> |
671 | <Shape USE='artyRound'/> |
672 | </Transform> |
673 | <Transform/> |
674 | < ROUTE fromNode='shootRound' fromField='touchTime' toNode='BoomTimer' toField='set_startTime'/> |
675 | < ROUTE fromNode='shootRound' fromField='touchTime' toNode='RECOILTIMER' toField='set_startTime'/> |
676 | < ROUTE fromNode='shootRound' fromField='touchTime' toNode='BOOMCLOCK' toField='set_startTime'/> |
677 | < ROUTE fromNode='shootRound' fromField='touchTime' toNode='clock3' toField='set_startTime'/> |
678 | < ROUTE fromNode='shootRound' fromField='touchTime' toNode='CannonFireSound' toField='startTime'/> |
679 | < ROUTE fromNode='clock3' fromField='fraction_changed' toNode='roundPathInterpolator' toField='set_fraction'/> |
680 | < ROUTE fromNode='clock3' fromField='fraction_changed' toNode='roundOrientationInterpolator' toField='set_fraction'/> |
681 | < ROUTE fromNode='roundPathInterpolator' fromField='value_changed' toNode='theRound' toField='set_translation'/> |
682 | < ROUTE fromNode='roundOrientationInterpolator' fromField='value_changed' toNode='theRound' toField='set_rotation'/> |
683 | < ROUTE fromNode='shootRound' fromField='touchTime' toNode='spinTimer' toField='set_startTime'/> |
684 | < ROUTE fromNode='spinTimer' fromField='fraction_changed' toNode='roundSpinner' toField='set_fraction'/> |
685 | < ROUTE fromNode='roundSpinner' fromField='value_changed' toNode='theRoundSpinner' toField='set_rotation'/> |
686 | </Scene> |
687 | </X3D> |
Event Graph ROUTE Table entries with 47 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.
ClearSphere1
TouchSensor touchTime SFTime |
BoxUpTimer
TimeSensor startTime SFTime |
then
|
BoxUpTimer
TimeSensor fraction_changed SFFloat |
wheelUp
OrientationInterpolator set_fraction SFFloat |
then
|
wheelUp
OrientationInterpolator value_changed SFRotation |
AnimationTransform
Transform set_rotation SFRotation |
ClearSphere1
TouchSensor isActive SFBool |
SetBoxUp
IntegerTrigger set_boolean SFBool |
then
|
SetBoxUp
IntegerTrigger triggerValue SFInt32 |
ButtonChoice
Switch whichChoice SFInt32 |
ClearSphere2
TouchSensor touchTime SFTime |
BoxDownTimer
TimeSensor startTime SFTime |
then
|
BoxDownTimer
TimeSensor fraction_changed SFFloat |
wheelDown
OrientationInterpolator set_fraction SFFloat |
then
|
wheelDown
OrientationInterpolator value_changed SFRotation |
AnimationTransform
Transform set_rotation SFRotation |
ClearSphere2
TouchSensor isActive SFBool |
SetBoxDown
IntegerTrigger set_boolean SFBool |
then
|
SetBoxDown
IntegerTrigger triggerValue SFInt32 |
ButtonChoice
Switch whichChoice SFInt32 |
travelLockSensor
TouchSensor touchTime SFTime |
travelLockClock
TimeSensor set_startTime SFTime |
then
|
travelLockClock
TimeSensor fraction_changed SFFloat |
travelLockOrientor
OrientationInterpolator set_fraction SFFloat |
then
|
travelLockOrientor
OrientationInterpolator value_changed SFRotation |
travelLockOrient
Transform set_rotation SFRotation |
wheelSensor
TouchSensor isOver SFBool |
CLOCK
TimeSensor set_enabled SFBool |
then
|
CLOCK
TimeSensor fraction_changed SFFloat |
wheelInterpolator
OrientationInterpolator set_fraction SFFloat |
then
|
wheelInterpolator
OrientationInterpolator value_changed SFRotation |
leftWheel1
Transform set_rotation SFRotation |
explosionsoundsensor
ProximitySensor enterTime SFTime |
explosionSound
AudioClip startTime SFTime |
ExampleViewPositionOrientation
ProtoInstance ViewPositionOrientation |
No ROUTE connection found for output events from this node. This ProtoInstance contains SFNode/MFNode fieldValue declarations with direct access to other nodes, and thus has potential to produce run-time animation. |
carriage_sensor
CylinderSensor rotation_changed SFRotation |
rotateUpperCarriage
Transform set_rotation SFRotation |
lTrailSpreader
CylinderSensor rotation_changed SFRotation |
leftTrailMover
Transform set_rotation SFRotation |
trailSpreader
CylinderSensor rotation_changed SFRotation |
rightTrailMover
Transform set_rotation SFRotation |
tubeSensor
CylinderSensor rotation_changed SFRotation |
barrelMover1
Transform set_rotation SFRotation |
|||||
tubeSensor
CylinderSensor rotation_changed SFRotation |
upperCylinderMover
Script barrelRotation SFRotation |
then
|
upperCylinderMover
Script extendCylinder SFVec3f |
shrinkCylinder
Transform set_translation SFVec3f |
||
then
|
upperCylinderMover
Script extendCylinder SFVec3f |
shrinkCylinderR
Transform set_translation SFVec3f |
||||
then
|
upperCylinderMover
Script shrinkCylinder SFVec3f |
shrinkCylinder
Transform set_scale SFVec3f |
||||
then
|
upperCylinderMover
Script shrinkCylinder SFVec3f |
shrinkCylinderR
Transform set_scale SFVec3f |
||||
then
|
upperCylinderMover
Script upperRotation SFRotation |
ruc
Transform set_rotation SFRotation |
<!--
Color-coding legend: X3D terminology
<X3dNode
DEF='idName' field='value'/>
matches XML terminology
<XmlElement
DEF='idName' attribute='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>
-->
<!--
For additional help information about X3D scenes, please see X3D Tooltips, X3D Resources, and X3D Scene Authoring Hints.
-->