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='8 November 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='MovingImagecontent=' demonstration video https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Poses/HAnimPosePrototypeDemoVideo.mp4 '/>
 15            <meta name='Imagecontent='HAnimPoseExampleTouchDown.png'/>
 16            <meta name='Imagecontent='HAnimPoseExampleTouchDownFaceLeftAPose.png'/>
 17            <meta name='Imagecontent='images/HAnimPoseExampleJoeKick.png'/>
 18            <meta name='Imagecontent='images/HAnimPoseExampleJoeSkeletonSkinSite.png'/>
 19            <meta name='Imagecontent='images/HAnimPoseExampleKoreanCharacter01Jin.png'/>
 20            <meta name='Imagecontent='images/HAnimPoseExampleKoreanCharacter02Chul.png'/>
 21            <meta name='Imagecontent='images/HAnimPoseExampleKoreanCharacter03Hyun.png'/>
 22            <meta name='Imagecontent='images/HAnimPoseExampleKoreanCharacter04Young.png'/>
 23            <meta name='Imagecontent='images/HAnimPoseExampleKoreanCharacter05Ju.png'/>
 24            <meta name='Imagecontent='images/HAnimPoseExampleKoreanCharacter06Ga.png'/>
 25            <meta name='Imagecontent='images/HAnimPoseExampleKoreanCharacter07No.png'/>
 26            <meta name='Imagecontent='images/HAnimPoseExampleKoreanCharacter08Da.png'/>
 27            <meta name='Imagecontent='images/HAnimPoseExampleKoreanCharacter09Ru.png'/>
 28            <meta name='Imagecontent='images/HAnimPoseExampleKoreanCharacter10Mi.png'/>
 29            <meta name='Imagecontent='images/HAnimPoseExampleKoreanCharacter11Min.png'/>
 30            <meta name='Imagecontent='images/HAnimPoseExampleKoreanCharacter12Sun.png'/>
 31            <meta name='specificationSectioncontent='HAnim Architecture volume 1 version 2.1 draft, clause 6 Object interfaces, section 6.4 Pose'/>
 32            <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'/>
 33            <meta name='specificationSectioncontent='HAnim Architecture volume 1 version 2.1 draft, clause 4 Concepts, section 4.8.2 Modelling of human-like HAnim figures'/>
 34            <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'/>
 35            <meta name='specificationSectioncontent='HAnim Architecture volume 1 version 2.1 draft, clause 4 Concepts, section 4.8.3 Poses'/>
 36            <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'/>
 37            <meta name='referencecontent='Direct scene manipulations with Javascript, https://doc.instantreality.org/tutorial/direct-scene-manipulations-with-javascript'/>
 38            <meta name='referencecontent=' earlier version of this prototype: originals/HAnimPosePreliminary.x3d '/>
 39            <meta name='generatorcontent='X3D-Edit 4.0, https://www.web3d.org/x3d/tools/X3D-Edit'/>
 40            <meta name='generatorcontent='Sunrize X3D Editor V1.11.1, https://create3000.github.io/sunrize'/>
 41            <meta name='identifiercontent=' https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Poses/HAnimPosePrototype.x3d '/>
 42            <meta name='licensecontent=' https://www.web3d.org/x3d/content/examples/license.html '/>
 43       </head>
<!--

<!--
Event Graph ROUTE Table shows event connections.
-->
<!-- to top DEF nodes index: A_Pose, A_PoseInterface, A_PoseTouchSensor, AnimatePosesClock, AnimatePosesInterface, AnimatePosesLoopInterpolator, AnimatePosesTouchSensor, AnimationTextAppearance, ClockTimeSensor, DisplayHeader, FaceLeft_humanoid_root, FaceLeft_Pose, FaceLeftPoseInterface, FaceLeftTouchSensor, FaceRight_humanoid_root, FaceRight_Pose, FaceRightPoseInterface, FaceRightTouchSensor, H_Pose, HandleInlineLoading, HandleInlineLoadsensorRouting, HAnimPoseScript, HeaderFont, HumanoidInline, HumanoidInlineLoadSensor, I_Pose, I_PoseInterface, I_PoseTouchSensor, InterfaceButtonsGroup, ModelInfo, PoseInterpolatorGroup, PoseJoint_l_shoulder, PoseJoint_l_shoulder_1, PoseJoint_r_shoulder, PoseJoint_r_shoulder_1, PoseTextAppearance, ResetDefaultPoseInterface, ResetInterpolatorGroup, ResetPoseTouchSensor, ResetTimeSensor, SharedFont, T_Pose, T_PoseInterface, T_PoseTouchSensor, TouchDown_Pose, TouchDown_PoseInterface, TouchDown_PoseTouchSensor, TransparentAppearance

Index for IMPORT statement: IMPORT_JoeSkeletonSkinSite

Index for Viewpoint node: Viewpoint_1

