| 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> | 
 DEF nodes index: 
               
               AnimationClock,
RestartClock,
TransmissionProfile,
TransmissionProfileMaterial,
TransmissionPropagationScript
               
               
                  DEF nodes index: 
               
               AnimationClock,
RestartClock,
TransmissionProfile,
TransmissionProfileMaterial,
TransmissionPropagationScript
| 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> | 
 DEF nodes index: 
         
         AnimationClock,
RestartClock,
TransmissionProfile,
TransmissionProfileMaterial,
TransmissionPropagationScript
         
         
            DEF nodes index: 
         
         AnimationClock,
RestartClock,
TransmissionProfile,
TransmissionProfileMaterial,
TransmissionPropagationScript
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.
-->
         
         <!--
For additional help information about X3D scenes, please see X3D Tooltips, X3D Resources, and X3D Scene Authoring Hints.
-->