| 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='title' content=' HAnimPosePrototype.x3d '/> |
| 6 | <meta name='description' content='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='info' content='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='created' content='2 October 2025'/> |
| 9 | <meta name='modified' content='20 October 2025'/> |
| 10 | <meta name='creator' content='Don Brutzman'/> |
| 11 | <meta name='creator' content='Joe Williams'/> |
| 12 | <meta name='contributor' content='Holger Seelig for X_ITE, Sunrize on Windows, scripting guidance, and Inline IMPORT functionality as node-reference equivalent to USE'/> |
| 13 | <meta name='reference' content=' HAnimPosePrototype.console.txt '/> |
| 14 |
<meta name='Image' content='HAnimPoseExampleTouchDown.png' />
|
| 15 |
<meta name='Image' content='HAnimPoseExampleTouchDownFaceLeftAPose.png' />
|
| 16 | <meta name='reference' content='Direct scene manipulations with Javascript, https://doc.instantreality.org/tutorial/direct-scene-manipulations-with-javascript'/> |
| 17 | <meta name='specificationSection' content='HAnim Architecture volume 1 version 2.1 draft, clause 4 Concepts, section 4.8.2 Modelling of human-like HAnim figures'/> |
| 18 | <meta name='specificationUrl' content='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='specificationSection' content='HAnim Architecture volume 1 version 2.1 draft, clause 4 Concepts, section 4.8.3 Poses'/> |
| 20 | <meta name='specificationUrl' content='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='specificationSection' content='HAnim Architecture volume 1 version 2.1 draft, clause 6 Object interfaces, section 6.43 Pose'/> |
| 22 | <meta name='specificationUrl' content='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='reference' content=' earlier version of this prototype: HAnimPosePreliminary.x3d '/> |
| 24 | <meta name='generator' content='X3D-Edit 4.0, https://www.web3d.org/x3d/tools/X3D-Edit'/> |
| 25 | <meta name='generator' content='Sunrize X3D Editor V1.11.1, https://create3000.github.io/sunrize'/> |
| 26 | <meta name='identifier' content=' https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Poses/HAnimPosePrototype.x3d '/> |
| 27 | <meta name='license' content=' https://www.web3d.org/x3d/content/examples/license.html '/> |
| 28 | </head> |
| 29 | <Scene> |
| 30 | <WorldInfo DEF='ModelInfo' info='"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='JinLOA1Inline' description='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='JinLOA1Inline' importedDEF='JinLOA1' AS='JinLOA1Imported'/> |
| 36 | </Group> |
| 37 | <ProtoDeclare name='HAnimPose' appinfo='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='name' type='SFString' value='poseName' accessType='inputOutput' appinfo='name of this pose'/> |
| 40 | <field name='parentHAnimHumanoid' type='SFNode' accessType='initializeOnly' appinfo='Humanoid for this Pose to act upon'/> |
| 41 | <field name='loa' type='SFInt32' value='-1' accessType='initializeOnly' appinfo='default is no loa'/> |
| 42 | <field name='description' type='SFString' accessType='inputOutput' appinfo='explanation of purpose'/> |
| 43 | <field name='enabled' type='SFBool' value='true' accessType='inputOutput' appinfo='default value true'/> |
| 44 | <field name='resetAllJoints' type='SFBool' accessType='inputOnly' appinfo='reset the skeleton to I pose with all joints zeroed'/> |
| 45 | <field name='resetOtherJoints' type='SFBool' value='false' accessType='inputOutput' appinfo='resetOtherJoints false (ignoring other joints) only adjusts pose joints and allows pose composition, otherwise all other joints are zeroed'/> |
| 46 | <field name='poseJoints' type='MFNode' accessType='inputOutput' appinfo='joint values to apply to HAnimHumanoid'/> |
| 47 | <field name='transitionDuration' type='SFTime' value='0' accessType='inputOutput' appinfo='how many seconds to achieve the pose'/> |
| 48 | <field name='isActive' type='SFBool' accessType='outputOnly' appinfo='event indicating when pose transition is active'/> |
| 49 | <field name='commencePose' type='SFBool' accessType='inputOnly' appinfo='this event tells the HAnimPose node to fully transition, equivalent to set_fraction=1'/> |
| 50 | <field name='set_startTime' type='SFTime' accessType='inputOnly' appinfo='starts the animation clock'/> |
| 51 | <field name='set_fraction' type='SFFloat' accessType='inputOnly' appinfo='allows transition to proceed incrementally from fraction [0..10'/> |
| 52 | <field name='traceEnabled' type='SFBool' value='true' accessType='inputOutput' appinfo='debug trace to Browser output console'/> |
| 53 | </ProtoInterface> |
| 54 | <ProtoBody> |
| 55 | <TimeSensor DEF='ClockTimeSensor' description='control timing of pose animation when triggered'> |
| 56 | <IS> |
| 57 | <connect nodeField='enabled' protoField='enabled'/> |
| 58 | <connect nodeField='cycleInterval' protoField='transitionDuration'/> |
| 59 | <connect nodeField='isActive' protoField='isActive'/> |
| 60 | <connect nodeField='startTime' protoField='set_startTime'/> |
| 61 | </IS> |
| 62 | </TimeSensor> |
| 63 | <TimeSensor DEF='ResetTimeSensor' description='control timing of skeleton reset to A pose when triggered'> |
| 64 | <IS> |
| 65 | <connect nodeField='enabled' protoField='enabled'/> |
| 66 | <connect nodeField='cycleInterval' protoField='transitionDuration'/> |
| 67 | <!-- no need to report isActive since that would be duplicative --> |
| 68 | <connect nodeField='startTime' protoField='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='HAnimPoseScript' directOutput='true' url=' "HAnimPosePrototypeScript.js" "https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Poses/HAnimPosePrototypeScript.js" '> |
| 78 | <field name='parentHAnimHumanoid' type='SFNode' accessType='inputOutput' appinfo='Humanoid for this Pose to act upon'> |
| 79 | <!-- initialization node (if any) goes here --> |
| 80 | </field> |
| 81 | <field name='name' type='SFString' accessType='inputOutput' appinfo='name of this pose'/> |
| 82 | <field name='loa' type='SFInt32' accessType='initializeOnly' appinfo='default is no loa'/> |
| 83 | <field name='description' type='SFString' accessType='inputOutput' appinfo='explanation of purpose'/> |
| 84 | <field name='enabled' type='SFBool' accessType='inputOutput' appinfo='default value true'/> |
| 85 | <field name='resetAllJoints' type='SFBool' accessType='inputOnly' appinfo='reset the skeleton to I pose with all joints zeroed'/> |
| 86 | <field name='set_resetOtherJoints' type='SFBool' accessType='inputOutput' appinfo='set_resetOtherJoints false (ignoring other joints) only adjusts pose joints and allows pose composition, otherwise all other joints are zeroed'/> |
| 87 | <field name='poseJoints' type='MFNode' accessType='inputOutput' appinfo='joint values to apply to HAnimHumanoid'> |
| 88 | <!-- initialization nodes (if any) go here --> |
| 89 | </field> |
| 90 | <field name='transitionDuration' type='SFTime' accessType='inputOutput' appinfo='how many seconds to achieve the pose'/> |
| 91 | <field name='commencePose' type='SFBool' accessType='inputOnly' appinfo='this event tells the HAnimPose node to fully transition, equivalent to set_fraction=1'/> |
| 92 | <field name='set_fraction' type='SFFloat' accessType='inputOnly' appinfo='allows transition to proceed incrementally from fraction [0..10'/> |
| 93 | <field name='set_startTime' type='SFTime' accessType='inputOnly' appinfo='starts the animation clock'/> |
| 94 | <field name='traceEnabled' type='SFBool' accessType='inputOutput' appinfo='debug trace to Browser output console'/> |
| 95 | <field name='numberPoseJoints' type='SFInt32' value='0' accessType='initializeOnly' appinfo='number of joints found in poseJoints field'/> |
| 96 | <field name='numberSkeletonJoints' type='SFInt32' value='0' accessType='initializeOnly' appinfo='number of joints found in Humanoid'/> |
| 97 | <field name='jointOrientationInterpolators' type='MFNode' accessType='initializeOnly' appinfo='OrientationInterpolator node array matching number of poseJoints'> |
| 98 | <!-- initialization nodes (if any) go here --> |
| 99 | </field> |
| 100 | <IS> |
| 101 | <connect nodeField='parentHAnimHumanoid' protoField='parentHAnimHumanoid'/> |
| 102 | <connect nodeField='name' protoField='name'/> |
| 103 | <connect nodeField='loa' protoField='loa'/> |
| 104 | <connect nodeField='description' protoField='description'/> |
| 105 | <connect nodeField='enabled' protoField='enabled'/> |
| 106 | <connect nodeField='resetAllJoints' protoField='resetAllJoints'/> |
| 107 | <connect nodeField='set_resetOtherJoints' protoField='resetOtherJoints'/> |
| 108 | <connect nodeField='poseJoints' protoField='poseJoints'/> |
| 109 | <connect nodeField='transitionDuration' protoField='transitionDuration'/> |
| 110 | <connect nodeField='commencePose' protoField='commencePose'/> |
| 111 | <connect nodeField='set_fraction' protoField='set_fraction'/> |
| 112 | <connect nodeField='set_startTime' protoField='set_startTime'/> |
| 113 | <connect nodeField='traceEnabled' protoField='traceEnabled'/> |
| 114 | </IS> |
| 115 | </Script> |
| 116 | </ProtoBody> |
| 117 | </ProtoDeclare> |
| 118 | <NavigationInfo/> |
| 119 | <Viewpoint description='HAnimPose for JinLOA1' position='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='HAnimPose' DEF='T_Pose'> |
| 122 | <fieldValue name='name' value='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='loa' value='1'/> |
| 129 | <fieldValue name='description' value='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_1' description='left shoulder' name='l_shoulder' rotation='0 0 1 1.57'/> |
| 133 | <HAnimJoint DEF='PoseJoint_r_shoulder_1' description='right shoulder' name='r_shoulder' rotation='0 0 -1 1.57'/> |
| 134 | </fieldValue> |
| 135 | <fieldValue name='transitionDuration' value='1.3'/> |
| 136 | </ProtoInstance> |
| 137 |
<!-- ROUTE information for A_Pose node:
[from A_PoseTouchSensor.isActive to commencePose
]
-->
<ProtoInstance name='HAnimPose' DEF='A_Pose'> |
| 138 | <fieldValue name='name' value='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='loa' value='1'/> |
| 144 | <fieldValue name='description' value='arms stretched outward and downward similar to letter A'/> |
| 145 | <fieldValue name='poseJoints'> |
| 146 | <HAnimJoint DEF='PoseJoint_l_shoulder' description='left shoulder' name='l_shoulder' rotation='0 0 1 0.5'/> |
| 147 | <HAnimJoint DEF='PoseJoint_r_shoulder' description='right shoulder' name='r_shoulder' rotation='0 0 -1 0.5'/> |
| 148 | </fieldValue> |
| 149 | <fieldValue name='transitionDuration' value='1.2'/> |
| 150 | <fieldValue name='traceEnabled' value='false'/> |
| 151 | </ProtoInstance> |
| 152 |
<!-- ROUTE information for TouchDown_Pose node:
[from TouchDown_PoseTouchSensor.isActive to commencePose
]
-->
<ProtoInstance name='HAnimPose' DEF='TouchDown_Pose'> |
| 153 | <!-- thanks Joe --> |
| 154 | <fieldValue name='name' value='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='loa' value='1'/> |
| 160 | <fieldValue name='description' value='arms stretched outward providing a TouchDown gesture'/> |
| 161 | <fieldValue name='poseJoints'> |
| 162 | <HAnimJoint name='humanoid_root' rotation='0 1 0 -0.698132'/> |
| 163 | <HAnimJoint name='l_hip' rotation='-1 1 1 1'/> |
| 164 | <HAnimJoint name='l_knee' rotation='1 0 0 1'/> |
| 165 | <HAnimJoint name='l_talocrural' rotation='-0.2 -0 0.1 0.225'/> |
| 166 | <HAnimJoint name='r_hip' rotation='-1 -1 -1 1'/> |
| 167 | <HAnimJoint name='r_knee' rotation='1 0 0 1'/> |
| 168 | <HAnimJoint name='r_talocrural' rotation='-0.2 0 0.1 0.25'/> |
| 169 | <HAnimJoint name='vl5' rotation='0 0 0.01 0.2'/> |
| 170 | <HAnimJoint name='vt10' rotation='0 0 0.01 0.1'/> |
| 171 | <HAnimJoint name='vc4' rotation='0 0 -0.01 0.15'/> |
| 172 | <HAnimJoint name='l_shoulder' rotation='-1 0.5 1 2'/> |
| 173 | <HAnimJoint name='l_elbow' rotation='-1 0 0 1'/> |
| 174 | <HAnimJoint name='l_radiocarpal'/> |
| 175 | <HAnimJoint name='r_shoulder' rotation='-1 -0.5 -1 2.6'/> |
| 176 | <HAnimJoint name='r_elbow' rotation='-1 0 0 1'/> |
| 177 | <HAnimJoint name='r_radiocarpal'/> |
| 178 | </fieldValue> |
| 179 | <fieldValue name='transitionDuration' value='1.2'/> |
| 180 | <fieldValue name='traceEnabled' value='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='HAnimPose' DEF='I_Pose'> |
| 183 | <fieldValue name='name' value='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='loa' value='1'/> |
| 189 | <fieldValue name='description' value='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='transitionDuration' value='1.5'/> |
| 194 | <fieldValue name='traceEnabled' value='false'/> |
| 195 | </ProtoInstance> |
| 196 | <ProtoInstance name='HAnimPose' DEF='H_Pose'> |
| 197 | <fieldValue name='name' value='H'/> |
| 198 | <fieldValue name='loa' value='1'/> |
| 199 | <fieldValue name='description' value='TODO experimental pose not yet implemented'/> |
| 200 | <fieldValue name='enabled' value='false'/> |
| 201 | <fieldValue name='transitionDuration' value='1.4'/> |
| 202 | <fieldValue name='traceEnabled' value='false'/> |
| 203 | </ProtoInstance> |
| 204 |
<!-- ROUTE information for FaceLeftPose node:
[from FaceLeftTouchSensor.isActive to commencePose
]
[from ResetPoseTouchSensor.isActive to resetAllJoints
]
-->
<ProtoInstance name='HAnimPose' DEF='FaceLeftPose'> |
| 205 | <fieldValue name='name' value='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='loa' value='0'/> |
| 211 | <fieldValue name='description' value='Only modify humanoid_root Joint node to face left'/> |
| 212 | <fieldValue name='poseJoints'> |
| 213 | <HAnimJoint DEF='FaceLeft_humanoid_root' description='Only rotate the model' name='humanoid_root' rotation='0 1 0 1.570796'/> |
| 214 | </fieldValue> |
| 215 | <fieldValue name='transitionDuration' value='1.1'/> |
| 216 | <fieldValue name='traceEnabled' value='false'/> |
| 217 | </ProtoInstance> |
| 218 |
<!-- ROUTE information for FaceRightPose node:
[from FaceRightTouchSensor.isActive to commencePose
]
-->
<ProtoInstance name='HAnimPose' DEF='FaceRightPose'> |
| 219 | <fieldValue name='name' value='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='loa' value='0'/> |
| 225 | <fieldValue name='description' value='Only modify humanoid_root Joint node to face right'/> |
| 226 | <fieldValue name='poseJoints'> |
| 227 | <HAnimJoint DEF='FaceRight_humanoid_root' description='Only rotate the model' name='humanoid_root' rotation='0 1 0 -1.570796'/> |
| 228 | </fieldValue> |
| 229 | <fieldValue name='transitionDuration' value='1.1'/> |
| 230 | <fieldValue name='traceEnabled' value='false'/> |
| 231 | </ProtoInstance> |
| 232 | <Group DEF='InterfaceButtonsGroup'> |
| 233 | <Transform DEF='T_PoseInterface' translation='-1.5 1.5 0'> |
| 234 | <Shape> |
| 235 | <Text string='"\"T\" Pose"'> |
| 236 | |
| 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 | |
| 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_PoseTouchSensor' description='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_PoseInterface' translation='-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_PoseTouchSensor' description='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_PoseInterface' translation='-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_PoseTouchSensor' description='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_PoseInterface' translation='-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_PoseTouchSensor' description='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='FaceLeftPoseInterface' translation='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='FaceLeftTouchSensor' description='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='FaceRightPoseInterface' translation='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='FaceRightTouchSensor' description='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='AnimatePosesInterface' translation='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='AnimatePosesTouchSensor' description='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='AnimatePosesClock' cycleInterval='4' description='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='AnimatePosesInterpolator' key='0 0.05 0.45 0.55 0.95 1' keyValue='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='ResetPoseInterface' translation='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='ResetPoseTouchSensor' description='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 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 |
A_Pose
ProtoInstance commencePose SFBool |
|
AnimatePosesTouchSensor
TouchSensor touchTime SFTime |
AnimatePosesClock
TimeSensor startTime SFTime |
then
|
AnimatePosesClock
TimeSensor fraction_changed SFFloat |
AnimatePosesInterpolator
ScalarInterpolator set_fraction SFFloat |
then
|
AnimatePosesInterpolator
ScalarInterpolator value_changed SFFloat |
I_Pose
ProtoInstance set_fraction SFFloat |
|
FaceLeftTouchSensor
TouchSensor isActive SFBool |
FaceLeftPose
ProtoInstance commencePose SFBool |
|
FaceRightTouchSensor
TouchSensor isActive SFBool |
FaceRightPose
ProtoInstance commencePose SFBool |
|
I_PoseTouchSensor
TouchSensor isActive SFBool |
I_Pose
ProtoInstance commencePose SFBool |
|
ResetPoseTouchSensor
TouchSensor isActive SFBool |
FaceLeftPose
ProtoInstance resetAllJoints SFBool |
|
T_PoseTouchSensor
TouchSensor isActive SFBool |
T_Pose
ProtoInstance commencePose SFBool |
|
TouchDown_PoseTouchSensor
TouchSensor isActive SFBool |
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. |
<!--
Color-coding legend: X3D terminology
<X3dNode DEF='idName' field='value'/>
matches XML terminology
<XmlElement DEF='idName' attribute='value'/>
(Light-blue background: event-based behavior node or statement)
(Grey background inside box: inserted documentation)
(Magenta background: X3D Extensibility)
<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.
-->