Index for ProtoDeclare definition: HAnimPose
-->
 44       <Scene>
 45            <WorldInfo DEF='ModelInfoinfo='"Design to illustrate a potential HAnimPose node"title='HAnimPosePrototype.x3d'/>
 46            <Background skyColor='0.8 0.8 1'/>
 47            <NavigationInfo/>
 48            <Group DEF='HandleInlineLoading'>
 49                 <!-- Multiple HAnimHumanoid Inline/IMPORT models are available to support testing: JinLOA1 JinLOA2 JinLOA3 JinLOA4 ../Skin/JoeKick ../Skin/JoeSkeletonSkinSite -->
 50                 <!-- Also tested satisfactorily: KoreanCharacter01Jin KoreanCharacter02Chul KoreanCharacter03Hyun KoreanCharacter04Young KoreanCharacter05Ju KoreanCharacter06Ga KoreanCharacter07No KoreanCharacter08Da KoreanCharacter09Ru KoreanCharacter10Mi KoreanCharacter11Min KoreanCharacter12Sun -->
 51 
               <!-- Inline HumanoidInline is a DEF node that has 1 USE node: USE_1<!-- This Inline node has a corresponding IMPORT_JoeSkeletonSkinSite statement that can expose an EXPORT node in the loaded model. -->
               <Inline DEF='HumanoidInlinedescription='remote HAnimHumanoid for IMPORT'   url=' "../Skin/JoeSkeletonSkinSite.x3d" "https://www.web3d.org/x3d/content/examples/HumanoidAnimation/JoeSkeletonSkinSite.x3d" '/>
 52                 <!-- Note that the following importedDEF must match the EXPORT name found in remote file -->
 53 
               <!-- This IMPORT statement provides a node reference that is retrieved via USE with matching AS name for multiple nodes: HAnimHumanoid USE='HumanoidImported', USE='HumanoidImported', USE='HumanoidImported', USE='HumanoidImported', USE='HumanoidImported', and USE='HumanoidImported' -->
               <IMPORT inlineDEF='HumanoidInlineimportedDEF='JoeSkeletonSkinSiteAS='HumanoidImported'/>
 54 
 55                      <Inline USE='HumanoidInline'/>
 56                 </LoadSensor>
 57            </Group>
 58            <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.'>
 59                 <ProtoInterface>
 60                      <field name='nametype='SFStringvalue='poseNameaccessType='inputOutputappinfo='name of this pose'/>
 61                      <field name='parentHAnimHumanoidtype='SFNodeaccessType='initializeOnlyappinfo='Humanoid for this Pose to act upon'>
 62                           <!-- initialization node (if any) goes here -->
 63                      </field>
 64                      <field name='loatype='SFInt32value='-1accessType='initializeOnlyappinfo='default is no loa'/>
 65                      <field name='descriptiontype='SFStringaccessType='inputOutputappinfo='explanation of purpose'/>
 66                      <field name='enabledtype='SFBoolvalue='trueaccessType='inputOutputappinfo='default value true'/>
 67                      <field name='resetAllJointstype='SFBoolaccessType='inputOnlyappinfo='reset the skeleton to I pose with all joints zeroed'/>
 68                      <field name='poseJointstype='MFNodeaccessType='inputOutputappinfo='joint values to apply to HAnimHumanoid'>
 69                           <!-- initialization nodes (if any) go here -->
 70                      </field>
 71                      <field name='transitionDurationtype='SFTimevalue='0accessType='inputOutputappinfo='how many seconds to achieve the pose'/>
 72                      <field name='isActivetype='SFBoolaccessType='outputOnlyappinfo='event indicating when pose transition is active'/>
 73                      <field name='commencePosetype='SFBoolaccessType='inputOnlyappinfo='this event tells the HAnimPose node to fully transition, equivalent to set_fraction=1'/>
 74                      <field name='set_startTimetype='SFTimeaccessType='inputOnlyappinfo='starts the animation clock'/>
 75                      <field name='set_fractiontype='SFFloataccessType='inputOnlyappinfo='allows transition to proceed incrementally from fraction [0..10'/>
 76                      <field name='isLoadedtype='SFBoolaccessType='inputOnlyappinfo='possible notification from LoadSensor if using HAnimHumanoid Inline/IMPORT AS/USE'/>
 77                      <field name='traceEnabledtype='SFBoolvalue='trueaccessType='inputOutputappinfo='debug trace to Browser output console'/>
 78                 </ProtoInterface>
 79                 <ProtoBody>
 80                      <TimeSensor DEF='ClockTimeSensordescription='control timing of pose animation when triggered'>
 81                           <IS>
 82                                <connect nodeField='enabledprotoField='enabled'/>
 83                                <connect nodeField='cycleIntervalprotoField='transitionDuration'/>
 84                                <connect nodeField='isActiveprotoField='isActive'/>
 85                                <connect nodeField='startTimeprotoField='set_startTime'/>
 86                           </IS>
 87                      </TimeSensor>
 88                      <TimeSensor DEF='ResetTimeSensordescription='control timing of skeleton reset to "A" pose when triggered'>
 89                           <IS>
 90                                <connect nodeField='enabledprotoField='enabled'/>
 91                                <connect nodeField='cycleIntervalprotoField='transitionDuration'/>
 92                                <!-- no need to report isActive since that would be duplicative -->
 93                                <connect nodeField='startTimeprotoField='set_startTime'/>
 94                           </IS>
 95                      </TimeSensor>
 96                      <Group DEF='PoseInterpolatorGroup'>
 97                           <!-- interpolators generated by prototype script appear here at runtime -->
 98                      </Group>
 99                      <Group DEF='ResetInterpolatorGroup'>
100                           <!-- interpolators generated by prototype script appear here at runtime -->
101                      </Group>
102                      <Script DEF='HAnimPoseScriptdirectOutput='true'   url=' "HAnimPosePrototypeScript.js" "https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Poses/HAnimPosePrototypeScript.js" '>
103                           <field name='parentHAnimHumanoidtype='SFNodeaccessType='inputOutputappinfo='Humanoid for this Pose to act upon'>
104                                <!-- initialization node (if any) goes here -->
105                           </field>
106                           <field name='nametype='SFStringaccessType='inputOutputappinfo='name of this pose'/>
107                           <field name='loatype='SFInt32accessType='initializeOnlyappinfo='default is no loa'/>
108                           <field name='descriptiontype='SFStringaccessType='inputOutputappinfo='explanation of purpose'/>
109                           <field name='enabledtype='SFBoolaccessType='inputOutputappinfo='default value true'/>
110                           <field name='resetAllJointstype='SFBoolaccessType='inputOnlyappinfo='reset the skeleton to I pose with all joints zeroed'/>
111                           <field name='poseJointstype='MFNodeaccessType='inputOutputappinfo='joint values to apply to HAnimHumanoid'>
112                                <!-- initialization nodes (if any) go here -->
113                           </field>
114                           <field name='transitionDurationtype='SFTimeaccessType='inputOutputappinfo='how many seconds to achieve the pose'/>
115                           <field name='commencePosetype='SFBoolaccessType='inputOnlyappinfo='this event tells the HAnimPose node to fully transition, equivalent to set_fraction=1'/>
116                           <field name='set_fractiontype='SFFloataccessType='inputOnlyappinfo='allows transition to proceed incrementally from fraction [0..10'/>
117                           <field name='set_startTimetype='SFTimeaccessType='inputOnlyappinfo='starts the animation clock'/>
118                           <field name='isLoadedtype='SFBoolaccessType='inputOnlyappinfo='possible notification from LoadSensor if using HAnimHumanoid Inline/IMPORT AS/USE'/>
119                           <field name='traceEnabledtype='SFBoolaccessType='inputOutputappinfo='debug trace to Browser output console'/>
120                           <field name='numberPoseJointstype='SFInt32value='0accessType='initializeOnlyappinfo='number of joints found in poseJoints field'/>
121                           <field name='numberSkeletonJointstype='SFInt32value='0accessType='initializeOnlyappinfo='number of joints found in Humanoid'/>
122                           <field name='jointOrientationInterpolatorstype='MFNodeaccessType='initializeOnlyappinfo='OrientationInterpolator node array matching number of poseJoints'>
123                                <!-- initialization nodes (if any) go here -->
124                           </field>
125                           <IS>
126                                <connect nodeField='parentHAnimHumanoidprotoField='parentHAnimHumanoid'/>
127                                <connect nodeField='nameprotoField='name'/>
128                                <connect nodeField='loaprotoField='loa'/>
129                                <connect nodeField='descriptionprotoField='description'/>
130                                <connect nodeField='enabledprotoField='enabled'/>
131                                <connect nodeField='resetAllJointsprotoField='resetAllJoints'/>
132                                <connect nodeField='poseJointsprotoField='poseJoints'/>
133                                <connect nodeField='transitionDurationprotoField='transitionDuration'/>
134                                <connect nodeField='commencePoseprotoField='commencePose'/>
135                                <connect nodeField='set_fractionprotoField='set_fraction'/>
136                                <connect nodeField='set_startTimeprotoField='set_startTime'/>
137                                <connect nodeField='isLoadedprotoField='isLoaded'/>
138                                <connect nodeField='traceEnabledprotoField='traceEnabled'/>
139                           </IS>
140                      </Script>
141                 </ProtoBody>
142            </ProtoDeclare>
143            <Viewpoint description='HAnimPose for HumanoidInline IMPORT modelposition='0 1 4'/>
144            <!-- no longer required: including full model <HAnimHumanoid DEF='hanim_JinLOA1' loa='2' name='JinLOA1' scale='0.0225 0.0225 0.0225'> etc... -->
145 
          <!-- ROUTE information for T_Pose node:  [from T_PoseTouchSensor.isActive to commencePose ] [from HumanoidInlineLoadSensor.isLoaded to isLoaded ] -->
          <ProtoInstance name='HAnimPoseDEF='T_Pose'>
146                 <fieldValue name='namevalue='T'/>
147                 <fieldValue name='enabledvalue='true'/>
148                 <fieldValue name='parentHAnimHumanoid'>
149                      <!-- HumanoidImported for Inline/IMPORT (or else USE='hanim_JinLOA1' if copy of original HAnimHumanoid is embedded in this model) -->
150                      <!-- debug test case for incorrect node type: <HAnimJoint DEF="ErrorDiagnosticsTest" USE='HumanoidImported'/> -->
151                      <HAnimHumanoid USE='HumanoidImported'/>
152                 </fieldValue>
153                 <fieldValue name='loavalue='1'/>
154                 <fieldValue name='descriptionvalue='arms stretched outward and level similar to letter T'/>
155                 <fieldValue name='poseJoints'>
156                      <!-- test case works without problrem: HAnimSegment DEF='TestCase' description='confirm type checking' name='specialTestCase'/ -->
157                      <HAnimJoint DEF='PoseJoint_l_shoulder_1description='left shouldername='l_shoulderrotation='0 0 1 1.57'/>
158                      <HAnimJoint DEF='PoseJoint_r_shoulder_1description='right shouldername='r_shoulderrotation='0 0 -1 1.57'/>
159                 </fieldValue>
160                 <fieldValue name='transitionDurationvalue='1.3'/>
161            </ProtoInstance>
162 
          <!-- ROUTE information for A_Pose node:  [from A_PoseTouchSensor.isActive to commencePose ] [from HumanoidInlineLoadSensor.isLoaded to isLoaded ] -->
          <ProtoInstance name='HAnimPoseDEF='A_Pose'>
163                 <fieldValue name='namevalue='A'/>
164                 <fieldValue name='enabledvalue='true'/>
165                 <fieldValue name='parentHAnimHumanoid'>
166                      <!-- HumanoidImported for Inline/IMPORT (or else USE='hanim_JinLOA1' if copy of original HAnimHumanoid is embedded in this model) -->
167                      <HAnimHumanoid USE='HumanoidImported'/>
168                 </fieldValue>
169                 <fieldValue name='loavalue='1'/>
170                 <fieldValue name='descriptionvalue='arms stretched outward and downward similar to letter A'/>
171                 <fieldValue name='poseJoints'>
172                      <HAnimJoint DEF='PoseJoint_l_shoulderdescription='left shouldername='l_shoulderrotation='0 0 1 0.5'/>
173                      <HAnimJoint DEF='PoseJoint_r_shoulderdescription='right shouldername='r_shoulderrotation='0 0 -1 0.5'/>
174                 </fieldValue>
175                 <fieldValue name='transitionDurationvalue='1.2'/>
176                 <fieldValue name='traceEnabledvalue='true'/>
177            </ProtoInstance>
178 
          <!-- ROUTE information for TouchDown_Pose node:  [from TouchDown_PoseTouchSensor.isActive to commencePose ] [from HumanoidInlineLoadSensor.isLoaded to isLoaded ] -->
          <ProtoInstance name='HAnimPoseDEF='TouchDown_Pose'>
179                 <!-- thanks Joe -->
180                 <fieldValue name='namevalue='TouchDown'/>
181                 <fieldValue name='enabledvalue='true'/>
182                 <fieldValue name='parentHAnimHumanoid'>
183                      <!-- HumanoidImported for Inline/IMPORT (or else USE='hanim_JinLOA1' if copy of original HAnimHumanoid is embedded in this model) -->
184                      <HAnimHumanoid USE='HumanoidImported'/>
185                 </fieldValue>
186                 <fieldValue name='loavalue='1'/>
187                 <fieldValue name='descriptionvalue='arms and legs stretched outward providing a TouchDown gesture'/>
188                 <fieldValue name='poseJoints'>
189                      <HAnimJoint name='humanoid_rootrotation='0 1 0 -0.698132'/>
190                      <HAnimJoint name='l_hiprotation='-1 1 1 1'/>
191                      <HAnimJoint name='l_kneerotation='1 0 0 1'/>
192                      <HAnimJoint name='l_talocruralrotation='-0.2 -0 0.1 0.225'/>
193                      <HAnimJoint name='r_hiprotation='-1 -1 -1 1'/>
194                      <HAnimJoint name='r_kneerotation='1 0 0 1'/>
195                      <HAnimJoint name='r_talocruralrotation='-0.2 0 0.1 0.25'/>
196                      <HAnimJoint name='vl5rotation='0 0 0.01 0.2'/>
197                      <HAnimJoint name='vt10rotation='0 0 0.01 0.1'/>
198                      <HAnimJoint name='vc4rotation='0 0 -0.01 0.15'/>
199                      <HAnimJoint name='l_shoulderrotation='-1 0.5 1 2'/>
200                      <HAnimJoint name='l_elbowrotation='-1 0 0 1'/>
201                      <HAnimJoint name='l_radiocarpal'/>
202                      <HAnimJoint name='r_shoulderrotation='-1 -0.5 -1 2.6'/>
203                      <HAnimJoint name='r_elbowrotation='-1 0 0 1'/>
204                      <HAnimJoint name='r_radiocarpal'/>
205                 </fieldValue>
206                 <fieldValue name='transitionDurationvalue='1.2'/>
207                 <fieldValue name='traceEnabledvalue='true'/>
208            </ProtoInstance>
209 
210                 <fieldValue name='namevalue='I'/>
211                 <fieldValue name='enabledvalue='true'/>
212                 <fieldValue name='parentHAnimHumanoid'>
213                      <!-- HumanoidImported for Inline/IMPORT (or else USE='hanim_JinLOA1' if copy of original HAnimHumanoid is embedded in this model) -->
214                      <HAnimHumanoid USE='HumanoidImported'/>
215                 </fieldValue>
216                 <fieldValue name='loavalue='1'/>
217                 <fieldValue name='descriptionvalue='arms and legs straight down default binding pose for baseline Humanoid'/>
218                 <fieldValue name='poseJoints'>
219                      <!-- not defining any poseJoints equals the default "I" pose -->
220                 </fieldValue>
221                 <fieldValue name='transitionDurationvalue='1.5'/>
222                 <fieldValue name='traceEnabledvalue='true'/>
223            </ProtoInstance>
224 
          <!-- ROUTE information for H_Pose node:  [from HumanoidInlineLoadSensor.isLoaded to isLoaded ] -->
          <ProtoInstance name='HAnimPoseDEF='H_Pose'>
225                 <fieldValue name='namevalue='H'/>
226                 <fieldValue name='enabledvalue='false'/>
227                 <!-- <fieldValue name='loa' value='1'/> -->
228                 <fieldValue name='descriptionvalue='TODO experimental pose not yet implemented'/>
229                 <fieldValue name='transitionDurationvalue='1.4'/>
230                 <fieldValue name='traceEnabledvalue='true'/>
231            </ProtoInstance>
232 
          <!-- ROUTE information for FaceLeft_Pose node:  [from FaceLeftTouchSensor.isActive to commencePose ] [from ResetPoseTouchSensor.isActive to resetAllJoints ] [from HumanoidInlineLoadSensor.isLoaded to isLoaded ] -->
          <ProtoInstance name='HAnimPoseDEF='FaceLeft_Pose'>
233                 <fieldValue name='namevalue='FaceLeft'/>
234                 <fieldValue name='enabledvalue='true'/>
235                 <fieldValue name='parentHAnimHumanoid'>
236                      <!-- HumanoidImported for Inline/IMPORT (or else USE='hanim_JinLOA1' if copy of original HAnimHumanoid is embedded in this model) -->
237                      <HAnimHumanoid USE='HumanoidImported'/>
238                 </fieldValue>
239                 <fieldValue name='loavalue='0'/>
240                 <fieldValue name='descriptionvalue='Only modify humanoid_root Joint node to face left'/>
241                 <fieldValue name='poseJoints'>
242                      <HAnimJoint DEF='FaceLeft_humanoid_rootdescription='Only rotate the modelname='humanoid_rootrotation='0 1 0 1.570796'/>
243                 </fieldValue>
244                 <fieldValue name='transitionDurationvalue='1.1'/>
245                 <fieldValue name='traceEnabledvalue='true'/>
246            </ProtoInstance>
247 
          <!-- ROUTE information for FaceRight_Pose node:  [from FaceRightTouchSensor.isActive to commencePose ] [from HumanoidInlineLoadSensor.isLoaded to isLoaded ] -->
          <ProtoInstance name='HAnimPoseDEF='FaceRight_Pose'>
248                 <fieldValue name='namevalue='FaceRight'/>
249                 <fieldValue name='enabledvalue='true'/>
250                 <fieldValue name='parentHAnimHumanoid'>
251                      <!-- HumanoidImported for Inline/IMPORT (or else USE='hanim_JinLOA1' if copy of original HAnimHumanoid is embedded in this model) -->
252                      <HAnimHumanoid USE='HumanoidImported'/>
253                 </fieldValue>
254                 <fieldValue name='loavalue='0'/>
255                 <fieldValue name='descriptionvalue='Only modify humanoid_root Joint node to face right'/>
256                 <fieldValue name='poseJoints'>
257                      <HAnimJoint DEF='FaceRight_humanoid_rootdescription='Only rotate the modelname='humanoid_rootrotation='0 1 0 -1.570796'/>
258                 </fieldValue>
259                 <fieldValue name='transitionDurationvalue='1.1'/>
260                 <fieldValue name='traceEnabledvalue='true'/>
261            </ProtoInstance>
262            <Group DEF='InterfaceButtonsGroup'>
263                 <Transform DEF='DisplayHeadertranslation='0 2 0'>
264                      <Shape>
265                           <Text string='"HAnimPosePrototype example implementation"'>
266                                <FontStyle DEF='HeaderFontfamily='"SANS"justify='"MIDDLE" "MIDDLE"size='0.15style='BOLD'/>
267                           </Text>
268 
                         <!-- Appearance PoseTextAppearance is a DEF node that has 6 USE nodes: USE_1, USE_2, USE_3, USE_4, USE_5, USE_6 -->
                         <Appearance DEF='PoseTextAppearance'>
269                                <Material diffuseColor='0.1 0.5 0.3'/>
270                           </Appearance>
271                      </Shape>
272                 </Transform>
273                 <Transform DEF='T_PoseInterfacetranslation='-1.5 1.5 0'>
274                      <Shape>
275                           <Text string='"\"T\" Pose"'>
276 
                              <!-- 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'/>
277                           </Text>
278                           <Appearance USE='PoseTextAppearance'/>
279                      </Shape>
280                      <Shape>
281 
                         <!-- 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'>
282                                <Material transparency='0.8'/>
283                           </Appearance>
284                           <Box size='0.45 0.2 0.001'/>
285                      </Shape>
286 
                    <!-- 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'/>
287                      < ROUTE  fromNode='T_PoseTouchSensor' fromField='isActive' toNode='T_Pose' toField='commencePose'/>
288                 </Transform>
289                 <Transform DEF='A_PoseInterfacetranslation='-1.5 1 0'>
290                      <Shape>
291                           <Text string='"\"A\" Pose"'>
292                                <FontStyle USE='SharedFont'/>
293                           </Text>
294                           <Appearance USE='PoseTextAppearance'/>
295                      </Shape>
296                      <Shape>
297                           <!-- Selectable Text transparent Box for easy user selection -->
298                           <Appearance USE='TransparentAppearance'/>
299                           <Box size='0.45 0.2 0.001'/>
300                      </Shape>
301 
                    <!-- 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'/>
302                      < ROUTE  fromNode='A_PoseTouchSensor' fromField='isActive' toNode='A_Pose' toField='commencePose'/>
303                 </Transform>
304                 <Transform DEF='TouchDown_PoseInterfacetranslation='-1.5 0.5 0'>
305                      <Shape>
306                           <Text string='"TouchDown Pose"'>
307                                <FontStyle USE='SharedFont'/>
308                           </Text>
309                           <Appearance USE='PoseTextAppearance'/>
310                      </Shape>
311                      <Shape>
312                           <!-- Selectable Text transparent Box for easy user selection -->
313                           <Appearance USE='TransparentAppearance'/>
314                           <Box size='0.85 0.2 0.001'/>
315                      </Shape>
316 
                    <!-- ROUTE information for TouchDown_PoseTouchSensor node:  [from isActive to TouchDown_Pose.commencePose ] -->
                    <TouchSensor DEF='TouchDown_PoseTouchSensordescription='select to transition all joints to TouchDown pose'/>
317                      < ROUTE  fromNode='TouchDown_PoseTouchSensor' fromField='isActive' toNode='TouchDown_Pose' toField='commencePose'/>
318                 </Transform>
319                 <Transform DEF='I_PoseInterfacetranslation='-1.5 0.0 0'>
320                      <Shape>
321                           <Text string='"\"I\" Pose"'>
322                                <FontStyle USE='SharedFont'/>
323                           </Text>
324                           <Appearance USE='PoseTextAppearance'/>
325                      </Shape>
326                      <Shape>
327                           <!-- Selectable Text transparent Box for easy user selection -->
328                           <Appearance USE='TransparentAppearance'/>
329                           <Box size='0.45 0.2 0.001'/>
330                      </Shape>
331 
                    <!-- ROUTE information for I_PoseTouchSensor node:  [from isActive to I_Pose.commencePose ] -->
                    <TouchSensor DEF='I_PoseTouchSensordescription='select to transition all joints to "I" pose'/>
332                      < ROUTE  fromNode='I_PoseTouchSensor' fromField='isActive' toNode='I_Pose' toField='commencePose'/>
333                 </Transform>
334                 <Transform DEF='FaceLeftPoseInterfacetranslation='1.5 1.5 0'>
335                      <Shape>
336                           <Text string='"Face Left Pose"'>
337                                <FontStyle USE='SharedFont'/>
338                           </Text>
339                           <Appearance USE='PoseTextAppearance'/>
340                      </Shape>
341                      <Shape>
342                           <Appearance USE='TransparentAppearance'/>
343                           <Box size='0.9 0.2 0.001'/>
344                      </Shape>
345 
                    <!-- ROUTE information for FaceLeftTouchSensor node:  [from isActive to FaceLeft_Pose.commencePose ] -->
                    <TouchSensor DEF='FaceLeftTouchSensordescription='select to rotate body and Face Left, leave other joints unchanged'/>
346                      < ROUTE  fromNode='FaceLeftTouchSensor' fromField='isActive' toNode='FaceLeft_Pose' toField='commencePose'/>
347                 </Transform>
348                 <Transform DEF='FaceRightPoseInterfacetranslation='1.5 1 0'>
349                      <Shape>
350                           <Text string='"Face Right Pose"'>
351                                <FontStyle USE='SharedFont'/>
352                           </Text>
353                           <Appearance USE='PoseTextAppearance'/>
354                      </Shape>
355                      <Shape>
356                           <!-- Selectable Text transparent Box for easy user selection -->
357                           <Appearance USE='TransparentAppearance'/>
358                           <Box size='0.9 0.2 0.001'/>
359                      </Shape>
360 
                    <!-- ROUTE information for FaceRightTouchSensor node:  [from isActive to FaceRight_Pose.commencePose ] -->
                    <TouchSensor DEF='FaceRightTouchSensordescription='select to rotate body and Face Right, leave other joints unchanged'/>
361                      < ROUTE  fromNode='FaceRightTouchSensor' fromField='isActive' toNode='FaceRight_Pose' toField='commencePose'/>
362                 </Transform>
363                 <Transform DEF='AnimatePosesInterfacetranslation='1.5 0.5 0'>
364                      <Shape>
365                           <Text string='"Direct animation" "to, from \"I\" Pose"'>
366                                <FontStyle USE='SharedFont'/>
367                           </Text>
368 
                         <!-- Appearance AnimationTextAppearance is a DEF node that has 1 USE node: USE_1 -->
                         <Appearance DEF='AnimationTextAppearance'>
369                                <Material diffuseColor='0.1 0.2 0.3'/>
370                           </Appearance>
371                      </Shape>
372                      <Shape>
373                           <!-- Selectable Text transparent Box for easy user selection -->
374                           <Appearance USE='TransparentAppearance'/>
375                           <Box size='0.9 0.25 0.001'/>
376                      </Shape>
377 
                    <!-- ROUTE information for AnimatePosesTouchSensor node:  [from touchTime to AnimatePosesClock.startTime ] -->
                    <TouchSensor DEF='AnimatePosesTouchSensordescription='select to animate current pose to "I" pose, then back to original pose, using TimeSensor events'/>
378                      <!-- cycleInterval=4 also hard-coded in script execution message -->
379 
                    <!-- ROUTE information for AnimatePosesClock node:  [from AnimatePosesTouchSensor.touchTime to startTime ] [from fraction_changed to AnimatePosesLoopInterpolator.set_fraction ] -->
                    <TimeSensor DEF='AnimatePosesClockcycleInterval='4description='directly animate several poses'/>
380 
                    <!-- ROUTE information for AnimatePosesLoopInterpolator node:  [from AnimatePosesClock.fraction_changed to set_fraction ] [from value_changed to I_Pose.set_fraction ] -->
                    <ScalarInterpolator DEF='AnimatePosesLoopInterpolatorkey='0 0.05 0.45 0.55 0.95 1keyValue='0 0 1 1 0 0'/>
381                      < ROUTE  fromNode='AnimatePosesTouchSensor' fromField='touchTime' toNode='AnimatePosesClock' toField='startTime'/>
382                      < ROUTE  fromNode='AnimatePosesClock' fromField='fraction_changed' toNode='AnimatePosesLoopInterpolator' toField='set_fraction'/>
383                      < ROUTE  fromNode='AnimatePosesLoopInterpolator' fromField='value_changed' toNode='I_Pose' toField='set_fraction'/>
384                 </Transform>
385                 <Transform DEF='ResetDefaultPoseInterfacetranslation='1.5 0.0 0'>
386                      <Shape>
387                           <Text string='"Reset All Joints" "to Default \"I\" Pose"'>
388                                <FontStyle USE='SharedFont'/>
389                           </Text>
390                           <Appearance USE='AnimationTextAppearance'/>
391                      </Shape>
392                      <Shape>
393                           <!-- Selectable Text transparent Box for easy user selection -->
394                           <Appearance USE='TransparentAppearance'/>
395                           <Box size='0.9 0.25 0.001'/>
396                      </Shape>
397 
                    <!-- ROUTE information for ResetPoseTouchSensor node:  [from isActive to FaceLeft_Pose.resetAllJoints ] -->
                    <TouchSensor DEF='ResetPoseTouchSensordescription='select to immediately Rezero All Joints (to default "I" Pose) by sending resetAllJoints event'/>
398                      < ROUTE  fromNode='ResetPoseTouchSensor' fromField='isActive' toNode='FaceLeft_Pose' toField='resetAllJoints'/>
399                 </Transform>
400            </Group>
401            <Group DEF='HandleInlineLoadsensorRouting'>
402                 < ROUTE  fromNode='HumanoidInlineLoadSensor' fromField='isLoaded' toNode='A_Pose' toField='isLoaded'/>
403                 < ROUTE  fromNode='HumanoidInlineLoadSensor' fromField='isLoaded' toNode='H_Pose' toField='isLoaded'/>
404                 < ROUTE  fromNode='HumanoidInlineLoadSensor' fromField='isLoaded' toNode='I_Pose' toField='isLoaded'/>
405                 < ROUTE  fromNode='HumanoidInlineLoadSensor' fromField='isLoaded' toNode='T_Pose' toField='isLoaded'/>
406                 < ROUTE  fromNode='HumanoidInlineLoadSensor' fromField='isLoaded' toNode='FaceLeft_Pose' toField='isLoaded'/>
407                 < ROUTE  fromNode='HumanoidInlineLoadSensor' fromField='isLoaded' toNode='FaceRight_Pose' toField='isLoaded'/>
408                 < ROUTE  fromNode='HumanoidInlineLoadSensor' fromField='isLoaded' toNode='TouchDown_Pose' toField='isLoaded'/>
409            </Group>
410       </Scene>
411  </X3D>
<!--

<!--
Event Graph ROUTE Table shows event connections.
-->
<!-- to top DEF nodes index: A_Pose, A_PoseInterface, A_PoseTouchSensor, AnimatePosesClock, AnimatePosesInterface, AnimatePosesLoopInterpolator, AnimatePosesTouchSensor, AnimationTextAppearance, ClockTimeSensor, DisplayHeader, FaceLeft_humanoid_root, FaceLeft_Pose, FaceLeftPoseInterface, FaceLeftTouchSensor, FaceRight_humanoid_root, FaceRight_Pose, FaceRightPoseInterface, FaceRightTouchSensor, H_Pose, HandleInlineLoading, HandleInlineLoadsensorRouting, HAnimPoseScript, HeaderFont, HumanoidInline, HumanoidInlineLoadSensor, I_Pose, I_PoseInterface, I_PoseTouchSensor, InterfaceButtonsGroup, ModelInfo, PoseInterpolatorGroup, PoseJoint_l_shoulder, PoseJoint_l_shoulder_1, PoseJoint_r_shoulder, PoseJoint_r_shoulder_1, PoseTextAppearance, ResetDefaultPoseInterface, ResetInterpolatorGroup, ResetPoseTouchSensor, ResetTimeSensor, SharedFont, T_Pose, T_PoseInterface, T_PoseTouchSensor, TouchDown_Pose, TouchDown_PoseInterface, TouchDown_PoseTouchSensor, TransparentAppearance

Index for IMPORT statement: IMPORT_JoeSkeletonSkinSite

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, LoadSensor, 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 17 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)
AnimatePosesLoopInterpolator
ScalarInterpolator
set_fraction
SFFloat
then
 
 
 
AnimatePosesLoopInterpolator
ScalarInterpolator
value_changed
SFFloat

ROUTE
event to
(3)
I_Pose
ProtoInstance
set_fraction
SFFloat

FaceLeftTouchSensor
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
FaceLeft_Pose
ProtoInstance
commencePose
SFBool

FaceRightTouchSensor
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
FaceRight_Pose
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)
FaceLeft_Pose
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. 

