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=' AcousticTransmissionCylinderPrototype.x3d '/> |
6 | <meta name='description' content='An acoustic transmission cylinder has a moving inner radius and a constant (maximum) outer radius, visualizing the pulse width of cylindrical propagation.'/> |
7 | <meta name='creator' content='Don Brutzman and Oliver Tan'/> |
8 | <meta name='created' content='11 May 2004'/> |
9 | <meta name='modified' content='20 October 2019'/> |
10 | <meta name='subject' content='Acoustic transmission'/> |
11 | <meta name='identifier' content=' https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/SeaWeb/AcousticTransmissionCylinderPrototype.x3d '/> |
12 | <meta name='generator' content='X3D-Edit 3.2, https://www.web3d.org/x3d/tools/X3D-Edit'/> |
13 | <meta name='license' content='../../license.html'/> |
14 | </head> |
15 | <Scene> |
16 | <ProtoDeclare name='AcousticTransmissionCylinder' appinfo='AcousticTransmissionCylinder visualizes the pulse width of cylindrical propagation with has a receding inner radius and a (maximum outer radius .'> |
17 | <ProtoInterface> |
18 |
<field name='startTransmission' type='SFBool' accessType='inputOnly'
appinfo='Upon receipt of a boolean true event start a single (not continuous) transmission'/> |
19 |
<field name='startContinuousTransmissions' type='SFBool' accessType='inputOnly'
appinfo='Upon receipt of a boolean true event start continuous transmissions'/> |
20 |
<field name='set_range' type='SFFloat' accessType='inputOnly'
appinfo='Propagation range in meters'/> |
21 |
<field name='defaultRange' type='SFFloat' value='2' accessType='initializeOnly'
appinfo='Default propagation range in meters'/> |
22 |
<field name='transmissionPropagationSpeed' type='SFFloat' value='1500' accessType='initializeOnly'
appinfo='Speed in meters / second'/> |
23 |
<field name='set_transmissionDuration' type='SFFloat' accessType='inputOnly'
appinfo='Duration in seconds'/> |
24 |
<field name='transmissionDuration' type='SFFloat' value='5' accessType='initializeOnly'
appinfo='Duration in seconds'/> |
25 |
<field name='set_beamCount' type='SFInt32' accessType='inputOnly'
appinfo='Number of segmented sections in 360-degree cylindrical beam'/> |
26 |
<field name='beamCount' type='SFInt32' value='0' accessType='initializeOnly'
appinfo='number of segmented sections in 360-degree cylindrical beam'/> |
27 |
<field name='height' type='SFFloat' value='2' accessType='initializeOnly'
appinfo='Height of cylinder in meters'/> |
28 |
<field name='set_color' type='SFColor' accessType='inputOnly'
appinfo='Color of cylinder'/> |
29 |
<field name='color' type='SFColor' value='1 1 0.2' accessType='initializeOnly'
appinfo='Default color of cylinder'/> |
30 | <field name='traceEnabled' type='SFBool' value='false' accessType='initializeOnly'/> |
31 | </ProtoInterface> |
32 | <ProtoBody> |
33 | <Group> |
34 | <Shape> |
35 |
<!-- ROUTE information for TransmissionProfile node:
[from TransmissionPropagationScript.crossSection_changed to set_crossSection
]
[from TransmissionPropagationScript.spine_changed to set_spine
]
-->
<Extrusion DEF='TransmissionProfile' beginCap='false' convex='false' creaseAngle='3.14' endCap='false'/> |
36 | <Appearance> |
37 |
<!-- Material
TransmissionProfileMaterial is a DEF node that has 1 USE node: USE_1
<!-- ROUTE information for TransmissionProfileMaterial node: [from TransmissionPropagationScript.transparency_changed to transparency ] --> <Material DEF='TransmissionProfileMaterial'/> |
38 | </Appearance> |
39 | </Shape> |
40 |
<!-- ROUTE information for AnimationClock node:
[from RestartClock.cycleTime to set_startTime
]
[from TransmissionPropagationScript.animationDuration to set_cycleInterval
]
[from TransmissionPropagationScript.animationStartTime to set_startTime
]
[from fraction_changed to TransmissionPropagationScript.set_fraction
]
-->
<TimeSensor DEF='AnimationClock'/> |
41 |
<!-- ROUTE information for RestartClock node:
[from TransmissionPropagationScript.restartClockDuration to set_cycleInterval
]
[from TransmissionPropagationScript.loopAnimation to loop
]
[from TransmissionPropagationScript.loopStartTime to set_startTime
]
[from cycleTime to AnimationClock.set_startTime
]
-->
<TimeSensor DEF='RestartClock'/> |
42 | < ROUTE fromNode='RestartClock' fromField='cycleTime' toNode='AnimationClock' toField='set_startTime'/> |
43 |
<!-- ROUTE information for TransmissionPropagationScript node:
[from AnimationClock.fraction_changed to set_fraction
]
[from crossSection_changed to TransmissionProfile.set_crossSection
]
[from spine_changed to TransmissionProfile.set_spine
]
[from transparency_changed to TransmissionProfileMaterial.transparency
]
[from animationDuration to AnimationClock.set_cycleInterval
]
[from restartClockDuration to RestartClock.set_cycleInterval
]
[from loopAnimation to RestartClock.loop
]
[from animationStartTime to AnimationClock.set_startTime
]
[from loopStartTime to RestartClock.set_startTime
]
-->
<Script DEF='TransmissionPropagationScript' directOutput='true'> |
44 | <field name='startTransmission' type='SFBool' accessType='inputOnly'/> |
45 | <field name='startContinuousTransmissions' type='SFBool' accessType='inputOnly'/> |
46 | <field name='set_range' type='SFFloat' accessType='inputOnly'/> |
47 | <field name='defaultRange' type='SFFloat' accessType='initializeOnly'/> |
48 | <field name='transmissionPropagationSpeed' type='SFFloat' accessType='initializeOnly'/> |
49 |
<field name='set_transmissionDuration' type='SFFloat' accessType='inputOnly'
appinfo='Duration in seconds'/> |
50 |
<field name='transmissionDuration' type='SFFloat' accessType='initializeOnly'
appinfo='Duration in seconds'/> |
51 | <field name='outerRadius' type='SFFloat' value='0' accessType='initializeOnly'/> |
52 | <field name='innerRadius' type='SFFloat' value='0' accessType='initializeOnly'/> |
53 | <field name='height' type='SFFloat' accessType='initializeOnly'/> |
54 | <field name='set_fraction' type='SFFloat' accessType='inputOnly'/> |
55 | <field name='animationDuration' type='SFTime' accessType='outputOnly'/> |
56 | <field name='restartClockDuration' type='SFTime' accessType='outputOnly'/> |
57 | <field name='loopAnimation' type='SFBool' accessType='outputOnly'/> |
58 | <field name='position' type='MFVec2f' accessType='initializeOnly'> |
59 | <!-- no initialization value, use default --> |
60 | </field> |
61 |
<field name='set_beamCount' type='SFInt32' accessType='inputOnly'
appinfo='Number of segmented sections in 360-degree cylindrical beam'/> |
62 |
<field name='beamCount' type='SFInt32' accessType='initializeOnly'
appinfo='number of segmented sections in 360-degree cylindrical beam'/> |
63 |
<field name='newSpine' type='MFVec3f' accessType='initializeOnly'
appinfo='holding variable for intermediate computations'/> |
64 |
<field name='spine' type='MFVec3f' value='1.00 0.00 0.00 0.92 0.00 -0.38 0.71 0.00 -0.71 0.38 0.00 -0.92 0.00 0.00 -1.00 -0.38 0.00 -0.92 -0.71 0.00 -0.71 -0.92 0.00 -0.38 -1.00 0.00 -0.00 -0.92 0.00 0.38 -0.71 0.00 0.71 -0.38 0.00 0.92 0.00 0.00 1.00 0.38 0.00 0.92 0.71 0.00 0.71 0.92 0.00 0.38 1.00 0.00 0.00' accessType='initializeOnly'
appinfo='horizontal circular spine along central perimeter of rectangular transmission boundaries for each beam'/> |
65 |
<field name='crossSection' type='MFVec2f' accessType='initializeOnly'
appinfo='vertical rectangular outline from inner radius to outer radius'> |
66 | <!-- no initialization value, use default --> |
67 | </field> |
68 | <field name='set_color' type='SFColor' accessType='inputOnly'/> |
69 | <field name='color' type='SFColor' accessType='initializeOnly'/> |
70 | <field name='transparency' type='SFFloat' value='0' accessType='initializeOnly'/> |
71 | <field name='animationStartTime' type='SFTime' accessType='outputOnly'/> |
72 | <field name='loopStartTime' type='SFTime' accessType='outputOnly'/> |
73 | <field name='crossSection_changed' type='MFVec2f' accessType='outputOnly'/> |
74 | <field name='spine_changed' type='MFVec3f' accessType='outputOnly'/> |
75 | <field name='transparency_changed' type='SFFloat' accessType='outputOnly'/> |
76 | <field name='signalProfileMaterial' type='SFNode' accessType='initializeOnly'> |
77 | <Material USE='TransmissionProfileMaterial'/> |
78 | </field> |
79 | <field name='traceEnabled' type='SFBool' accessType='initializeOnly'/> |
80 | <IS> |
81 | <connect nodeField='startTransmission' protoField='startTransmission'/> |
82 | <connect nodeField='startContinuousTransmissions' protoField='startContinuousTransmissions'/> |
83 | <connect nodeField='set_range' protoField='set_range'/> |
84 | <connect nodeField='defaultRange' protoField='defaultRange'/> |
85 | <connect nodeField='transmissionPropagationSpeed' protoField='transmissionPropagationSpeed'/> |
86 | <connect nodeField='set_transmissionDuration' protoField='set_transmissionDuration'/> |
87 | <connect nodeField='transmissionDuration' protoField='transmissionDuration'/> |
88 | <connect nodeField='set_beamCount' protoField='set_beamCount'/> |
89 | <connect nodeField='beamCount' protoField='beamCount'/> |
90 | <connect nodeField='height' protoField='height'/> |
91 | <connect nodeField='set_color' protoField='set_color'/> |
92 | <connect nodeField='color' protoField='color'/> |
93 | <connect nodeField='traceEnabled' protoField='traceEnabled'/> |
94 | </IS> |
<![CDATA[
ecmascript: function initialize() { outerRadius = -1.0; innerRadius = -1.0; animationDuration = defaultRange / transmissionPropagationSpeed + transmissionDuration; tracePrint('beamCount = ' + beamCount); tracePrint('defaultRange = ' + defaultRange); tracePrint('animationDuration=' + animationDuration); tracePrint('transmissionPropagationSpeed=' + transmissionPropagationSpeed); computeSpine(beamCount); updateCrossSection(0); updateExtrusionShape(crossSection, spine, color); } function updateRadii(fraction) { _transmissionPropagationDuration = defaultRange / transmissionPropagationSpeed; _animationDuration = _transmissionPropagationDuration + transmissionDuration; _spineRadius = 1; outerRadius = fraction * _animationDuration * transmissionPropagationSpeed - _spineRadius; if (outerRadius > (defaultRange - _spineRadius)) { outerRadius = defaultRange - _spineRadius; } if ((fraction * _animationDuration) > (_transmissionPropagationDuration + transmissionDuration * 7/8)) { transparency_changed = ( (fraction * _animationDuration) - (_transmissionPropagationDuration + transmissionDuration * 7/8) ) / (transmissionDuration * 1/8); } if ((fraction * _animationDuration) <= transmissionDuration) { innerRadius = -_spineRadius; } else { innerRadius = ((fraction * _animationDuration) - transmissionDuration) * transmissionPropagationSpeed - _spineRadius; if (innerRadius > defaultRange) { innerRadius = defaultRange; } } tracePrint('fraction = ' + fraction); tracePrint('outerRadius = ' + outerRadius); tracePrint('innerRadius = ' + innerRadius); } function set_beamCount (beamCount) { alwaysPrint('set_beamCount(' + beamCount + '), beam spacing=' + (360/beamCount) + ' degrees'); computeSpine(beamCount); } function computeSpine (beamCount) { if (beamCount < 3) { alwaysPrint('** insufficient beamCount=' + beamCount + ', ignored, spine not recomputed'); return; } newSpine = new MFVec3f (); for (index = 0; index <= beamCount; index++) { angle = 2.0 * Math.PI * index / beamCount; newSpine[index] = new SFVec3f (Math.sin(angle), 0.0, Math.cos(angle)); } newSpine[beamCount] = newSpine[0]; // ensure beginning point matches end point spine = newSpine; tracePrint('spine.length=' + spine.length + ', spine=' + spine); } function updateCrossSection(fraction) { updateRadii(fraction); _spineRadius = 1; _outerHeight = Math.abs((outerRadius + _spineRadius) * Math.tan(Math.PI/6)); if (_outerHeight > height) { _outerHeight = height; } _innerHeight = Math.abs((innerRadius + _spineRadius) * Math.tan(Math.PI/6)); if (_innerHeight > height) { _innerHeight = height; } index = 0; position[index] = new SFVec2f(outerRadius, _outerHeight/2); crossSection[index] = new SFVec2f(position[index].x, position[index].y); index++; position[index] = new SFVec2f(innerRadius, _innerHeight/2); crossSection[index] = new SFVec2f(position[index].x, position[index].y); index++; position[index] = new SFVec2f(innerRadius, -_innerHeight/2); crossSection[index] = new SFVec2f(position[index].x, position[index].y); index++; position[index] = new SFVec2f(outerRadius, -_outerHeight/2); crossSection[index] = new SFVec2f(position[index].x, position[index].y); index++; position[index] = new SFVec2f(outerRadius, _outerHeight/2); crossSection[index] = new SFVec2f(position[index].x, position[index].y); tracePrint('position = ' + position); tracePrint('crossSection = ' + crossSection); } function startTransmission(value, timeStamp) { if (value == true) { loopAnimation = false; loopStartTime = -1; animationStartTime = timeStamp; tracePrint('startTransmission ()'); } } function startContinuousTransmissions(value, timeStamp) { if (value == true) { loopAnimation = true; loopStartTime = timeStamp; animationStartTime = timeStamp; tracePrint('startContinuousTransmissions ()'); } } function set_range(value, timeStamp) { if (value >= 0) { defaultRange = value; tracePrint('defaultRange = ' + defaultRange); } else tracePrint('set_range (' + value + '); // no response, negative'); } function set_color(value, timeStamp) { color = value; tracePrint('color = ' + color); } function set_transmissionDuration(value, timeStamp) { if (value >= 0) { transmissionDuration = value; animationDuration = defaultRange / transmissionPropagationSpeed + transmissionDuration; restartClockDuration = 2 * animationDuration; tracePrint('transmissionDuration = ' + transmissionDuration); tracePrint('animationDuration = ' + animationDuration); tracePrint('restartClockDuration = ' + restartClockDuration); } else tracePrint('set_transmissionDuration (' + value + '); // no response, negative'); } function set_fraction(value, timeStamp) { updateCrossSection(value); updateExtrusionShape(crossSection, spine, color); } function updateExtrusionShape(crossSection, spine, color) { // emissiveColor appears unaffected by transparency, unfortunately signalProfileMaterial.diffuseColor = color; signalProfileMaterial.transparency = transparency; tracePrint('Updating crossSection:'); tracePrint(' crossSection = ' + crossSection); tracePrint(' spine = ' + spine); tracePrint(' transparency = ' + transparency); crossSection_changed = crossSection; spine_changed = spine; } function tracePrint(value) { if (traceEnabled) alwaysPrint (value); } function alwaysPrint(value) { Browser.println ('[AcousticTransmissionCylinderPrototype] ' + value); }
]]>
|
|
96 | </Script> |
97 | < ROUTE fromNode='AnimationClock' fromField='fraction_changed' toNode='TransmissionPropagationScript' toField='set_fraction'/> |
98 | < ROUTE fromNode='TransmissionPropagationScript' fromField='crossSection_changed' toNode='TransmissionProfile' toField='set_crossSection'/> |
99 | < ROUTE fromNode='TransmissionPropagationScript' fromField='spine_changed' toNode='TransmissionProfile' toField='set_spine'/> |
100 | < ROUTE fromNode='TransmissionPropagationScript' fromField='transparency_changed' toNode='TransmissionProfileMaterial' toField='transparency'/> |
101 | < ROUTE fromNode='TransmissionPropagationScript' fromField='animationDuration' toNode='AnimationClock' toField='set_cycleInterval'/> |
102 | < ROUTE fromNode='TransmissionPropagationScript' fromField='restartClockDuration' toNode='RestartClock' toField='set_cycleInterval'/> |
103 | < ROUTE fromNode='TransmissionPropagationScript' fromField='loopAnimation' toNode='RestartClock' toField='loop'/> |
104 | < ROUTE fromNode='TransmissionPropagationScript' fromField='animationStartTime' toNode='AnimationClock' toField='set_startTime'/> |
105 | < ROUTE fromNode='TransmissionPropagationScript' fromField='loopStartTime' toNode='RestartClock' toField='set_startTime'/> |
106 | </Group> |
107 | </ProtoBody> |
108 | </ProtoDeclare> |
109 | <!-- Viewable geometry for this scene is anchored text that links to an example showing ExternProtoDeclare usage of AcousticTransmissionCylinder --> |
110 | <WorldInfo info='"Produce acoustic transmission cylinders"' title='AcousticTransmissionCylinderPrototype'/> |
111 | <Viewpoint description='Acoustic Transmission Cylinder' position='0 0 15'/> |
112 | <Anchor description='Acoustic Transmission Cylinder Example' url=' "AcousticTransmissionCylinderExample.x3d" "../../CommunicationsAndSensors/SeaWeb/AcousticTransmissionCylinderExample.x3d" "https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/SeaWeb/AcousticTransmissionCylinderExample.x3d" "AcousticTransmissionCylinderExample.wrl" "../../CommunicationsAndSensors/SeaWeb/AcousticTransmissionCylinderExample.wrl" "https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/SeaWeb/AcousticTransmissionCylinderExample.wrl" '> |
113 | <Shape> |
114 | <Appearance> |
115 | <Material diffuseColor='0 1 1' emissiveColor='0 1 1'/> |
116 | </Appearance> |
117 | <Text string='"AcousticTransmissionCylinderPrototype" "is a Prototype definition file" "" "To see an example scene" "click this text and view" "AcousticTransmissionCylinderExample"'> |
118 | <FontStyle justify='"MIDDLE" "MIDDLE"'/> |
119 | </Text> |
120 | </Shape> |
121 | </Anchor> |
122 | </Scene> |
123 | </X3D> |
Event Graph ROUTE Table entries with 10 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.
line 112
Anchor |
description='Acoustic Transmission Cylinder Example' User-interaction hint for this node. |
<!--
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)
<ProtoDeclare name='ProtoName'>
<field
name='fieldName'/> </ProtoDeclare>
-->
<!--
For additional help information about X3D scenes, please see X3D Tooltips, X3D Resources, and X3D Scene Authoring Hints.
-->