X3D Model Documentation: HAnimPosePrototype.x3d

  1  <?xml version="1.0" encoding="UTF-8"?>
  2  <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 4.0//EN" "https://www.web3d.org/specifications/x3d-4.0.dtd">
  3  <X3D profile='Full' version='4.0 xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='https://www.web3d.org/specifications/x3d-4.0.xsd'>
  4       <head>
  5            <meta name='titlecontent=' HAnimPosePrototype.x3d '/>
  6            <meta name='descriptioncontent='Define an experimental new node to simply capture a single pose for an HAnimHumanoid model. Expected usage is to allow HAnimHumanoid to contain multiple Pose nodes which can be activated and composed.'/>
  7            <meta name='infocontent='This model also takes advantage of Inline/IMPORT capabilities (equivalent to USE node) and thus avoids fully copying a large, complex HAnimHumanoid model.'/>
  8            <meta name='createdcontent='2 October 2025'/>
  9            <meta name='modifiedcontent='20 October 2025'/>
 10            <meta name='creatorcontent='Don Brutzman'/>
 11            <meta name='creatorcontent='Joe Williams'/>
 12            <meta name='contributorcontent='Holger Seelig for X_ITE, Sunrize on Windows, scripting guidance, and Inline IMPORT functionality as node-reference equivalent to USE'/>
 13            <meta name='referencecontent=' HAnimPosePrototype.console.txt '/>
 14            <meta name='Imagecontent='HAnimPoseExampleTouchDown.png'/>
 15            <meta name='Imagecontent='HAnimPoseExampleTouchDownFaceLeftAPose.png'/>
 16            <meta name='referencecontent='Direct scene manipulations with Javascript, https://doc.instantreality.org/tutorial/direct-scene-manipulations-with-javascript'/>
 17            <meta name='specificationSectioncontent='HAnim Architecture volume 1 version 2.1 draft, clause 4 Concepts, section 4.8.2 Modelling of human-like HAnim figures'/>
 18            <meta name='specificationUrlcontent='https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19774/ISO-IEC19774-1/ISO-IEC19774-1v2.1/ISO-IEC19774-1v2.1-WD/Architecture/concepts.html#ModellingHumanLikeHAnimFigures'/>
 19            <meta name='specificationSectioncontent='HAnim Architecture volume 1 version 2.1 draft, clause 4 Concepts, section 4.8.3 Poses'/>
 20            <meta name='specificationUrlcontent='https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19774/ISO-IEC19774-1/ISO-IEC19774-1v2.1/ISO-IEC19774-1v2.1-WD/Architecture/concepts.html#Poses'/>
 21            <meta name='specificationSectioncontent='HAnim Architecture volume 1 version 2.1 draft, clause 6 Object interfaces, section 6.43 Pose'/>
 22            <meta name='specificationUrlcontent='https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19774/ISO-IEC19774-1/ISO-IEC19774-1v2.1/ISO-IEC19774-1v2.1-WD/Architecture/ObjectInterfaces.html#Pose'/>
 23            <meta name='referencecontent=' earlier version of this prototype: HAnimPosePreliminary.x3d '/>
 24            <meta name='generatorcontent='X3D-Edit 4.0, https://www.web3d.org/x3d/tools/X3D-Edit'/>
 25            <meta name='generatorcontent='Sunrize X3D Editor V1.11.1, https://create3000.github.io/sunrize'/>
 26            <meta name='identifiercontent=' https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Poses/HAnimPosePrototype.x3d '/>
 27            <meta name='licensecontent=' https://www.web3d.org/x3d/content/examples/license.html '/>
 28       </head>
<!--

<!--
Event Graph ROUTE Table shows event connections.
-->
<!-- to top DEF nodes index: A_Pose, A_PoseInterface, A_PoseTouchSensor, AnimatePosesClock, AnimatePosesInterface, AnimatePosesInterpolator, AnimatePosesTouchSensor, ClockTimeSensor, ComposeTextAppearance, FaceLeft_humanoid_root, FaceLeftPose, FaceLeftPoseInterface, FaceLeftTouchSensor, FaceRight_humanoid_root, FaceRightPose, FaceRightPoseInterface, FaceRightTouchSensor, H_Pose, HAnimPoseScript, I_Pose, I_PoseInterface, I_PoseTouchSensor, InterfaceButtonsGroup, JinLOA1Inline, ModelInfo, PoseInterpolatorGroup, PoseJoint_l_shoulder, PoseJoint_l_shoulder_1, PoseJoint_r_shoulder, PoseJoint_r_shoulder_1, ResetInterpolatorGroup, ResetPoseInterface, ResetPoseTouchSensor, ResetTextAppearance, ResetTimeSensor, SharedFont, T_Pose, T_PoseInterface, T_PoseTouchSensor, TouchDown_Pose, TouchDown_PoseInterface, TouchDown_PoseTouchSensor, TransparentAppearance

Index for IMPORT statement: IMPORT_JinLOA1