HAnimPoseScript
Script
No direct ROUTE connection found for events to/from this node.
This node is part of a ProtoDeclare prototype declaration.
Contains SFNode field with direct access to another node.
Contains MFNode fields with direct access to other nodes. 

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. 

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

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

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. 

HumanoidInlineLoadSensor
LoadSensor
isLoaded
SFBool

ROUTE
event to
(1)
A_Pose
ProtoInstance
isLoaded
SFBool
HumanoidInlineLoadSensor
LoadSensor
isLoaded
SFBool

ROUTE
event to
(1)
H_Pose
ProtoInstance
isLoaded
SFBool
HumanoidInlineLoadSensor
LoadSensor
isLoaded
SFBool

ROUTE
event to
(1)
I_Pose
ProtoInstance
isLoaded
SFBool
HumanoidInlineLoadSensor
LoadSensor
isLoaded
SFBool

ROUTE
event to
(1)
T_Pose
ProtoInstance
isLoaded
SFBool
HumanoidInlineLoadSensor
LoadSensor
isLoaded
SFBool

ROUTE
event to
(1)
FaceLeft_Pose
ProtoInstance
isLoaded
SFBool
HumanoidInlineLoadSensor
LoadSensor
isLoaded
SFBool

ROUTE
event to
(1)
FaceRight_Pose
ProtoInstance
isLoaded
SFBool
HumanoidInlineLoadSensor
LoadSensor
isLoaded
SFBool

ROUTE
event to
(1)
TouchDown_Pose
ProtoInstance
isLoaded
SFBool

HumanoidInline
Inline
description='remote HAnimHumanoid for IMPORT' 
This node can send or receive ROUTE events via DEF='HumanoidInline' or via <IMPORT AS='HumanoidImported'/> 

line 53
IMPORT
<IMPORT inlineDEF='HumanoidInline' AS='HumanoidImported'/>
matches local node <Inline DEF='HumanoidInline'/>
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. -->