1 |
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.2//EN" "https://www.web3d.org/specifications/x3d-3.2.dtd">
|
3 | <X3D profile='Immersive' version='3.2' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='https://www.web3d.org/specifications/x3d-3.2.xsd'> |
4 | <head> |
5 | <meta name='title' content='TestPosition2DFollower.x3d'/> |
6 | <meta name='description' content='X3D Follower example'/> |
7 | <meta name='creator' content='Herbert Stocker'/> |
8 | <meta name='translator' content='Don Brutzman'/> |
9 | <meta name='created' content='18 April 2006'/> |
10 | <meta name='translated' content='2 December 2011'/> |
11 | <meta name='modified' content='11 August 2024'/> |
12 | <meta name='reference' content='originals/test_Pos2DFollower.wrl'/> |
13 | <meta name='reference' content='Stocker_06_Followers.pdf'/> |
14 | <meta name='reference' content='http://www.hersto.com/Publications/Followers'/> |
15 | <meta name='requires' content='X3D version 3.2 or greater'/> |
16 | <meta name='subject' content='X3D Follower Chaser Damper'/> |
17 | <meta name=' warning ' content=' under development, instantReality works but BS Contact fails silently '/> |
18 | <meta name='reference' content='https://www.web3d.org/x3d/specifications/ISO-IEC-19775-1.2-X3D-AbstractSpecification/Part01/components/followers.html'/> |
19 | <meta name='reference' content='https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html'/> |
20 | <meta name='identifier' content='https://www.web3d.org/x3d/content/examples/Basic/Followers/TestPosition2DFollower.x3d'/> |
21 | <meta name='generator' content='Vrml97ToX3dNist, http://ovrt.nist.gov/v2_x3d.html'/> |
22 | <meta name='generator' content='X3D-Edit 3.3, https://savage.nps.edu/X3D-Edit'/> |
23 | <meta name='license' content='../../license.html'/> |
24 | </head> |
25 | <Scene> |
26 | <WorldInfo title='TestPosition2DFollower.x3d'/> |
27 | <Viewpoint fieldOfView='0.716' position='0.0 0.0 15.0'/> |
28 | <NavigationInfo type='"NONE"'/> |
29 | <Group> |
30 |
<!-- ROUTE information for PositionTouchSensor node:
[from hitTexCoord_changed to ScrTexCoordTo3D.A_in
]
[from hitTexCoord_changed to PositionDamper2DNode.set_destination
]
[from hitTexCoord_changed to PositionChaser2DNode.set_destination
]
-->
<TouchSensor DEF='PositionTouchSensor' description='move ball to demonstrate PositionChaser2D, PositionDamper2D'/> |
31 | <Transform translation='0.0 0.0 -0.05'> |
32 | <Shape> |
33 | <Appearance> |
34 | <Material diffuseColor='0.0 0.0 0.0' emissiveColor='0.28 0.27 0.24'/> |
35 | </Appearance> |
36 | <Box size='10.0 10.0 0.1'/> |
37 | </Shape> |
38 | </Transform> |
39 | </Group> |
40 |
<!-- ROUTE information for TrObjectDirect node:
[from ScrTexCoordTo3D.A_ot to translation
]
-->
<Transform DEF='TrObjectDirect' scale='0.8 0.8 0.8'> |
41 | <Shape> |
42 | <Appearance> |
43 | <Material ambientIntensity='0.0333' diffuseColor='0.02 0.24 0.53' emissiveColor='0.01 0.12 0.27' shininess='0.54' specularColor='0.32 0.4 0.4'/> |
44 | </Appearance> |
45 |
<!-- Sphere
GeomObject is a DEF node that has 2 USE nodes: USE_1, USE_2 --> <Sphere DEF='GeomObject' radius='0.3'/> |
46 | </Shape> |
47 | </Transform> |
48 |
<!-- ROUTE information for ScrTexCoordTo3D node:
[from PositionTouchSensor.hitTexCoord_changed to A_in
]
[from PositionDamper2DNode.value_changed to B_in
]
[from PositionChaser2DNode.value_changed to C_in
]
[from A_ot to TrObjectDirect.translation
]
[from B_ot to TrObjectDampered.translation
]
[from C_ot to TrObjectFollowed.translation
]
-->
<Script DEF='ScrTexCoordTo3D'> |
49 | <field name='A_ot' type='SFVec3f' accessType='outputOnly'/> |
50 | <field name='B_in' type='SFVec2f' accessType='inputOnly'/> |
51 | <field name='A_in' type='SFVec2f' accessType='inputOnly'/> |
52 | <field name='C_ot' type='SFVec3f' accessType='outputOnly'/> |
53 | <field name='B_ot' type='SFVec3f' accessType='outputOnly'/> |
54 | <field name='C_in' type='SFVec2f' accessType='inputOnly'/> |
<![CDATA[
ecmascript: function A_in(a) { A_ot= (new SFVec3f(a.x, a.y, 0)).multiply(10).subtract(new SFVec3f(5, 5, 0)); } function B_in(b) { B_ot= (new SFVec3f(b.x, b.y, 0)).multiply(10).subtract(new SFVec3f(5, 5, 0)); } function C_in(c) { C_ot= (new SFVec3f(c.x, c.y, 0)).multiply(10).subtract(new SFVec3f(5, 5, 0)); }
]]>
|
|
56 | </Script> |
57 | < ROUTE fromNode='PositionTouchSensor' fromField='hitTexCoord_changed' toNode='ScrTexCoordTo3D' toField='A_in'/> |
58 | < ROUTE fromNode='ScrTexCoordTo3D' fromField='A_ot' toNode='TrObjectDirect' toField='translation'/> |
59 |
<!-- ROUTE information for SwObjectDampered node:
[from ScrBtnMgr.WcDamper to whichChoice
]
-->
<Switch DEF='SwObjectDampered' whichChoice='0'> |
60 |
<!-- ROUTE information for TrObjectDampered node:
[from ScrTexCoordTo3D.B_ot to translation
]
[from translation to ScrTrailer.DamperPos
]
-->
<Transform DEF='TrObjectDampered'> |
61 | <Shape> |
62 |
<!-- Appearance
AppObjectDampered is a DEF node that has 1 USE node: USE_1 -->
<Appearance DEF='AppObjectDampered'> |
63 | <Material ambientIntensity='0.0333' diffuseColor='0.53 0.02 0.24' emissiveColor='0.27 0.01 0.12' shininess='0.54' specularColor='0.4 0.32 0.4'/> |
64 | </Appearance> |
65 | <Sphere USE='GeomObject'/> |
66 | </Shape> |
67 | </Transform> |
68 | </Switch> |
69 |
<!-- ROUTE information for PositionDamper2DNode node:
[from PositionTouchSensor.hitTexCoord_changed to set_destination
]
[from value_changed to ScrTexCoordTo3D.B_in
]
-->
<PositionDamper2D DEF='PositionDamper2DNode' containerField='children'/> |
70 | < ROUTE fromNode='PositionTouchSensor' fromField='hitTexCoord_changed' toNode='PositionDamper2DNode' toField='set_destination'/> |
71 | < ROUTE fromNode='PositionDamper2DNode' fromField='value_changed' toNode='ScrTexCoordTo3D' toField='B_in'/> |
72 | < ROUTE fromNode='ScrTexCoordTo3D' fromField='B_ot' toNode='TrObjectDampered' toField='translation'/> |
73 |
<!-- ROUTE information for SwObjectFollowed node:
[from ScrBtnMgr.WcChaser to whichChoice
]
-->
<Switch DEF='SwObjectFollowed' whichChoice='0'> |
74 |
<!-- ROUTE information for TrObjectFollowed node:
[from ScrTexCoordTo3D.C_ot to translation
]
[from translation to ScrTrailer.ChaserPos
]
-->
<Transform DEF='TrObjectFollowed'> |
75 | <Shape> |
76 |
<!-- Appearance
AppObjectFollowed is a DEF node that has 1 USE node: USE_1 -->
<Appearance DEF='AppObjectFollowed'> |
77 | <Material ambientIntensity='0.0333' diffuseColor='0.24 0.53 0.02' emissiveColor='0.12 0.27 0.01' shininess='0.54' specularColor='0.4 0.4 0.32'/> |
78 | </Appearance> |
79 | <Sphere USE='GeomObject'/> |
80 | </Shape> |
81 | </Transform> |
82 | </Switch> |
83 |
<!-- ROUTE information for PositionChaser2DNode node:
[from PositionTouchSensor.hitTexCoord_changed to set_destination
]
[from value_changed to ScrTexCoordTo3D.C_in
]
-->
<PositionChaser2D DEF='PositionChaser2DNode' duration='1.5' containerField='children'/> |
84 | < ROUTE fromNode='PositionTouchSensor' fromField='hitTexCoord_changed' toNode='PositionChaser2DNode' toField='set_destination'/> |
85 | < ROUTE fromNode='PositionChaser2DNode' fromField='value_changed' toNode='ScrTexCoordTo3D' toField='C_in'/> |
86 | < ROUTE fromNode='ScrTexCoordTo3D' fromField='C_ot' toNode='TrObjectFollowed' toField='translation'/> |
87 | <ProtoDeclare name='ToggleButton'> |
88 | <ProtoInterface> |
89 | <field name='HottColor' type='SFColor' value='0.8 0.8 0.3' accessType='initializeOnly'/> |
90 | <field name='initiallyOn' type='SFBool' value='false' accessType='initializeOnly'/> |
91 | <field name='ColdColor' type='SFColor' value='0.2 0.2 0.0' accessType='initializeOnly'/> |
92 | <field name='isOn' type='SFBool' accessType='outputOnly'/> |
93 | </ProtoInterface> |
94 | <ProtoBody> |
95 | <Transform scale='0.4 0.4 0.4'> |
96 | <TouchSensor DEF='Touch' description='touch to activate'/> |
97 | <Shape DEF='ShRect'> |
98 | <Appearance> |
99 | <Material DEF='Mat' ambientIntensity='0.04' diffuseColor='0.0 0.0 0.0' shininess='0.11'/> |
100 | </Appearance> |
101 | <IndexedFaceSet coordIndex='0 1 2 3 -1'> |
102 | <Coordinate point='-1.0 -1.0 0.0 1.0 -1.0 0.0 1.0 1.0 0.0 -1.0 1.0 0.0'/> |
103 | </IndexedFaceSet> |
104 | </Shape> |
105 | </Transform> |
106 |
<!-- ROUTE information for ScrToggleButton node:
[from Tau to ColorDamperNode.tau
]
[from Color to ColorDamperNode.set_destination
]
[from Tau to Trace_ROUTE_ScrToggleButton.Tau_TO_Damp.tau.traceValue
]
-->
<Script DEF='ScrToggleButton'> |
107 | <field name='TS_Touched' type='SFTime' accessType='inputOnly'/> |
108 | <field name='Color' type='SFColor' accessType='outputOnly'/> |
109 | <field name='isOn' type='SFBool' accessType='outputOnly'/> |
110 | <field name='ColdColor' type='SFColor' accessType='initializeOnly'/> |
111 | <field name='Tau' type='SFTime' accessType='outputOnly'/> |
112 | <field name='initiallyOn' type='SFBool' accessType='initializeOnly'/> |
113 | <field name='DamperSThere' type='SFBool' accessType='inputOnly'/> |
114 | <field name='HottColor' type='SFColor' accessType='initializeOnly'/> |
115 | <IS> |
116 | <connect nodeField='isOn' protoField='isOn'/> |
117 | <connect nodeField='ColdColor' protoField='ColdColor'/> |
118 | <connect nodeField='initiallyOn' protoField='initiallyOn'/> |
119 | <connect nodeField='HottColor' protoField='HottColor'/> |
120 | </IS> |
<![CDATA[
ecmascript: function DamperSThere() { activate(initiallyOn); } function activate(a) { isOn= a; Tau= a? .1 : .2; Color= a? HottColor : ColdColor; } function set_id(i) { id= i; } function TS_Touched() { activate(!isOn); }
]]>
|
|
122 | </Script> |
123 |
<!-- ROUTE information for ColorDamperNode node:
[from ScrToggleButton.Tau to tau
]
[from ScrToggleButton.Color to set_destination
]
-->
<ColorDamper DEF='ColorDamperNode' order='1' containerField='children'/> |
124 | < ROUTE fromNode='ScrToggleButton' fromField='Tau' toNode='ColorDamperNode' toField='tau'/> |
125 | < ROUTE fromNode='ScrToggleButton' fromField='Color' toNode='ColorDamperNode' toField='set_destination'/> |
126 | <Group> |
127 | <!-- ======= ROUTE Trace ============================================== --> |
128 |
<!-- ROUTE information for Trace_ROUTE_ScrToggleButton.Tau_TO_Damp.tau node:
[from ScrToggleButton.Tau to traceValue
]
-->
<Script DEF='Trace_ROUTE_ScrToggleButton.Tau_TO_Damp.tau' mustEvaluate='true'> |
129 | <!-- Trace ROUTEd values on X3D browser console --> |
130 |
<field name='reportInterval' type='SFTime' value='1.0' accessType='initializeOnly'
appinfo='Sampling frequency in seconds (0 means all values)'/> |
131 | <field name='traceValue' type='SFTime' accessType='inputOnly'/> |
132 | <field name='timeStampPreviousReport' type='SFTime' value='-1' accessType='initializeOnly'/> |
<![CDATA[
ecmascript: function traceValue (eventValue, timeStamp) { // input eventValue received for trace field if (timeStamp - timeStampPreviousReport >= reportInterval) { Browser.println ('Trace_ROUTE_ScrToggleButton.Tau_TO_Damp.tau type=SFFloat value=' + eventValue); timeStampPreviousReport = timeStamp; } } function timeOfDay (someTime) { hh = Math.floor (someTime /(60*60)) % 24; mm = Math.floor (someTime / 60) % 60; ss = Math.floor (someTime) % 60; if (hh < 9) hour = '0' + hh; else hour = hh; if (mm < 9) minute = '0' + mm; else minute = mm; if (ss < 9) second = '0' + ss; else second = ss; return '(' + hour + ':' + minute + ':' + second + ' GMT)'; }
]]>
|
|
134 | </Script> |
135 | < ROUTE fromNode='ScrToggleButton' fromField='Tau' toNode='Trace_ROUTE_ScrToggleButton.Tau_TO_Damp.tau' toField='traceValue'/> |
136 | <!-- ======= ROUTE Trace block complete ===================================================== --> |
137 | </Group> |
138 | </ProtoBody> |
139 | </ProtoDeclare> |
140 | <Transform translation='-5.7 4.0 0.0'> |
141 |
<!-- ROUTE information for BtnDamper node:
[from isOn to ScrBtnMgr.BtnDamperIsOn
]
-->
<ProtoInstance name='ToggleButton' DEF='BtnDamper'> |
142 | <fieldValue name='HottColor' value='0.8 0.03 0.36'/> |
143 | <fieldValue name='initiallyOn' value='true'/> |
144 | <fieldValue name='ColdColor' value='0.2 0.0080 0.09'/> |
145 | </ProtoInstance> |
146 | </Transform> |
147 | <Transform translation='-8.0 3.9 0.0'> |
148 | <Shape> |
149 | |
150 | <Material diffuseColor='0.0 0.0 0.0' emissiveColor='0.8 0.8 0.8'/> |
151 | </Appearance> |
152 | <Text string='"Damper"'> |
153 | |
154 | </Text> |
155 | </Shape> |
156 | </Transform> |
157 | <Transform translation='-5.7 2.8 0.0'> |
158 |
<!-- ROUTE information for BtnChaser node:
[from isOn to ScrBtnMgr.BtnChaserIsOn
]
-->
<ProtoInstance name='ToggleButton' DEF='BtnChaser'> |
159 | <fieldValue name='HottColor' value='0.36 0.8 0.03'/> |
160 | <fieldValue name='initiallyOn' value='true'/> |
161 | <fieldValue name='ColdColor' value='0.09 0.2 0.0080'/> |
162 | </ProtoInstance> |
163 | </Transform> |
164 | <Transform translation='-8.0 2.7 0.0'> |
165 | <Shape> |
166 | <Appearance USE='AppLabels'/> |
167 | <Text string='"Chaser"'> |
168 | <FontStyle USE='FntLabels'/> |
169 | </Text> |
170 | </Shape> |
171 | </Transform> |
172 |
<!-- ROUTE information for ScrBtnMgr node:
[from BtnDamper.isOn to BtnDamperIsOn
]
[from BtnChaser.isOn to BtnChaserIsOn
]
[from WcDamper to SwObjectDampered.whichChoice
]
[from WcChaser to SwObjectFollowed.whichChoice
]
[from WcDamper to SwDamperTrail.whichChoice
]
[from WcChaser to SwChaserTrail.whichChoice
]
-->
<Script DEF='ScrBtnMgr'> |
173 | <field name='BtnChaserIsOn' type='SFBool' accessType='inputOnly'/> |
174 | <field name='WcDamper' type='SFInt32' accessType='outputOnly'/> |
175 | <field name='WcChaser' type='SFInt32' accessType='outputOnly'/> |
176 | <field name='BtnDamperIsOn' type='SFBool' accessType='inputOnly'/> |
<![CDATA[
ecmascript: function BtnDamperIsOn(on) { WcDamper= on? 0:-1; } function BtnChaserIsOn(on) { WcChaser= on? 0:-1; }
]]>
|
|
178 | </Script> |
179 | < ROUTE fromNode='BtnDamper' fromField='isOn' toNode='ScrBtnMgr' toField='BtnDamperIsOn'/> |
180 | < ROUTE fromNode='BtnChaser' fromField='isOn' toNode='ScrBtnMgr' toField='BtnChaserIsOn'/> |
181 | < ROUTE fromNode='ScrBtnMgr' fromField='WcDamper' toNode='SwObjectDampered' toField='whichChoice'/> |
182 | < ROUTE fromNode='ScrBtnMgr' fromField='WcChaser' toNode='SwObjectFollowed' toField='whichChoice'/> |
183 |
<!-- ROUTE information for SwDamperTrail node:
[from ScrBtnMgr.WcDamper to whichChoice
]
-->
<Switch DEF='SwDamperTrail' whichChoice='0'> |
184 |
<!-- Group
GrDamperTrail is a DEF node that has 1 USE node: USE_1 --> <Group DEF='GrDamperTrail'/> |
185 | </Switch> |
186 |
<!-- ROUTE information for SwChaserTrail node:
[from ScrBtnMgr.WcChaser to whichChoice
]
-->
<Switch DEF='SwChaserTrail' whichChoice='0'> |
187 |
<!-- Group
GrChaserTrail is a DEF node that has 1 USE node: USE_1 --> <Group DEF='GrChaserTrail'/> |
188 | </Switch> |
189 |
<!-- ROUTE information for TmrTrail node:
[from cycleTime to ScrTrailer.Tick
]
-->
<TimeSensor DEF='TmrTrail' cycleInterval='0.020000000000000004' loop='true'/> |
190 |
<!-- ROUTE information for ScrTrailer node:
[from TmrTrail.cycleTime to Tick
]
[from TrObjectDampered.translation to DamperPos
]
[from TrObjectFollowed.translation to ChaserPos
]
-->
<Script DEF='ScrTrailer' directOutput='true'> |
191 | <field name='cShapeDamperTrailPoint' type='SFNode' accessType='initializeOnly'> |
192 | <Shape> |
193 | <Appearance USE='AppObjectDampered'/> |
194 | |
195 | </Shape> |
196 | </field> |
197 | <field name='lastDamperPos' type='SFVec3f' value='0.0 0.0 0.0' accessType='initializeOnly'/> |
198 | <field name='ChaserTrails' type='MFNode' accessType='initializeOnly'> |
199 | <!-- no initialization nodes since this is a local field to hold content --> |
200 | </field> |
201 | <field name='cShapeChaserTrailPoint' type='SFNode' accessType='initializeOnly'> |
202 | <Shape> |
203 | <Appearance USE='AppObjectFollowed'/> |
204 | <Sphere USE='GeomTrail'/> |
205 | </Shape> |
206 | </field> |
207 | <field name='DamperTrails' type='MFNode' accessType='initializeOnly'> |
208 | <!-- no initialization nodes since this is a local field to hold content --> |
209 | </field> |
210 | <field name='GrChaserTrail' type='SFNode' accessType='initializeOnly'> |
211 | <Group USE='GrChaserTrail'/> |
212 | </field> |
213 | <field name='ChaserPos' type='SFVec3f' accessType='inputOnly'/> |
214 | <field name='cNumTrailPoints' type='SFInt32' value='35' accessType='initializeOnly'/> |
215 | <field name='lastChaserPos' type='SFVec3f' value='0.0 0.0 0.0' accessType='initializeOnly'/> |
216 | <field name='Tick' type='SFTime' accessType='inputOnly'/> |
217 | <field name='DamperPos' type='SFVec3f' accessType='inputOnly'/> |
218 | <field name='GrDamperTrail' type='SFNode' accessType='initializeOnly'> |
219 | <Group USE='GrDamperTrail'/> |
220 | </field> |
<![CDATA[
ecmascript: function initialize() { DamperTrails.length= ChaserTrails.length= cNumTrailPoints; for(var C= 0; C<cNumTrailPoints; C++ ) { DamperTrails[C]= new SFNode('Transform{}'); ChaserTrails[C]= new SFNode('Transform{}'); DamperTrails[C].children[0]= cShapeDamperTrailPoint; ChaserTrails[C].children[0]= cShapeChaserTrailPoint; } GrDamperTrail.children= DamperTrails; GrChaserTrail.children= ChaserTrails; } function DamperPos(Pos) { lastDamperPos= Pos; } function ChaserPos(Pos) { lastChaserPos= Pos; } function Tick() { for(var C= cNumTrailPoints - 1; C>0; C-- ) { DamperTrails[C].translation= DamperTrails[ C - 1].translation; ChaserTrails[C].translation= ChaserTrails[C - 1].translation; } DamperTrails[0].translation= lastDamperPos; ChaserTrails[0].translation= lastChaserPos; }
]]>
|
|
222 | </Script> |
223 | < ROUTE fromNode='TmrTrail' fromField='cycleTime' toNode='ScrTrailer' toField='Tick'/> |
224 | < ROUTE fromNode='TrObjectDampered' fromField='translation' toNode='ScrTrailer' toField='DamperPos'/> |
225 | < ROUTE fromNode='TrObjectFollowed' fromField='translation' toNode='ScrTrailer' toField='ChaserPos'/> |
226 | < ROUTE fromNode='ScrBtnMgr' fromField='WcDamper' toNode='SwDamperTrail' toField='whichChoice'/> |
227 | < ROUTE fromNode='ScrBtnMgr' fromField='WcChaser' toNode='SwChaserTrail' toField='whichChoice'/> |
228 | </Scene> |
229 | </X3D> |
Event Graph ROUTE Table entries with 20 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.
Touch
TouchSensor |
description='touch to activate' User-interaction hint for this node.(TouchSensor description is providing a tooltip) |
TmrTrail
TimeSensor cycleTime SFTime |
ScrTrailer
Script Tick SFTime |
ScrToggleButton
Script Tau SFTime |
ColorDamperNode
ColorDamper tau SFTime |
|
ScrToggleButton
Script Color SFColor |
ColorDamperNode
ColorDamper set_destination SFColor |
|
ScrToggleButton
Script Tau SFTime |
Trace_ROUTE_ScrToggleButton.Tau_TO_Damp.tau
Script traceValue SFTime |
ScrTrailer
Script |
No ROUTE connection found for output events from this node. Contains SFNode fields with direct access to another node. Contains MFNode fields with direct access to another node. |
BtnChaser
ProtoInstance isOn SFBool |
ScrBtnMgr
Script BtnChaserIsOn SFBool |
then
|
ScrBtnMgr
Script WcChaser SFInt32 |
SwObjectFollowed
Switch whichChoice SFInt32 |
||
then
|
ScrBtnMgr
Script WcChaser SFInt32 |
SwChaserTrail
Switch whichChoice SFInt32 |
||||
then
|
ScrBtnMgr
Script WcDamper SFInt32 |
SwObjectDampered
Switch whichChoice SFInt32 |
||||
then
|
ScrBtnMgr
Script WcDamper SFInt32 |
SwDamperTrail
Switch whichChoice SFInt32 |
BtnDamper
ProtoInstance isOn SFBool |
ScrBtnMgr
Script BtnDamperIsOn SFBool |
then
|
ScrBtnMgr
Script WcChaser SFInt32 |
SwObjectFollowed
Switch whichChoice SFInt32 |
||
then
|
ScrBtnMgr
Script WcChaser SFInt32 |
SwChaserTrail
Switch whichChoice SFInt32 |
||||
then
|
ScrBtnMgr
Script WcDamper SFInt32 |
SwObjectDampered
Switch whichChoice SFInt32 |
||||
then
|
ScrBtnMgr
Script WcDamper SFInt32 |
SwDamperTrail
Switch whichChoice SFInt32 |
<!--
Color 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. -->