| 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='8 November 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='MovingImage' content=' demonstration video https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Poses/HAnimPosePrototypeDemoVideo.mp4 '/> |
| 15 |
<meta name='Image' content='HAnimPoseExampleTouchDown.png' />
|
| 16 |
<meta name='Image' content='HAnimPoseExampleTouchDownFaceLeftAPose.png' />
|
| 17 |
<meta name='Image' content='images/HAnimPoseExampleJoeKick.png' />
|
| 18 |
<meta name='Image' content='images/HAnimPoseExampleJoeSkeletonSkinSite.png' />
|
| 19 |
<meta name='Image' content='images/HAnimPoseExampleKoreanCharacter01Jin.png' />
|
| 20 |
<meta name='Image' content='images/HAnimPoseExampleKoreanCharacter02Chul.png' />
|
| 21 |
<meta name='Image' content='images/HAnimPoseExampleKoreanCharacter03Hyun.png' />
|
| 22 |
<meta name='Image' content='images/HAnimPoseExampleKoreanCharacter04Young.png' />
|
| 23 |
<meta name='Image' content='images/HAnimPoseExampleKoreanCharacter05Ju.png' />
|
| 24 |
<meta name='Image' content='images/HAnimPoseExampleKoreanCharacter06Ga.png' />
|
| 25 |
<meta name='Image' content='images/HAnimPoseExampleKoreanCharacter07No.png' />
|
| 26 |
<meta name='Image' content='images/HAnimPoseExampleKoreanCharacter08Da.png' />
|
| 27 |
<meta name='Image' content='images/HAnimPoseExampleKoreanCharacter09Ru.png' />
|
| 28 |
<meta name='Image' content='images/HAnimPoseExampleKoreanCharacter10Mi.png' />
|
| 29 |
<meta name='Image' content='images/HAnimPoseExampleKoreanCharacter11Min.png' />
|
| 30 |
<meta name='Image' content='images/HAnimPoseExampleKoreanCharacter12Sun.png' />
|
| 31 | <meta name='specificationSection' content='HAnim Architecture volume 1 version 2.1 draft, clause 6 Object interfaces, section 6.4 Pose'/> |
| 32 | <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'/> |
| 33 | <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'/> |
| 34 | <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'/> |
| 35 | <meta name='specificationSection' content='HAnim Architecture volume 1 version 2.1 draft, clause 4 Concepts, section 4.8.3 Poses'/> |
| 36 | <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'/> |
| 37 | <meta name='reference' content='Direct scene manipulations with Javascript, https://doc.instantreality.org/tutorial/direct-scene-manipulations-with-javascript'/> |
| 38 | <meta name='reference' content=' earlier version of this prototype: originals/HAnimPosePreliminary.x3d '/> |
| 39 | <meta name='generator' content='X3D-Edit 4.0, https://www.web3d.org/x3d/tools/X3D-Edit'/> |
| 40 | <meta name='generator' content='Sunrize X3D Editor V1.11.1, https://create3000.github.io/sunrize'/> |
| 41 | <meta name='identifier' content=' https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Poses/HAnimPosePrototype.x3d '/> |
| 42 | <meta name='license' content=' https://www.web3d.org/x3d/content/examples/license.html '/> |
| 43 | </head> |
| 44 | <Scene> |
| 45 | <WorldInfo DEF='ModelInfo' info='"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='HumanoidInline' description='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='HumanoidInline' importedDEF='JoeSkeletonSkinSite' AS='HumanoidImported'/> |
| 54 |
<!-- ROUTE information for HumanoidInlineLoadSensor node:
[from isLoaded to A_Pose.isLoaded
]
[from isLoaded to H_Pose.isLoaded
]
[from isLoaded to I_Pose.isLoaded
]
[from isLoaded to T_Pose.isLoaded
]
[from isLoaded to FaceLeft_Pose.isLoaded
]
[from isLoaded to FaceRight_Pose.isLoaded
]
[from isLoaded to TouchDown_Pose.isLoaded
]
-->
<LoadSensor DEF='HumanoidInlineLoadSensor' timeOut='2'> |
| 55 | <Inline USE='HumanoidInline'/> |
| 56 | </LoadSensor> |
| 57 | </Group> |
| 58 | <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.'> |
| 59 | <ProtoInterface> |
| 60 | <field name='name' type='SFString' value='poseName' accessType='inputOutput' appinfo='name of this pose'/> |
| 61 | <field name='parentHAnimHumanoid' type='SFNode' accessType='initializeOnly' appinfo='Humanoid for this Pose to act upon'> |
| 62 | <!-- initialization node (if any) goes here --> |
| 63 | </field> |
| 64 | <field name='loa' type='SFInt32' value='-1' accessType='initializeOnly' appinfo='default is no loa'/> |
| 65 | <field name='description' type='SFString' accessType='inputOutput' appinfo='explanation of purpose'/> |
| 66 | <field name='enabled' type='SFBool' value='true' accessType='inputOutput' appinfo='default value true'/> |
| 67 | <field name='resetAllJoints' type='SFBool' accessType='inputOnly' appinfo='reset the skeleton to I pose with all joints zeroed'/> |
| 68 | <field name='poseJoints' type='MFNode' accessType='inputOutput' appinfo='joint values to apply to HAnimHumanoid'> |
| 69 | <!-- initialization nodes (if any) go here --> |
| 70 | </field> |
| 71 | <field name='transitionDuration' type='SFTime' value='0' accessType='inputOutput' appinfo='how many seconds to achieve the pose'/> |
| 72 | <field name='isActive' type='SFBool' accessType='outputOnly' appinfo='event indicating when pose transition is active'/> |
| 73 | <field name='commencePose' type='SFBool' accessType='inputOnly' appinfo='this event tells the HAnimPose node to fully transition, equivalent to set_fraction=1'/> |
| 74 | <field name='set_startTime' type='SFTime' accessType='inputOnly' appinfo='starts the animation clock'/> |
| 75 | <field name='set_fraction' type='SFFloat' accessType='inputOnly' appinfo='allows transition to proceed incrementally from fraction [0..10'/> |
| 76 | <field name='isLoaded' type='SFBool' accessType='inputOnly' appinfo='possible notification from LoadSensor if using HAnimHumanoid Inline/IMPORT AS/USE'/> |
| 77 | <field name='traceEnabled' type='SFBool' value='true' accessType='inputOutput' appinfo='debug trace to Browser output console'/> |
| 78 | </ProtoInterface> |
| 79 | <ProtoBody> |
| 80 | <TimeSensor DEF='ClockTimeSensor' description='control timing of pose animation when triggered'> |
| 81 | <IS> |
| 82 | <connect nodeField='enabled' protoField='enabled'/> |
| 83 | <connect nodeField='cycleInterval' protoField='transitionDuration'/> |
| 84 | <connect nodeField='isActive' protoField='isActive'/> |
| 85 | <connect nodeField='startTime' protoField='set_startTime'/> |
| 86 | </IS> |
| 87 | </TimeSensor> |
| 88 | <TimeSensor DEF='ResetTimeSensor' description='control timing of skeleton reset to "A" pose when triggered'> |
| 89 | <IS> |
| 90 | <connect nodeField='enabled' protoField='enabled'/> |
| 91 | <connect nodeField='cycleInterval' protoField='transitionDuration'/> |
| 92 | <!-- no need to report isActive since that would be duplicative --> |
| 93 | <connect nodeField='startTime' protoField='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='HAnimPoseScript' directOutput='true' url=' "HAnimPosePrototypeScript.js" "https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Poses/HAnimPosePrototypeScript.js" '> |
| 103 | <field name='parentHAnimHumanoid' type='SFNode' accessType='inputOutput' appinfo='Humanoid for this Pose to act upon'> |
| 104 | <!-- initialization node (if any) goes here --> |
| 105 | </field> |
| 106 | <field name='name' type='SFString' accessType='inputOutput' appinfo='name of this pose'/> |
| 107 | <field name='loa' type='SFInt32' accessType='initializeOnly' appinfo='default is no loa'/> |
| 108 | <field name='description' type='SFString' accessType='inputOutput' appinfo='explanation of purpose'/> |
| 109 | <field name='enabled' type='SFBool' accessType='inputOutput' appinfo='default value true'/> |
| 110 | <field name='resetAllJoints' type='SFBool' accessType='inputOnly' appinfo='reset the skeleton to I pose with all joints zeroed'/> |
| 111 | <field name='poseJoints' type='MFNode' accessType='inputOutput' appinfo='joint values to apply to HAnimHumanoid'> |
| 112 | <!-- initialization nodes (if any) go here --> |
| 113 | </field> |
| 114 | <field name='transitionDuration' type='SFTime' accessType='inputOutput' appinfo='how many seconds to achieve the pose'/> |
| 115 | <field name='commencePose' type='SFBool' accessType='inputOnly' appinfo='this event tells the HAnimPose node to fully transition, equivalent to set_fraction=1'/> |
| 116 | <field name='set_fraction' type='SFFloat' accessType='inputOnly' appinfo='allows transition to proceed incrementally from fraction [0..10'/> |
| 117 | <field name='set_startTime' type='SFTime' accessType='inputOnly' appinfo='starts the animation clock'/> |
| 118 | <field name='isLoaded' type='SFBool' accessType='inputOnly' appinfo='possible notification from LoadSensor if using HAnimHumanoid Inline/IMPORT AS/USE'/> |
| 119 | <field name='traceEnabled' type='SFBool' accessType='inputOutput' appinfo='debug trace to Browser output console'/> |
| 120 | <field name='numberPoseJoints' type='SFInt32' value='0' accessType='initializeOnly' appinfo='number of joints found in poseJoints field'/> |
| 121 | <field name='numberSkeletonJoints' type='SFInt32' value='0' accessType='initializeOnly' appinfo='number of joints found in Humanoid'/> |
| 122 | <field name='jointOrientationInterpolators' type='MFNode' accessType='initializeOnly' appinfo='OrientationInterpolator node array matching number of poseJoints'> |
| 123 | <!-- initialization nodes (if any) go here --> |
| 124 | </field> |
| 125 | <IS> |
| 126 | <connect nodeField='parentHAnimHumanoid' protoField='parentHAnimHumanoid'/> |
| 127 | <connect nodeField='name' protoField='name'/> |
| 128 | <connect nodeField='loa' protoField='loa'/> |
| 129 | <connect nodeField='description' protoField='description'/> |
| 130 | <connect nodeField='enabled' protoField='enabled'/> |
| 131 | <connect nodeField='resetAllJoints' protoField='resetAllJoints'/> |
| 132 | <connect nodeField='poseJoints' protoField='poseJoints'/> |
| 133 | <connect nodeField='transitionDuration' protoField='transitionDuration'/> |
| 134 | <connect nodeField='commencePose' protoField='commencePose'/> |
| 135 | <connect nodeField='set_fraction' protoField='set_fraction'/> |
| 136 | <connect nodeField='set_startTime' protoField='set_startTime'/> |
| 137 | <connect nodeField='isLoaded' protoField='isLoaded'/> |
| 138 | <connect nodeField='traceEnabled' protoField='traceEnabled'/> |
| 139 | </IS> |
| 140 | </Script> |
| 141 | </ProtoBody> |
| 142 | </ProtoDeclare> |
| 143 | <Viewpoint description='HAnimPose for HumanoidInline IMPORT model' position='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='HAnimPose' DEF='T_Pose'> |
| 146 | <fieldValue name='name' value='T'/> |
| 147 | <fieldValue name='enabled' value='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='loa' value='1'/> |
| 154 | <fieldValue name='description' value='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_1' description='left shoulder' name='l_shoulder' rotation='0 0 1 1.57'/> |
| 158 | <HAnimJoint DEF='PoseJoint_r_shoulder_1' description='right shoulder' name='r_shoulder' rotation='0 0 -1 1.57'/> |
| 159 | </fieldValue> |
| 160 | <fieldValue name='transitionDuration' value='1.3'/> |
| 161 | </ProtoInstance> |
| 162 |
<!-- ROUTE information for A_Pose node:
[from A_PoseTouchSensor.isActive to commencePose
]
[from HumanoidInlineLoadSensor.isLoaded to isLoaded
]
-->
<ProtoInstance name='HAnimPose' DEF='A_Pose'> |
| 163 | <fieldValue name='name' value='A'/> |
| 164 | <fieldValue name='enabled' value='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='loa' value='1'/> |
| 170 | <fieldValue name='description' value='arms stretched outward and downward similar to letter A'/> |
| 171 | <fieldValue name='poseJoints'> |
| 172 | <HAnimJoint DEF='PoseJoint_l_shoulder' description='left shoulder' name='l_shoulder' rotation='0 0 1 0.5'/> |
| 173 | <HAnimJoint DEF='PoseJoint_r_shoulder' description='right shoulder' name='r_shoulder' rotation='0 0 -1 0.5'/> |
| 174 | </fieldValue> |
| 175 | <fieldValue name='transitionDuration' value='1.2'/> |
| 176 | <fieldValue name='traceEnabled' value='true'/> |
| 177 | </ProtoInstance> |
| 178 |
<!-- ROUTE information for TouchDown_Pose node:
[from TouchDown_PoseTouchSensor.isActive to commencePose
]
[from HumanoidInlineLoadSensor.isLoaded to isLoaded
]
-->
<ProtoInstance name='HAnimPose' DEF='TouchDown_Pose'> |
| 179 | <!-- thanks Joe --> |
| 180 | <fieldValue name='name' value='TouchDown'/> |
| 181 | <fieldValue name='enabled' value='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='loa' value='1'/> |
| 187 | <fieldValue name='description' value='arms and legs stretched outward providing a TouchDown gesture'/> |
| 188 | <fieldValue name='poseJoints'> |
| 189 | <HAnimJoint name='humanoid_root' rotation='0 1 0 -0.698132'/> |
| 190 | <HAnimJoint name='l_hip' rotation='-1 1 1 1'/> |
| 191 | <HAnimJoint name='l_knee' rotation='1 0 0 1'/> |
| 192 | <HAnimJoint name='l_talocrural' rotation='-0.2 -0 0.1 0.225'/> |
| 193 | <HAnimJoint name='r_hip' rotation='-1 -1 -1 1'/> |
| 194 | <HAnimJoint name='r_knee' rotation='1 0 0 1'/> |
| 195 | <HAnimJoint name='r_talocrural' rotation='-0.2 0 0.1 0.25'/> |
| 196 | <HAnimJoint name='vl5' rotation='0 0 0.01 0.2'/> |
| 197 | <HAnimJoint name='vt10' rotation='0 0 0.01 0.1'/> |
| 198 | <HAnimJoint name='vc4' rotation='0 0 -0.01 0.15'/> |
| 199 | <HAnimJoint name='l_shoulder' rotation='-1 0.5 1 2'/> |
| 200 | <HAnimJoint name='l_elbow' rotation='-1 0 0 1'/> |
| 201 | <HAnimJoint name='l_radiocarpal'/> |
| 202 | <HAnimJoint name='r_shoulder' rotation='-1 -0.5 -1 2.6'/> |
| 203 | <HAnimJoint name='r_elbow' rotation='-1 0 0 1'/> |
| 204 | <HAnimJoint name='r_radiocarpal'/> |
| 205 | </fieldValue> |
| 206 | <fieldValue name='transitionDuration' value='1.2'/> |
| 207 | <fieldValue name='traceEnabled' value='true'/> |
| 208 | </ProtoInstance> |
| 209 |
<!-- ROUTE information for I_Pose node:
[from I_PoseTouchSensor.isActive to commencePose
]
[from AnimatePosesLoopInterpolator.value_changed to set_fraction
]
[from HumanoidInlineLoadSensor.isLoaded to isLoaded
]
-->
<ProtoInstance name='HAnimPose' DEF='I_Pose'> |
| 210 | <fieldValue name='name' value='I'/> |
| 211 | <fieldValue name='enabled' value='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='loa' value='1'/> |
| 217 | <fieldValue name='description' value='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='transitionDuration' value='1.5'/> |
| 222 | <fieldValue name='traceEnabled' value='true'/> |
| 223 | </ProtoInstance> |
| 224 |
<!-- ROUTE information for H_Pose node:
[from HumanoidInlineLoadSensor.isLoaded to isLoaded
]
-->
<ProtoInstance name='HAnimPose' DEF='H_Pose'> |
| 225 | <fieldValue name='name' value='H'/> |
| 226 | <fieldValue name='enabled' value='false'/> |
| 227 | <!-- <fieldValue name='loa' value='1'/> --> |
| 228 | <fieldValue name='description' value='TODO experimental pose not yet implemented'/> |
| 229 | <fieldValue name='transitionDuration' value='1.4'/> |
| 230 | <fieldValue name='traceEnabled' value='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='HAnimPose' DEF='FaceLeft_Pose'> |
| 233 | <fieldValue name='name' value='FaceLeft'/> |
| 234 | <fieldValue name='enabled' value='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='loa' value='0'/> |
| 240 | <fieldValue name='description' value='Only modify humanoid_root Joint node to face left'/> |
| 241 | <fieldValue name='poseJoints'> |
| 242 | <HAnimJoint DEF='FaceLeft_humanoid_root' description='Only rotate the model' name='humanoid_root' rotation='0 1 0 1.570796'/> |
| 243 | </fieldValue> |
| 244 | <fieldValue name='transitionDuration' value='1.1'/> |
| 245 | <fieldValue name='traceEnabled' value='true'/> |
| 246 | </ProtoInstance> |
| 247 |
<!-- ROUTE information for FaceRight_Pose node:
[from FaceRightTouchSensor.isActive to commencePose
]
[from HumanoidInlineLoadSensor.isLoaded to isLoaded
]
-->
<ProtoInstance name='HAnimPose' DEF='FaceRight_Pose'> |
| 248 | <fieldValue name='name' value='FaceRight'/> |
| 249 | <fieldValue name='enabled' value='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='loa' value='0'/> |
| 255 | <fieldValue name='description' value='Only modify humanoid_root Joint node to face right'/> |
| 256 | <fieldValue name='poseJoints'> |
| 257 | <HAnimJoint DEF='FaceRight_humanoid_root' description='Only rotate the model' name='humanoid_root' rotation='0 1 0 -1.570796'/> |
| 258 | </fieldValue> |
| 259 | <fieldValue name='transitionDuration' value='1.1'/> |
| 260 | <fieldValue name='traceEnabled' value='true'/> |
| 261 | </ProtoInstance> |
| 262 | <Group DEF='InterfaceButtonsGroup'> |
| 263 | <Transform DEF='DisplayHeader' translation='0 2 0'> |
| 264 | <Shape> |
| 265 | <Text string='"HAnimPosePrototype example implementation"'> |
| 266 | <FontStyle DEF='HeaderFont' family='"SANS"' justify='"MIDDLE" "MIDDLE"' size='0.15' style='BOLD'/> |
| 267 | </Text> |
| 268 | |
| 269 | <Material diffuseColor='0.1 0.5 0.3'/> |
| 270 | </Appearance> |
| 271 | </Shape> |
| 272 | </Transform> |
| 273 | <Transform DEF='T_PoseInterface' translation='-1.5 1.5 0'> |
| 274 | <Shape> |
| 275 | <Text string='"\"T\" Pose"'> |
| 276 | |
| 277 | </Text> |
| 278 | <Appearance USE='PoseTextAppearance'/> |
| 279 | </Shape> |
| 280 | <Shape> |
| 281 | |
| 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_PoseTouchSensor' description='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_PoseInterface' translation='-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_PoseTouchSensor' description='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_PoseInterface' translation='-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_PoseTouchSensor' description='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_PoseInterface' translation='-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_PoseTouchSensor' description='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='FaceLeftPoseInterface' translation='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='FaceLeftTouchSensor' description='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='FaceRightPoseInterface' translation='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='FaceRightTouchSensor' description='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='AnimatePosesInterface' translation='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='AnimatePosesTouchSensor' description='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='AnimatePosesClock' cycleInterval='4' description='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='AnimatePosesLoopInterpolator' key='0 0.05 0.45 0.55 0.95 1' keyValue='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='ResetDefaultPoseInterface' translation='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='ResetPoseTouchSensor' description='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 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 |
A_Pose
ProtoInstance commencePose SFBool |
|
AnimatePosesTouchSensor
TouchSensor touchTime SFTime |
AnimatePosesClock
TimeSensor startTime SFTime |
then
|
AnimatePosesClock
TimeSensor fraction_changed SFFloat |
AnimatePosesLoopInterpolator
ScalarInterpolator set_fraction SFFloat |
then
|
AnimatePosesLoopInterpolator
ScalarInterpolator value_changed SFFloat |
I_Pose
ProtoInstance set_fraction SFFloat |
|
FaceLeftTouchSensor
TouchSensor isActive SFBool |
FaceLeft_Pose
ProtoInstance commencePose SFBool |
|
FaceRightTouchSensor
TouchSensor isActive SFBool |
FaceRight_Pose
ProtoInstance commencePose SFBool |
|
I_PoseTouchSensor
TouchSensor isActive SFBool |
I_Pose
ProtoInstance commencePose SFBool |
|
ResetPoseTouchSensor
TouchSensor isActive SFBool |
FaceLeft_Pose
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. |
|
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 |
A_Pose
ProtoInstance isLoaded SFBool |
|
|
HumanoidInlineLoadSensor
LoadSensor isLoaded SFBool |
H_Pose
ProtoInstance isLoaded SFBool |
|
|
HumanoidInlineLoadSensor
LoadSensor isLoaded SFBool |
I_Pose
ProtoInstance isLoaded SFBool |
|
|
HumanoidInlineLoadSensor
LoadSensor isLoaded SFBool |
T_Pose
ProtoInstance isLoaded SFBool |
|
|
HumanoidInlineLoadSensor
LoadSensor isLoaded SFBool |
FaceLeft_Pose
ProtoInstance isLoaded SFBool |
|
|
HumanoidInlineLoadSensor
LoadSensor isLoaded SFBool |
FaceRight_Pose
ProtoInstance isLoaded SFBool |
|
|
HumanoidInlineLoadSensor
LoadSensor isLoaded SFBool |
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. |
<!--
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.
-->