Index for Viewpoint node: Viewpoint_1

Index for ProtoDeclare definition: HAnimPose
-->
 29       <Scene>
 30            <WorldInfo DEF='ModelInfoinfo='"Design to illustrate a potential HAnimPose node"title='HAnimPosePrototype.x3d'/>
 31            <Background skyColor='0.8 0.8 1'/>
 32            <Group>
 33                 <!-- Multiple HAnimHumanoid Inline/IMPORT models are available to support testing, JinLOA 1 2 3 4 -->
 34 
               <!-- This Inline node has a corresponding IMPORT_JinLOA1 statement that can expose an EXPORT node in the loaded model. -->
               <Inline DEF='JinLOA1Inlinedescription='JinLOA1 HAnimHumanoid for IMPORT'   url=' "../Characters/JinLOA1.x3d" "https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Characters/JinLOA1.x3d" '/>
 35 
               <!-- This IMPORT statement provides a node reference that is retrieved via USE with matching AS name for multiple nodes: HAnimHumanoid USE='JinLOA1Imported', USE='JinLOA1Imported', USE='JinLOA1Imported', USE='JinLOA1Imported', USE='JinLOA1Imported', and USE='JinLOA1Imported' -->
               <IMPORT inlineDEF='JinLOA1InlineimportedDEF='JinLOA1AS='JinLOA1Imported'/>
 36            </Group>
 37            <ProtoDeclare name='HAnimPoseappinfo='Experimental node to assign joint values to a humanoid and assume a pose. Assumes that baseline HAnimHumanoid configuration must be I pose, which can be achieved by resetting every HAnimJoint to default values.'>
 38                 <ProtoInterface>
 39                      <field name='nametype='SFStringvalue='poseNameaccessType='inputOutputappinfo='name of this pose'/>
 40                      <field name='parentHAnimHumanoidtype='SFNodeaccessType='initializeOnlyappinfo='Humanoid for this Pose to act upon'/>
 41                      <field name='loatype='SFInt32value='-1accessType='initializeOnlyappinfo='default is no loa'/>
 42                      <field name='descriptiontype='SFStringaccessType='inputOutputappinfo='explanation of purpose'/>
 43                      <field name='enabledtype='SFBoolvalue='trueaccessType='inputOutputappinfo='default value true'/>
 44                      <field name='resetAllJointstype='SFBoolaccessType='inputOnlyappinfo='reset the skeleton to I pose with all joints zeroed'/>
 45                      <field name='resetOtherJointstype='SFBoolvalue='falseaccessType='inputOutputappinfo='resetOtherJoints false (ignoring other joints) only adjusts pose joints and allows pose composition, otherwise all other joints are zeroed'/>
 46                      <field name='poseJointstype='MFNodeaccessType='inputOutputappinfo='joint values to apply to HAnimHumanoid'/>
 47                      <field name='transitionDurationtype='SFTimevalue='0accessType='inputOutputappinfo='how many seconds to achieve the pose'/>
 48                      <field name='isActivetype='SFBoolaccessType='outputOnlyappinfo='event indicating when pose transition is active'/>
 49                      <field name='commencePosetype='SFBoolaccessType='inputOnlyappinfo='this event tells the HAnimPose node to fully transition, equivalent to set_fraction=1'/>
 50                      <field name='set_startTimetype='SFTimeaccessType='inputOnlyappinfo='starts the animation clock'/>
 51                      <field name='set_fractiontype='SFFloataccessType='inputOnlyappinfo='allows transition to proceed incrementally from fraction [0..10'/>
 52                      <field name='traceEnabledtype='SFBoolvalue='trueaccessType='inputOutputappinfo='debug trace to Browser output console'/>
 53                 </ProtoInterface>
 54                 <ProtoBody>
 55                      <TimeSensor DEF='ClockTimeSensordescription='control timing of pose animation when triggered'>
 56                           <IS>
 57                                <connect nodeField='enabledprotoField='enabled'/>
 58                                <connect nodeField='cycleIntervalprotoField='transitionDuration'/>
 59                                <connect nodeField='isActiveprotoField='isActive'/>
 60                                <connect nodeField='startTimeprotoField='set_startTime'/>
 61                           </IS>
 62                      </TimeSensor>
 63                      <TimeSensor DEF='ResetTimeSensordescription='control timing of skeleton reset to A pose when triggered'>
 64                           <IS>
 65                                <connect nodeField='enabledprotoField='enabled'/>
 66                                <connect nodeField='cycleIntervalprotoField='transitionDuration'/>
 67                                <!-- no need to report isActive since that would be duplicative -->
 68                                <connect nodeField='startTimeprotoField='set_startTime'/>
 69                           </IS>
 70                      </TimeSensor>
 71                      <Group DEF='PoseInterpolatorGroup'>
 72                           <!-- interpolators generated by prototype script appear here at runtime -->
 73                      </Group>
 74                      <Group DEF='ResetInterpolatorGroup'>
 75                           <!-- interpolators generated by prototype script appear here at runtime -->
 76                      </Group>
 77                      <Script DEF='HAnimPoseScriptdirectOutput='true'   url=' "HAnimPosePrototypeScript.js" "https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Poses/HAnimPosePrototypeScript.js" '>
 78                           <field name='parentHAnimHumanoidtype='SFNodeaccessType='inputOutputappinfo='Humanoid for this Pose to act upon'>
 79                                <!-- initialization node (if any) goes here -->
 80                           </field>
 81                           <field name='nametype='SFStringaccessType='inputOutputappinfo='name of this pose'/>
 82                           <field name='loatype='SFInt32accessType='initializeOnlyappinfo='default is no loa'/>
 83                           <field name='descriptiontype='SFStringaccessType='inputOutputappinfo='explanation of purpose'/>
 84                           <field name='enabledtype='SFBoolaccessType='inputOutputappinfo='default value true'/>
 85                           <field name='resetAllJointstype='SFBoolaccessType='inputOnlyappinfo='reset the skeleton to I pose with all joints zeroed'/>
 86                           <field name='set_resetOtherJointstype='SFBoolaccessType='inputOutputappinfo='set_resetOtherJoints false (ignoring other joints) only adjusts pose joints and allows pose composition, otherwise all other joints are zeroed'/>
 87                           <field name='poseJointstype='MFNodeaccessType='inputOutputappinfo='joint values to apply to HAnimHumanoid'>
 88                                <!-- initialization nodes (if any) go here -->
 89                           </field>
 90                           <field name='transitionDurationtype='SFTimeaccessType='inputOutputappinfo='how many seconds to achieve the pose'/>
 91                           <field name='commencePosetype='SFBoolaccessType='inputOnlyappinfo='this event tells the HAnimPose node to fully transition, equivalent to set_fraction=1'/>
 92                           <field name='set_fractiontype='SFFloataccessType='inputOnlyappinfo='allows transition to proceed incrementally from fraction [0..10'/>
 93                           <field name='set_startTimetype='SFTimeaccessType='inputOnlyappinfo='starts the animation clock'/>
 94                           <field name='traceEnabledtype='SFBoolaccessType='inputOutputappinfo='debug trace to Browser output console'/>
 95                           <field name='numberPoseJointstype='SFInt32value='0accessType='initializeOnlyappinfo='number of joints found in poseJoints field'/>
 96                           <field name='numberSkeletonJointstype='SFInt32value='0accessType='initializeOnlyappinfo='number of joints found in Humanoid'/>
 97                           <field name='jointOrientationInterpolatorstype='MFNodeaccessType='initializeOnlyappinfo='OrientationInterpolator node array matching number of poseJoints'>
 98                                <!-- initialization nodes (if any) go here -->
 99                           </field>
100                           <IS>
101                                <connect nodeField='parentHAnimHumanoidprotoField='parentHAnimHumanoid'/>
102                                <connect nodeField='nameprotoField='name'/>
103                                <connect nodeField='loaprotoField='loa'/>
104                                <connect nodeField='descriptionprotoField='description'/>
105                                <connect nodeField='enabledprotoField='enabled'/>
106                                <connect nodeField='resetAllJointsprotoField='resetAllJoints'/>
107                                <connect nodeField='set_resetOtherJointsprotoField='resetOtherJoints'/>
108                                <connect nodeField='poseJointsprotoField='poseJoints'/>
109                                <connect nodeField='transitionDurationprotoField='transitionDuration'/>
110                                <connect nodeField='commencePoseprotoField='commencePose'/>
111                                <connect nodeField='set_fractionprotoField='set_fraction'/>
112                                <connect nodeField='set_startTimeprotoField='set_startTime'/>
113                                <connect nodeField='traceEnabledprotoField='traceEnabled'/>
114                           </IS>
115                      </Script>
116                 </ProtoBody>
117            </ProtoDeclare>
118            <NavigationInfo/>
119            <Viewpoint description='HAnimPose for JinLOA1position='0 1 4'/>
120            <!-- no longer required: including full model <HAnimHumanoid DEF='hanim_JinLOA1' loa='2' name='JinLOA1' scale='0.0225 0.0225 0.0225'> etc... -->
121 
          <!-- ROUTE information for T_Pose node:  [from T_PoseTouchSensor.isActive to commencePose ] -->
          <ProtoInstance name='HAnimPoseDEF='T_Pose'>
122                 <fieldValue name='namevalue='T'/>
123                 <fieldValue name='parentHAnimHumanoid'>
124                      <!-- JinLOA1Imported for Inline/IMPORT or hanim_JinLOA1 if copy of HAnimHumanoid is embedded in this model -->
125                      <!-- debug test case: <HAnimJoint DEF="ErrorDiagnosticsTest" USE='JinLOA1Imported'/> -->
126                      <HAnimHumanoid USE='JinLOA1Imported'/>
127                 </fieldValue>
128                 <fieldValue name='loavalue='1'/>
129                 <fieldValue name='descriptionvalue='arms stretched outward and level similar to letter T'/>
130                 <fieldValue name='poseJoints'>
131                      <!-- test case works without problrem: HAnimSegment DEF='TestCase' description='confirm type checking' name='specialTestCase'/ -->
132                      <HAnimJoint DEF='PoseJoint_l_shoulder_1description='left shouldername='l_shoulderrotation='0 0 1 1.57'/>
133                      <HAnimJoint DEF='PoseJoint_r_shoulder_1description='right shouldername='r_shoulderrotation='0 0 -1 1.57'/>
134                 </fieldValue>
135                 <fieldValue name='transitionDurationvalue='1.3'/>
136            </ProtoInstance>
137 
          <!-- ROUTE information for A_Pose node:  [from A_PoseTouchSensor.isActive to commencePose ] -->
          <ProtoInstance name='HAnimPoseDEF='A_Pose'>
138                 <fieldValue name='namevalue='A'/>
139                 <fieldValue name='parentHAnimHumanoid'>
140                      <!-- JinLOA1Imported for Inline/IMPORT or hanim_JinLOA1 if copy of HAnimHumanoid is embedded in this model -->
141                      <HAnimHumanoid USE='JinLOA1Imported'/>
142                 </fieldValue>
143                 <fieldValue name='loavalue='1'/>
144                 <fieldValue name='descriptionvalue='arms stretched outward and downward similar to letter A'/>
145                 <fieldValue name='poseJoints'>
146                      <HAnimJoint DEF='PoseJoint_l_shoulderdescription='left shouldername='l_shoulderrotation='0 0 1 0.5'/>
147                      <HAnimJoint DEF='PoseJoint_r_shoulderdescription='right shouldername='r_shoulderrotation='0 0 -1 0.5'/>
148                 </fieldValue>
149                 <fieldValue name='transitionDurationvalue='1.2'/>
150                 <fieldValue name='traceEnabledvalue='false'/>
151            </ProtoInstance>
152 
          <!-- ROUTE information for TouchDown_Pose node:  [from TouchDown_PoseTouchSensor.isActive to commencePose ] -->
          <ProtoInstance name='HAnimPoseDEF='TouchDown_Pose'>
153                 <!-- thanks Joe -->
154                 <fieldValue name='namevalue='TouchDown'/>
155                 <fieldValue name='parentHAnimHumanoid'>
156                      <!-- JinLOA1Imported for Inline/IMPORT or hanim_JinLOA1 if copy of HAnimHumanoid is embedded in this model -->
157                      <HAnimHumanoid USE='JinLOA1Imported'/>
158                 </fieldValue>
159                 <fieldValue name='loavalue='1'/>
160                 <fieldValue name='descriptionvalue='arms stretched outward providing a TouchDown gesture'/>
161                 <fieldValue name='poseJoints'>
162                      <HAnimJoint name='humanoid_rootrotation='0 1 0 -0.698132'/>
163                      <HAnimJoint name='l_hiprotation='-1 1 1 1'/>
164                      <HAnimJoint name='l_kneerotation='1 0 0 1'/>
165                      <HAnimJoint name='l_talocruralrotation='-0.2 -0 0.1 0.225'/>
166                      <HAnimJoint name='r_hiprotation='-1 -1 -1 1'/>
167                      <HAnimJoint name='r_kneerotation='1 0 0 1'/>
168                      <HAnimJoint name='r_talocruralrotation='-0.2 0 0.1 0.25'/>
169                      <HAnimJoint name='vl5rotation='0 0 0.01 0.2'/>
170                      <HAnimJoint name='vt10rotation='0 0 0.01 0.1'/>
171                      <HAnimJoint name='vc4rotation='0 0 -0.01 0.15'/>
172                      <HAnimJoint name='l_shoulderrotation='-1 0.5 1 2'/>
173                      <HAnimJoint name='l_elbowrotation='-1 0 0 1'/>
174                      <HAnimJoint name='l_radiocarpal'/>
175                      <HAnimJoint name='r_shoulderrotation='-1 -0.5 -1 2.6'/>
176                      <HAnimJoint name='r_elbowrotation='-1 0 0 1'/>
177                      <HAnimJoint name='r_radiocarpal'/>
178                 </fieldValue>
179                 <fieldValue name='transitionDurationvalue='1.2'/>
180                 <fieldValue name='traceEnabledvalue='false'/>
181            </ProtoInstance>
182 
          <!-- ROUTE information for I_Pose node:  [from I_PoseTouchSensor.isActive to commencePose ] [from AnimatePosesInterpolator.value_changed to set_fraction ] -->
          <ProtoInstance name='HAnimPoseDEF='I_Pose'>
183                 <fieldValue name='namevalue='I'/>
184                 <fieldValue name='parentHAnimHumanoid'>
185                      <!-- JinLOA1Imported for Inline/IMPORT or hanim_JinLOA1 if copy of HAnimHumanoid is embedded in this model -->
186                      <HAnimHumanoid USE='JinLOA1Imported'/>
187                 </fieldValue>
188                 <fieldValue name='loavalue='1'/>
189                 <fieldValue name='descriptionvalue='default binding pose for baseline Humanoid'/>
190                 <fieldValue name='poseJoints'>
191                      <!-- not defining any poseJoints equals the default I pose -->
192                 </fieldValue>
193                 <fieldValue name='transitionDurationvalue='1.5'/>
194                 <fieldValue name='traceEnabledvalue='false'/>
195            </ProtoInstance>
196            <ProtoInstance name='HAnimPoseDEF='H_Pose'>
197                 <fieldValue name='namevalue='H'/>
198                 <fieldValue name='loavalue='1'/>
199                 <fieldValue name='descriptionvalue='TODO experimental pose not yet implemented'/>
200                 <fieldValue name='enabledvalue='false'/>
201                 <fieldValue name='transitionDurationvalue='1.4'/>
202                 <fieldValue name='traceEnabledvalue='false'/>
203            </ProtoInstance>
204 
          <!-- ROUTE information for FaceLeftPose node:  [from FaceLeftTouchSensor.isActive to commencePose ] [from ResetPoseTouchSensor.isActive to resetAllJoints ] -->
          <ProtoInstance name='HAnimPoseDEF='FaceLeftPose'>
205                 <fieldValue name='namevalue='FaceLeft'/>
206                 <fieldValue name='parentHAnimHumanoid'>
207                      <!-- JinLOA1Imported for Inline/IMPORT or hanim_JinLOA1 if copy of HAnimHumanoid is embedded in this model -->
208                      <HAnimHumanoid USE='JinLOA1Imported'/>
209                 </fieldValue>
210                 <fieldValue name='loavalue='0'/>
211                 <fieldValue name='descriptionvalue='Only modify humanoid_root Joint node to face left'/>
212                 <fieldValue name='poseJoints'>
213                      <HAnimJoint DEF='FaceLeft_humanoid_rootdescription='Only rotate the modelname='humanoid_rootrotation='0 1 0 1.570796'/>
214                 </fieldValue>
215                 <fieldValue name='transitionDurationvalue='1.1'/>
216                 <fieldValue name='traceEnabledvalue='false'/>
217            </ProtoInstance>
218 
          <!-- ROUTE information for FaceRightPose node:  [from FaceRightTouchSensor.isActive to commencePose ] -->
          <ProtoInstance name='HAnimPoseDEF='FaceRightPose'>
219                 <fieldValue name='namevalue='FaceRight'/>
220                 <fieldValue name='parentHAnimHumanoid'>
221                      <!-- JinLOA1Imported for Inline/IMPORT or hanim_JinLOA1 if copy of HAnimHumanoid is embedded in this model -->
222                      <HAnimHumanoid USE='JinLOA1Imported'/>
223                 </fieldValue>
224                 <fieldValue name='loavalue='0'/>
225                 <fieldValue name='descriptionvalue='Only modify humanoid_root Joint node to face right'/>
226                 <fieldValue name='poseJoints'>
227                      <HAnimJoint DEF='FaceRight_humanoid_rootdescription='Only rotate the modelname='humanoid_rootrotation='0 1 0 -1.570796'/>
228                 </fieldValue>
229                 <fieldValue name='transitionDurationvalue='1.1'/>
230                 <fieldValue name='traceEnabledvalue='false'/>
231            </ProtoInstance>
232            <Group DEF='InterfaceButtonsGroup'>
233                 <Transform DEF='T_PoseInterfacetranslation='-1.5 1.5 0'>
234                      <Shape>
235                           <Text string='"\"T\" Pose"'>
236 
                              <!-- FontStyle SharedFont is a DEF node that has 7 USE nodes: USE_1, USE_2, USE_3, USE_4, USE_5, USE_6, USE_7 -->
                              <FontStyle DEF='SharedFontfamily='"SANS"justify='"MIDDLE" "MIDDLE"size='0.1style='BOLD'/>
237                           </Text>
238 
                         <!-- Appearance ComposeTextAppearance is a DEF node that has 4 USE nodes: USE_1, USE_2, USE_3, USE_4 -->
                         <Appearance DEF='ComposeTextAppearance'>
239                                <Material diffuseColor='0.1 0.5 0.3'/>
240                           </Appearance>
241                      </Shape>
242                      <Shape>
243 
                         <!-- Appearance TransparentAppearance is a DEF node that has 7 USE nodes: USE_1, USE_2, USE_3, USE_4, USE_5, USE_6, USE_7 -->
                         <Appearance DEF='TransparentAppearance'>
244                                <Material transparency='0.8'/>
245                           </Appearance>
246                           <Box size='0.45 0.2 0.001'/>
247                      </Shape>
248 
                    <!-- ROUTE information for T_PoseTouchSensor node:  [from isActive to T_Pose.commencePose ] -->
                    <TouchSensor DEF='T_PoseTouchSensordescription='select to move shoulders to T pose, leave other joints unchanged'/>
249                      < ROUTE  fromNode='T_PoseTouchSensor' fromField='isActive' toNode='T_Pose' toField='commencePose'/>
250                 </Transform>
251                 <Transform DEF='A_PoseInterfacetranslation='-1.5 1 0'>
252                      <Shape>
253                           <Text string='"\"A\" Pose"'>
254                                <FontStyle USE='SharedFont'/>
255                           </Text>
256                           <Appearance USE='ComposeTextAppearance'/>
257                      </Shape>
258                      <Shape>
259                           <Appearance USE='TransparentAppearance'/>
260                           <Box size='0.45 0.2 0.001'/>
261                      </Shape>
262 
                    <!-- ROUTE information for A_PoseTouchSensor node:  [from isActive to A_Pose.commencePose ] -->
                    <TouchSensor DEF='A_PoseTouchSensordescription='select to move shoulders to A pose, leave other joints unchanged'/>
263                      < ROUTE  fromNode='A_PoseTouchSensor' fromField='isActive' toNode='A_Pose' toField='commencePose'/>
264                 </Transform>
265                 <Transform DEF='TouchDown_PoseInterfacetranslation='-1.5 0.5 0'>
266                      <Shape>
267                           <Text string='"TouchDown Pose"'>
268                                <FontStyle USE='SharedFont'/>
269                           </Text>
270 
                         <!-- Appearance ResetTextAppearance is a DEF node that has 2 USE nodes: USE_1, USE_2 -->
                         <Appearance DEF='ResetTextAppearance'>
271                                <Material diffuseColor='0.1 0.2 0.3'/>
272                           </Appearance>
273                      </Shape>
274                      <Shape>
275                           <Appearance USE='TransparentAppearance'/>
276                           <Box size='0.85 0.2 0.001'/>
277                      </Shape>
278 
                    <!-- ROUTE information for TouchDown_PoseTouchSensor node:  [from isActive to TouchDown_Pose.commencePose ] -->
                    <TouchSensor DEF='TouchDown_PoseTouchSensordescription='select to transition all joints to TouchDown pose'/>
279                      < ROUTE  fromNode='TouchDown_PoseTouchSensor' fromField='isActive' toNode='TouchDown_Pose' toField='commencePose'/>
280                 </Transform>
281                 <Transform DEF='I_PoseInterfacetranslation='-1.5 0.0 0'>
282                      <Shape>
283                           <Text string='"\"I\" Pose"'>
284                                <FontStyle USE='SharedFont'/>
285                           </Text>
286                           <Appearance USE='ResetTextAppearance'/>
287                      </Shape>
288                      <Shape>
289                           <Appearance USE='TransparentAppearance'/>
290                           <Box size='0.45 0.2 0.001'/>
291                      </Shape>
292 
                    <!-- ROUTE information for I_PoseTouchSensor node:  [from isActive to I_Pose.commencePose ] -->
                    <TouchSensor DEF='I_PoseTouchSensordescription='select to transition all joints to I pose'/>
293                      < ROUTE  fromNode='I_PoseTouchSensor' fromField='isActive' toNode='I_Pose' toField='commencePose'/>
294                 </Transform>
295                 <Transform DEF='FaceLeftPoseInterfacetranslation='1.5 1.5 0'>
296                      <Shape>
297                           <Text string='"Face Left Pose"'>
298                                <FontStyle USE='SharedFont'/>
299                           </Text>
300                           <Appearance USE='ComposeTextAppearance'/>
301                      </Shape>
302                      <Shape>
303                           <Appearance USE='TransparentAppearance'/>
304                           <Box size='0.9 0.2 0.001'/>
305                      </Shape>
306 
                    <!-- ROUTE information for FaceLeftTouchSensor node:  [from isActive to FaceLeftPose.commencePose ] -->
                    <TouchSensor DEF='FaceLeftTouchSensordescription='select to rotate body and Face Left, leave other joints unchanged'/>
307                      < ROUTE  fromNode='FaceLeftTouchSensor' fromField='isActive' toNode='FaceLeftPose' toField='commencePose'/>
308                 </Transform>
309                 <Transform DEF='FaceRightPoseInterfacetranslation='1.5 1 0'>
310                      <Shape>
311                           <Text string='"Face Right Pose"'>
312                                <FontStyle USE='SharedFont'/>
313                           </Text>
314                           <Appearance USE='ComposeTextAppearance'/>
315                      </Shape>
316                      <Shape>
317                           <Appearance USE='TransparentAppearance'/>
318                           <Box size='0.9 0.2 0.001'/>
319                      </Shape>
320 
                    <!-- ROUTE information for FaceRightTouchSensor node:  [from isActive to FaceRightPose.commencePose ] -->
                    <TouchSensor DEF='FaceRightTouchSensordescription='select to rotate body and Face Right, leave other joints unchanged'/>
321                      < ROUTE  fromNode='FaceRightTouchSensor' fromField='isActive' toNode='FaceRightPose' toField='commencePose'/>
322                 </Transform>
323                 <Transform DEF='AnimatePosesInterfacetranslation='1.5 0.5 0'>
324                      <Shape>
325                           <Text string='"Direct animation" "to, from \"I\" Pose"'>
326                                <FontStyle USE='SharedFont'/>
327                           </Text>
328                           <Appearance USE='ComposeTextAppearance'/>
329                      </Shape>
330                      <Shape>
331                           <Appearance USE='TransparentAppearance'/>
332                           <Box size='0.9 0.25 0.001'/>
333                      </Shape>
334 
                    <!-- ROUTE information for AnimatePosesTouchSensor node:  [from touchTime to AnimatePosesClock.startTime ] -->
                    <TouchSensor DEF='AnimatePosesTouchSensordescription='animate current pose to "I" pose, then back to original pose'/>
335 
                    <!-- ROUTE information for AnimatePosesClock node:  [from AnimatePosesTouchSensor.touchTime to startTime ] [from fraction_changed to AnimatePosesInterpolator.set_fraction ] -->
                    <TimeSensor DEF='AnimatePosesClockcycleInterval='4description='directly animate several poses'/>
336 
                    <!-- ROUTE information for AnimatePosesInterpolator node:  [from AnimatePosesClock.fraction_changed to set_fraction ] [from value_changed to I_Pose.set_fraction ] -->
                    <ScalarInterpolator DEF='AnimatePosesInterpolatorkey='0 0.05 0.45 0.55 0.95 1keyValue='0 0 1 1 0 0'/>
337                      < ROUTE  fromNode='AnimatePosesTouchSensor' fromField='touchTime' toNode='AnimatePosesClock' toField='startTime'/>
338                      < ROUTE  fromNode='AnimatePosesClock' fromField='fraction_changed' toNode='AnimatePosesInterpolator' toField='set_fraction'/>
339                      < ROUTE  fromNode='AnimatePosesInterpolator' fromField='value_changed' toNode='I_Pose' toField='set_fraction'/>
340                 </Transform>
341                 <Transform DEF='ResetPoseInterfacetranslation='1.5 0.0 0'>
342                      <Shape>
343                           <Text string='"Reset All Joints" "to \"I\" Pose"'>
344                                <FontStyle USE='SharedFont'/>
345                           </Text>
346                           <Appearance USE='ResetTextAppearance'/>
347                      </Shape>
348                      <Shape>
349                           <Appearance USE='TransparentAppearance'/>
350                           <Box size='0.9 0.25 0.001'/>
351                      </Shape>
352 
                    <!-- ROUTE information for ResetPoseTouchSensor node:  [from isActive to FaceLeftPose.resetAllJoints ] -->
                    <TouchSensor DEF='ResetPoseTouchSensordescription='select to immediately Rezero All Joints to I Pose'/>
353                      < ROUTE  fromNode='ResetPoseTouchSensor' fromField='isActive' toNode='FaceLeftPose' toField='resetAllJoints'/>
354                 </Transform>
355            </Group>
356       </Scene>
357  </X3D>
<!--

<!--
Event Graph ROUTE Table shows event connections.
-->
<!-- to top DEF nodes index: A_Pose, A_PoseInterface, A_PoseTouchSensor, AnimatePosesClock, AnimatePosesInterface, AnimatePosesInterpolator, AnimatePosesTouchSensor, ClockTimeSensor, ComposeTextAppearance, FaceLeft_humanoid_root, FaceLeftPose, FaceLeftPoseInterface, FaceLeftTouchSensor, FaceRight_humanoid_root, FaceRightPose, FaceRightPoseInterface, FaceRightTouchSensor, H_Pose, HAnimPoseScript, I_Pose, I_PoseInterface, I_PoseTouchSensor, InterfaceButtonsGroup, JinLOA1Inline, ModelInfo, PoseInterpolatorGroup, PoseJoint_l_shoulder, PoseJoint_l_shoulder_1, PoseJoint_r_shoulder, PoseJoint_r_shoulder_1, ResetInterpolatorGroup, ResetPoseInterface, ResetPoseTouchSensor, ResetTextAppearance, ResetTimeSensor, SharedFont, T_Pose, T_PoseInterface, T_PoseTouchSensor, TouchDown_Pose, TouchDown_PoseInterface, TouchDown_PoseTouchSensor, TransparentAppearance

Index for IMPORT statement: IMPORT_JinLOA1

Index for Viewpoint node: Viewpoint_1

Index for ProtoDeclare definition: HAnimPose
-->
X3D Tooltips element index: Appearance, Background, Box, connect, field, fieldValue, FontStyle, Group, HAnimHumanoid, HAnimJoint, head, IMPORT, Inline, IS, Material, meta, NavigationInfo, ProtoBody, ProtoDeclare, ProtoInstance, ProtoInterface, ROUTE, ScalarInterpolator, Scene, Script, Shape, Text, TimeSensor, TouchSensor, Transform, Viewpoint, WorldInfo, X3D, plus documentation for accessType definitions, type definitions, XML data types, and field types

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.

A_PoseTouchSensor
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
A_Pose
ProtoInstance
commencePose
SFBool

AnimatePosesTouchSensor
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
AnimatePosesClock
TimeSensor
startTime
SFTime
then
 
 
 
AnimatePosesClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(2)
AnimatePosesInterpolator
ScalarInterpolator
set_fraction
SFFloat
then
 
 
 
AnimatePosesInterpolator
ScalarInterpolator
value_changed
SFFloat

ROUTE
event to
(3)
I_Pose
ProtoInstance
set_fraction
SFFloat

FaceLeftTouchSensor
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
FaceLeftPose
ProtoInstance
commencePose
SFBool

FaceRightTouchSensor
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
FaceRightPose
ProtoInstance
commencePose
SFBool

I_PoseTouchSensor
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
I_Pose
ProtoInstance
commencePose
SFBool

ResetPoseTouchSensor
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
FaceLeftPose
ProtoInstance
resetAllJoints
SFBool

T_PoseTouchSensor
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
T_Pose
ProtoInstance
commencePose
SFBool

TouchDown_PoseTouchSensor
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
TouchDown_Pose
ProtoInstance
commencePose
SFBool

ClockTimeSensor
TimeSensor
description='control timing of pose animation when triggered' 
No direct ROUTE connection found for events to/from this node.
This node is part of a ProtoDeclare prototype declaration. 

ResetTimeSensor
TimeSensor
description='control timing of skeleton reset to A pose when triggered' 
No direct ROUTE connection found for events to/from this node.
This node is part of a ProtoDeclare prototype declaration. 

A_Pose
ProtoInstance
HAnimPose
No direct ROUTE connection found for events to/from this node.
This ProtoInstance contains SFNode/MFNode fieldValue declarations with
direct access to other nodes, and thus has potential to produce run-time animation. 

FaceLeftPose
ProtoInstance
HAnimPose
No direct ROUTE connection found for events to/from this node.
This ProtoInstance contains SFNode/MFNode fieldValue declarations with
direct access to other nodes, and thus has potential to produce run-time animation. 

FaceRightPose
ProtoInstance
HAnimPose
No direct ROUTE connection found for events to/from this node.
This ProtoInstance contains SFNode/MFNode fieldValue declarations with
direct access to other nodes, and thus has potential to produce run-time animation. 

H_Pose
ProtoInstance
HAnimPose
No direct ROUTE connection found for events to/from this node.
This ProtoInstance contains SFNode/MFNode fieldValue declarations with
direct access to other nodes, and thus has potential to produce run-time animation. 

I_Pose
ProtoInstance
HAnimPose
No direct ROUTE connection found for events to/from this node.
This ProtoInstance contains SFNode/MFNode fieldValue declaration with
direct access to other nodes, and thus has potential to produce run-time animation. 

T_Pose
ProtoInstance
HAnimPose
No direct ROUTE connection found for events to/from this node.
This ProtoInstance contains SFNode/MFNode fieldValue declarations with
direct access to other nodes, and thus has potential to produce run-time animation. 

TouchDown_Pose
ProtoInstance
HAnimPose
No direct ROUTE connection found for events to/from this node.
This ProtoInstance contains SFNode/MFNode fieldValue declarations with
direct access to other nodes, and thus has potential to produce run-time animation. 

JinLOA1Inline
Inline
description='JinLOA1 HAnimHumanoid for IMPORT' 
This node can send or receive ROUTE events via DEF='JinLOA1Inline' or via <IMPORT AS='JinLOA1Imported'/> 

line 35
IMPORT
<IMPORT inlineDEF='JinLOA1Inline' AS='JinLOA1Imported'/>
matches local node <Inline DEF='JinLOA1Inline'/>
which can send or receive events with the Inline X3D model, if this parent X3D model
includes ROUTE statements (or USE references) to exchange events with the child Inline model. 

Additional guidance on X3D animation can be found in the 10-Step Animation Design Process and Event Tracing hint sheets. Have fun with X3D! 😀

-->
<!-- Online at
https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Poses/HAnimPosePrototypeIndex.html -->
<!-- Version control at
https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/content/examples/HumanoidAnimation/Poses/HAnimPosePrototype.x3d -->

<!-- Color-coding legend: X3D terminology <X3dNode DEF='idNamefield='value'/> matches XML terminology <XmlElement DEF='idNameattribute='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> -->

to top <!-- For additional help information about X3D scenes, please see X3D Tooltips, X3D Resources, and X3D Scene Authoring Hints. -->