| 1 |
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.3//EN" "https://www.web3d.org/specifications/x3d-3.3.dtd">
|
| 3 | <X3D profile='Immersive' version='3.3' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='https://www.web3d.org/specifications/x3d-3.3.xsd'> |
| 4 | <head> |
| 5 | <meta name='title' content=' SideScanSonarPrototype.x3d '/> |
| 6 | <meta name='description' content='Produce wireframe or transparent sidescan sonar beams.'/> |
| 7 | <meta name='creator' content='Don Brutzman'/> |
| 8 | <meta name='created' content='15 March 2001'/> |
| 9 | <meta name='modified' content='20 October 2019'/> |
| 10 | <meta name='identifier' content=' https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/Sonar/SideScanSonarPrototype.x3d '/> |
| 11 | <meta name='generator' content='X3D-Edit 3.3, https://www.web3d.org/x3d/tools/X3D-Edit'/> |
| 12 | <meta name='license' content='../../license.html'/> |
| 13 | </head> |
| 14 | <Scene> |
| 15 | <NavigationInfo DEF='LockedDownInterface2D' type='"NONE"'/> |
| 16 | <Background skyColor='0 0.3 0.5'/> |
| 17 | <WorldInfo info='"Produce wireframe or transparent beam cones."' title='BeamCone Prototyupe'/> |
| 18 | <Viewpoint description='SideScanSonar Prototype' position='0 0 15'/> |
| 19 | <ProtoDeclare name='SideScanSonar' appinfo='Produce wireframe or semi-transparent sonar sidescan beams'> |
| 20 | <ProtoInterface> |
| 21 |
<field name='altitude' type='SFFloat' accessType='inputOnly'
appinfo='vertical distance above bottom in meters along y axis'/> |
| 22 |
<field name='defaultAltitude' type='SFFloat' value='3' accessType='initializeOnly'
appinfo='default vertical distance above bottom in meters along y axis'/> |
| 23 |
<field name='maxAltitude' type='SFFloat' value='3' accessType='initializeOnly'
appinfo='maximum effective altitude of sidescan sonar above bottom'/> |
| 24 |
<field name='defaultCrossTrackHalfRange' type='SFFloat' value='30' accessType='initializeOnly'
appinfo='distance in meters from nadir to rightmost/leftmost edge when operating at defaultAltitude above the bottom'/> |
| 25 |
<field name='defaultTrackWidthMeters' type='SFFloat' value='0.30' accessType='initializeOnly'
appinfo='longitudinal width of a single return'/> |
| 26 |
<field name='vehicleWidthMeters' type='SFFloat' value='0.178' accessType='initializeOnly'
appinfo='width (or diameter) of vehicle carrying port/starboard sidescan sonar transducers'/> |
| 27 |
<field name='contact' type='SFBool' accessType='inputOnly'
appinfo='(communications) whether transmitted signal is in contact with receiver or (sensor) is a target return detected?'/> |
| 28 |
<field name='wireframe' type='SFBool' value='true' accessType='initializeOnly'
appinfo='draw lines for tracking shape?'/> |
| 29 |
<field name='solid' type='SFBool' value='true' accessType='initializeOnly'
appinfo='draw solid tracking shape?'/> |
| 30 |
<field name='contactColor' type='SFColor' value='.8 .1 .1' accessType='initializeOnly'
appinfo='rendering color when contact=true'/> |
| 31 |
<field name='noContactColor' type='SFColor' value='.3 .5 .5' accessType='initializeOnly'
appinfo='rendering color when contact=false'/> |
| 32 |
<field name='transparency' type='SFFloat' value='0' accessType='inputOutput'
appinfo='1 = fully transparent wireframe only'/> |
| 33 | </ProtoInterface> |
| 34 | <ProtoBody> |
| 35 | <!-- BEAM_CONTROL beam scaling is controlled by range/beamHeightDegrees/beamWidthDegrees/direction inputs --> |
| 36 |
<!-- ROUTE information for BEAM_CONTROL node:
[from BEAM_CALCULATE.beamScale to scale
]
-->
<Transform DEF='BEAM_CONTROL'> |
| 37 |
<!-- ROUTE information for WIREFRAME_SWITCH node:
[from DETECTION.wireframeChoice to whichChoice
]
-->
<Switch DEF='WIREFRAME_SWITCH' whichChoice='1'> |
| 38 | <!-- TODO refactor index values starting from -1, remove WorldInfo --> |
| 39 | <WorldInfo info='"initial choice is null node (WorldInfo), meaning no wireframe beam"'/> |
| 40 | <Shape> |
| 41 | <Appearance> |
| 42 |
<!-- ROUTE information for WireMaterial node:
[from DETECTION.beamColor to emissiveColor
]
-->
<Material DEF='WireMaterial' diffuseColor='.1 .1 .1' emissiveColor='.1 .1 .1'> |
| 43 | <IS> |
| 44 | <connect nodeField='transparency' protoField='transparency'/> |
| 45 | </IS> |
| 46 | </Material> |
| 47 | </Appearance> |
| 48 | <IndexedLineSet DEF='ILS' coordIndex='1 2 3 1 -1 5 3 4 5 -1 6 8 7 6 -1 10 9 8 10 -1 6 7 2 1 6 -1 10 5 4 9 10 -1'> |
| 49 |
<!-- Coordinate
BeamPatternCoordinatePoints is a DEF node that has 1 USE node: USE_1
<!-- ROUTE information for BeamPatternCoordinatePoints node: [from BEAM_CALCULATE.coordinatePoints to point ] --> <Coordinate DEF='BeamPatternCoordinatePoints' point='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0'/> |
| 50 | </IndexedLineSet> |
| 51 | </Shape> |
| 52 | </Switch> |
| 53 |
<!-- ROUTE information for SOLID_SWITCH node:
[from DETECTION.solidChoice to whichChoice
]
-->
<Switch DEF='SOLID_SWITCH' whichChoice='0'> |
| 54 | <!-- TODO refactor index values starting from -1, remove WorldInfo --> |
| 55 | <WorldInfo info='"initial choice is null node (WorldInfo), meaning no solid beam"'/> |
| 56 | <Shape> |
| 57 | <Appearance> |
| 58 |
<!-- Material
FaceMaterial is a DEF node that has 1 USE node: USE_1
<!-- ROUTE information for FaceMaterial node: [from DETECTION.beamColor to emissiveColor ] --> <Material DEF='FaceMaterial' diffuseColor='.1 .1 .1'> |
| 59 | <IS> |
| 60 | <connect nodeField='transparency' protoField='transparency'/> |
| 61 | </IS> |
| 62 | </Material> |
| 63 | </Appearance> |
| 64 | <IndexedFaceSet DEF='IFS' solid='false' coordIndex='1 2 3 1 -1 5 3 4 5 -1 6 8 7 6 -1 10 9 8 10 -1 6 7 2 1 6 -1 10 5 4 9 10 -1'> |
| 65 | <Coordinate USE='BeamPatternCoordinatePoints'/> |
| 66 | </IndexedFaceSet> |
| 67 | </Shape> |
| 68 | </Switch> |
| 69 | </Transform> |
| 70 | <!-- Non-renderable animation controls --> |
| 71 |
<!-- ROUTE information for BEAM_CALCULATE node:
[from beamScale to BEAM_CONTROL.scale
]
[from coordinatePoints to BeamPatternCoordinatePoints.point
]
-->
<Script DEF='BEAM_CALCULATE'> |
| 72 | <field name='altitude' type='SFFloat' accessType='inputOnly'/> |
| 73 | <field name='defaultAltitude' type='SFFloat' accessType='initializeOnly'/> |
| 74 | <field name='maxAltitude' type='SFFloat' accessType='initializeOnly'/> |
| 75 | <field name='defaultCrossTrackHalfRange' type='SFFloat' accessType='initializeOnly'/> |
| 76 | <field name='defaultTrackWidthMeters' type='SFFloat' accessType='initializeOnly'/> |
| 77 | <field name='vehicleWidthMeters' type='SFFloat' accessType='initializeOnly'/> |
| 78 | <field name='beamScale' type='SFVec3f' accessType='outputOnly'/> |
| 79 | <field name='coordinatePoints' type='MFVec3f' accessType='outputOnly'/> |
| 80 |
<field name='traceEnabled' type='SFBool' value='false' accessType='initializeOnly'
appinfo='internal flag to turn on Script tracing'/> |
| 81 | <IS> |
| 82 | <connect nodeField='altitude' protoField='altitude'/> |
| 83 | <connect nodeField='defaultAltitude' protoField='defaultAltitude'/> |
| 84 | <connect nodeField='maxAltitude' protoField='maxAltitude'/> |
| 85 | <connect nodeField='defaultCrossTrackHalfRange' protoField='defaultCrossTrackHalfRange'/> |
| 86 | <connect nodeField='defaultTrackWidthMeters' protoField='defaultTrackWidthMeters'/> |
| 87 | <connect nodeField='vehicleWidthMeters' protoField='vehicleWidthMeters'/> |
| 88 | </IS> |
<![CDATA[
ecmascript:
function tracePrint (value)
{
if (traceEnabled) Browser.println ('[SideScanSonar BEAM_CALCULATE] ' + value);
}
function initialize () {
beamScale = new SFVec3f (1, 1, 1);
dt2 = defaultTrackWidthMeters/2;
origin = new SFVec3f (0, 0, 0);
a = new SFVec3f (-dt2, 0, -vehicleWidthMeters/2);
b = new SFVec3f (-dt2, -defaultAltitude, -defaultCrossTrackHalfRange);
c = new SFVec3f (-dt2, -defaultAltitude, 0);
d = new SFVec3f (-dt2, -defaultAltitude, defaultCrossTrackHalfRange);
e = new SFVec3f (-dt2, 0, vehicleWidthMeters/2);
aa = new SFVec3f ( dt2, 0, -vehicleWidthMeters/2);
bb = new SFVec3f ( dt2, -defaultAltitude, -defaultCrossTrackHalfRange);
cc = new SFVec3f ( dt2, -defaultAltitude, 0);
dd = new SFVec3f ( dt2, -defaultAltitude, defaultCrossTrackHalfRange);
ee = new SFVec3f ( dt2, 0, vehicleWidthMeters/2);
coordinatePoints = new MFVec3f (origin, a, b, c, d, e, aa, bb, cc, dd, ee);
tracePrint ('coordinatePoints =' + coordinatePoints);
}
function altitude (newAltitude, timeStamp) {
if (newAltitude <= 0)
{
beamHeightFactor= 0.001;
beamScale = new SFVec3f (1, beamHeightFactor, beamHeightFactor);
}
else if (newAltitude < maxAltitude)
{
beamHeightFactor= newAltitude / defaultAltitude;
beamScale = new SFVec3f (1, beamHeightFactor, beamHeightFactor);
}
else
{
beamHeightFactor= maxAltitude / defaultAltitude;
beamScale = new SFVec3f (1, beamHeightFactor, beamHeightFactor);
}
tracePrint ('newAltitude =' + newAltitude);
tracePrint ('beamHeightFactor =' + beamHeightFactor);
tracePrint ('beamScale =' + beamScale);
}
]]>
|
|
| 90 | </Script> |
| 91 |
<!-- ROUTE information for DETECTION node:
[from beamColor to WireMaterial.emissiveColor
]
[from beamColor to FaceMaterial.emissiveColor
]
[from wireframeChoice to WIREFRAME_SWITCH.whichChoice
]
[from solidChoice to SOLID_SWITCH.whichChoice
]
-->
<Script DEF='DETECTION' directOutput='true'> |
| 92 | <field name='contact' type='SFBool' accessType='inputOnly'/> |
| 93 | <field name='wireframe' type='SFBool' accessType='initializeOnly'/> |
| 94 | <field name='solid' type='SFBool' accessType='initializeOnly'/> |
| 95 | <field name='contactColor' type='SFColor' accessType='initializeOnly'/> |
| 96 | <field name='noContactColor' type='SFColor' accessType='initializeOnly'/> |
| 97 | <field name='beamColor' type='SFColor' accessType='outputOnly'/> |
| 98 | <field name='wireframeChoice' type='SFInt32' accessType='outputOnly'/> |
| 99 | <field name='solidChoice' type='SFInt32' accessType='outputOnly'/> |
| 100 | <field name='MaterialNodeHolder' type='SFNode' accessType='initializeOnly'> |
| 101 | <Material USE='FaceMaterial'/> |
| 102 | </field> |
| 103 |
<field name='traceEnabled' type='SFBool' value='false' accessType='initializeOnly'
appinfo='internal flag to turn on Script tracing'/> |
| 104 | <IS> |
| 105 | <connect nodeField='contact' protoField='contact'/> |
| 106 | <connect nodeField='wireframe' protoField='wireframe'/> |
| 107 | <connect nodeField='solid' protoField='solid'/> |
| 108 | <connect nodeField='contactColor' protoField='contactColor'/> |
| 109 | <connect nodeField='noContactColor' protoField='noContactColor'/> |
| 110 | </IS> |
<![CDATA[
ecmascript:
function tracePrint (value)
{
if (traceEnabled) Browser.println ('[SideScanSonar DETECTION] ' + value);
}
function initialize ()
{
beamColor = noContactColor;
if (wireframe == true) wireframeChoice = 1;
if (solid == true) solidChoice = 1;
// Debug statements
tracePrint (' wireframe =' + wireframe);
tracePrint (' solid =' + solid);
tracePrint (' contactColor =' + contactColor);
tracePrint (' noContactColor =' + noContactColor);
tracePrint (' beamColor =' + beamColor);
tracePrint (' wireframeChoice =' + wireframeChoice);
tracePrint (' solidChoice =' + solidChoice);
tracePrint (' transparency =' + MaterialNodeHolder.transparency);
}
function contact (newDetect, timeStamp)
{
tracePrint (' newDetect =' + newDetect);
if (newDetect) beamColor = contactColor;
else beamColor = noContactColor;
}
]]>
|
|
| 112 | </Script> |
| 113 | < ROUTE fromNode='BEAM_CALCULATE' fromField='beamScale' toNode='BEAM_CONTROL' toField='scale'/> |
| 114 | < ROUTE fromNode='BEAM_CALCULATE' fromField='coordinatePoints' toNode='BeamPatternCoordinatePoints' toField='point'/> |
| 115 | < ROUTE fromNode='DETECTION' fromField='beamColor' toNode='WireMaterial' toField='emissiveColor'/> |
| 116 | < ROUTE fromNode='DETECTION' fromField='beamColor' toNode='FaceMaterial' toField='emissiveColor'/> |
| 117 | < ROUTE fromNode='DETECTION' fromField='wireframeChoice' toNode='WIREFRAME_SWITCH' toField='whichChoice'/> |
| 118 | < ROUTE fromNode='DETECTION' fromField='solidChoice' toNode='SOLID_SWITCH' toField='whichChoice'/> |
| 119 | </ProtoBody> |
| 120 | </ProtoDeclare> |
| 121 | <!-- Viewable geometry for this scene is anchored text that links to an example showing ExternProtoDeclare usage of BeamCone --> |
| 122 | <Anchor description='SideScanSonar Example' parameter='"target=_blank"' url=' "SideScanSonarExample.x3d" "https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/Sonar/SideScanSonarExample.x3d" "SideScanSonarExample.wrl" "https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/Sonar/SideScanSonarExample.wrl" '> |
| 123 | <Shape> |
| 124 | <Appearance> |
| 125 | <Material diffuseColor='0 1 1' emissiveColor='0 1 1'/> |
| 126 | </Appearance> |
| 127 | <Text string='"SideScanSonarPrototype" "is a Prototype definition file." "" "To see an example scene" "click this text and view" "SideScanSonarExample."'> |
| 128 | <FontStyle justify='"MIDDLE" "MIDDLE"'/> |
| 129 | </Text> |
| 130 | </Shape> |
| 131 | <Shape> |
| 132 | <!-- transparent Box as text-selection assist --> |
| 133 | <Box size='10.5 6 .001'/> |
| 134 | <Appearance> |
| 135 | <Material transparency='1'/> |
| 136 | </Appearance> |
| 137 | </Shape> |
| 138 | </Anchor> |
| 139 | </Scene> |
| 140 | </X3D> |
Event Graph ROUTE Table entries with 6 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.
|
BEAM_CALCULATE
Script beamScale SFVec3f |
BEAM_CONTROL
Transform scale SFVec3f |
|
|
BEAM_CALCULATE
Script coordinatePoints MFVec3f |
BeamPatternCoordinatePoints
Coordinate point MFVec3f |
|
DETECTION
Script beamColor SFColor |
WireMaterial
Material emissiveColor SFColor |
|
|
DETECTION
Script beamColor SFColor |
FaceMaterial
Material emissiveColor SFColor |
|
|
DETECTION
Script wireframeChoice SFInt32 |
WIREFRAME_SWITCH
Switch whichChoice SFInt32 |
|
|
DETECTION
Script solidChoice SFInt32 |
SOLID_SWITCH
Switch whichChoice SFInt32 |
| line 122
Anchor |
description='SideScanSonar 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.
-->