| 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.
-->