| 1 |
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 4.1//EN" "https://www.web3d.org/specifications/x3d-4.1.dtd">
|
| 3 | <X3D profile='Full' version='4.1' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='https://www.web3d.org/specifications/x3d-4.1.xsd'> |
| 4 | <head> |
| 5 | <meta name='title' content=' HAnimPoseExample.x3d '/> |
| 6 | <meta name='description' content='Native XML definition of 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='created' content='11 December 2025'/> |
| 8 | <meta name='modified' content='8 February 2026'/> |
| 9 | <meta name='creator' content='Don Brutzman'/> |
| 10 | <meta name=' warning ' content=' under development for X3D 4.1 '/> |
| 11 | <meta name='specificationSection' content='HAnim Architecture volume 1 version 2.1 draft, clause 6 Object interfaces, section 6.4 Pose'/> |
| 12 | <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'/> |
| 13 | <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'/> |
| 14 | <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'/> |
| 15 | <meta name='specificationSection' content='HAnim Architecture volume 1 version 2.1 draft, clause 4 Concepts, section 4.8.3 Poses'/> |
| 16 | <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'/> |
| 17 | <meta name='generator' content='X3D-Edit 4.0, https://www.web3d.org/x3d/tools/X3D-Edit'/> |
| 18 | <meta name='identifier' content=' https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Poses/HAnimPoseExample.x3d '/> |
| 19 | <meta name='license' content=' https://www.web3d.org/x3d/content/examples/license.html '/> |
| 20 | </head> |
| 21 | <Scene> |
| 22 | <WorldInfo DEF='ModelInfo' info='"Example scene for HAnimPose node"' title='HAnimPoseExample.x3d'/> |
| 23 | <Background skyColor='0.8 0.8 1'/> |
| 24 | <NavigationInfo/> |
| 25 | <Group DEF='HandleInlineLoading'> |
| 26 | <!-- Multiple HAnimHumanoid Inline/IMPORT models are available to support testing: Characters/ JinLOA1 JinLOA2 JinLOA3 JinLOA4 ../Skin/JoeKick ../Skin/JoeSkeletonSkinSite ../Skin/BoxMan1 ../Skin/BoxMan2 --> |
| 27 | <!-- Also tested satisfactorily: KoreanCharacter01Jin KoreanCharacter02Chul KoreanCharacter03Hyun KoreanCharacter04Young KoreanCharacter05Ju KoreanCharacter06Ga KoreanCharacter07No KoreanCharacter08Da KoreanCharacter09Ru KoreanCharacter10Mi KoreanCharacter11Min KoreanCharacter12Sun --> |
| 28 |
<!-- 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/Skin/JoeSkeletonSkinSite.x3d" '/> |
| 29 | <!-- Note that the following importedDEF must match the EXPORT name found in remote file --> |
| 30 | <IMPORT inlineDEF='HumanoidInline' importedDEF='JoeSkeletonSkinSite' AS='HumanoidImported'/> |
| 31 |
<!-- 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 hanim_FaceLeft.isLoaded
]
[from isLoaded to hanim_FaceRight.isLoaded
]
[from isLoaded to hanim_TouchDown.isLoaded
]
-->
<LoadSensor DEF='HumanoidInlineLoadSensor' timeOut='2'> |
| 32 | <Inline USE='HumanoidInline'/> |
| 33 | </LoadSensor> |
| 34 | </Group> |
| 35 | <Viewpoint description='HAnimPose for HumanoidInline IMPORT model' position='0 1 4'/> |
| 36 | <!-- no longer required: including full model <HAnimHumanoid DEF='hanim_JinLOA1' loa='2' name='JinLOA1' scale='0.0225 0.0225 0.0225'> etc... --> |
| 37 |
<!-- ROUTE information for hanim_T node:
[no input ROUTE found] [no output ROUTE found] --> <HAnimPose DEF='hanim_T' description='arms stretched outward and level similar to letter T' loa='1' name='T' transitionDuration='1.3' containerField='children'> |
| 38 | <MetadataString containerField='metadata' name='metadataTest' value='"hello HAnimPose metadata"'/> |
| 39 | <!-- test case for illegal child triggers validation reports without problem: HAnimSegment DEF='TestCase' description='confirm type checking' name='specialTestCase'/ --> |
| 40 | <HAnimJoint DEF='hanim_l_shoulder' description='left shoulder' name='l_shoulder' rotation='0 0 1 1.57'/> |
| 41 | <HAnimJoint DEF='hanim_r_shoulder' description='right shoulder' name='r_shoulder' rotation='0 0 -1 1.57'/> |
| 42 | </HAnimPose> |
| 43 |
<!-- ROUTE information for hanim_A node:
[no input ROUTE found] [no output ROUTE found] --> <HAnimPose DEF='hanim_A' description='arms stretched outward and downward similar to letter A' loa='1' name='A' transitionDuration='1.2' containerField='children'> |
| 44 | <HAnimJoint DEF='hanim_l_shoulder' description='left shoulder' name='l_shoulder' rotation='0 0 1 0.5'/> |
| 45 | <HAnimJoint DEF='hanim_r_shoulder' description='right shoulder' name='r_shoulder' rotation='0 0 -1 0.5'/> |
| 46 | </HAnimPose> |
| 47 |
<!-- HAnimPose
hanim_TouchDown is a DEF node that has 1 USE node: USE_1
<!-- ROUTE information for hanim_TouchDown node: [from TouchDown_PoseTouchSensor.isActive to commencePose ] [from HumanoidInlineLoadSensor.isLoaded to isLoaded ] [no output ROUTE found] --> <HAnimPose DEF='hanim_TouchDown' description='arms and legs stretched outward providing a TouchDown gesture' loa='1' name='TouchDown' transitionDuration='1.2' containerField='children'> |
| 48 | <HAnimJoint DEF='hanim_humanoid_root' name='humanoid_root' rotation='0 1 0 -0.6981'/> |
| 49 | <HAnimJoint DEF='hanim_l_hip' name='l_hip' rotation='-1 1 1 1'/> |
| 50 | <HAnimJoint DEF='hanim_l_knee' name='l_knee' rotation='1 0 0 1'/> |
| 51 | <HAnimJoint DEF='hanim_l_talocrural' name='l_talocrural' rotation='-0.2 0 0.1 0.225'/> |
| 52 | <HAnimJoint DEF='hanim_r_hip' name='r_hip' rotation='-1 -1 -1 1'/> |
| 53 | <HAnimJoint DEF='hanim_r_knee' name='r_knee' rotation='1 0 0 1'/> |
| 54 | <HAnimJoint DEF='hanim_r_talocrural' name='r_talocrural' rotation='-0.2 0 0.1 0.25'/> |
| 55 | <HAnimJoint DEF='hanim_vl5' name='vl5' rotation='0 0 0.01 0.2'/> |
| 56 | <HAnimJoint DEF='hanim_vt10' name='vt10' rotation='0 0 0.01 0.1'/> |
| 57 | <HAnimJoint DEF='hanim_vc4' name='vc4' rotation='0 0 -0.01 0.15'/> |
| 58 | <HAnimJoint DEF='hanim_l_shoulder' name='l_shoulder' rotation='-1 0.5 1 2'/> |
| 59 | <HAnimJoint DEF='hanim_l_elbow' name='l_elbow' rotation='-1 0 0 1'/> |
| 60 | <HAnimJoint DEF='hanim_l_radiocarpal' name='l_radiocarpal'/> |
| 61 | <HAnimJoint DEF='hanim_r_shoulder' name='r_shoulder' rotation='-1 -0.5 -1 2.6'/> |
| 62 | <HAnimJoint DEF='hanim_r_elbow' name='r_elbow' rotation='-1 0 0 1'/> |
| 63 | <HAnimJoint DEF='hanim_r_radiocarpal' name='r_radiocarpal'/> |
| 64 | </HAnimPose> |
| 65 |
<!-- ROUTE information for hanim_I node:
[no input ROUTE found] [no output ROUTE found] --> <HAnimPose DEF='hanim_I' description='arms and legs straight down default binding pose for baseline Humanoid' loa='1' name='I' transitionDuration='1.5' containerField='children'> |
| 66 | <!-- not defining any poseJoint HAnimJoint nodes equals the default "I" pose --> |
| 67 | </HAnimPose> |
| 68 |
<!-- ROUTE information for hanim_H node:
[no input ROUTE found] [no output ROUTE found] --> <HAnimPose DEF='hanim_H' description='TODO experimental pose not yet implemented' enabled='false' loa='-1' name='H' transitionDuration='1.4' containerField='children'> |
| 69 | <!-- TODO define poseJoint HAnimJoint nodes --> |
| 70 | </HAnimPose> |
| 71 |
<!-- HAnimPose
hanim_FaceLeft is a DEF node that has 1 USE node: USE_1
<!-- ROUTE information for hanim_FaceLeft node: [from FaceLeftTouchSensor.isActive to commencePose ] [from ResetPoseTouchSensor.isActive to resetAllJoints ] [from HumanoidInlineLoadSensor.isLoaded to isLoaded ] [no output ROUTE found] --> <HAnimPose DEF='hanim_FaceLeft' description='Only modify humanoid_root Joint node to face left' loa='0' name='FaceLeft' transitionDuration='1.1' containerField='children'> |
| 72 | <HAnimJoint DEF='hanim_humanoid_root' description='Only rotate the model' name='humanoid_root' rotation='0 1 0 1.5708'/> |
| 73 | </HAnimPose> |
| 74 |
<!-- HAnimPose
hanim_FaceRight is a DEF node that has 1 USE node: USE_1
<!-- ROUTE information for hanim_FaceRight node: [from FaceRightTouchSensor.isActive to commencePose ] [from HumanoidInlineLoadSensor.isLoaded to isLoaded ] [no output ROUTE found] --> <HAnimPose DEF='hanim_FaceRight' description='Only modify humanoid_root Joint node to face right' loa='0' name='FaceRight' transitionDuration='1.1' containerField='children'> |
| 75 | <HAnimJoint DEF='hanim_humanoid_root' description='Only rotate the model' name='humanoid_root' rotation='0 1 0 -1.5708'/> |
| 76 | </HAnimPose> |
| 77 | <Group DEF='InterfaceButtonsGroup'> |
| 78 | <Transform DEF='DisplayHeader' translation='0 2 0'> |
| 79 | <Shape> |
| 80 | <Text string='"HAnimPosePrototype example implementation"'> |
| 81 | <FontStyle DEF='HeaderFont' family='"SANS"' justify='"MIDDLE" "MIDDLE"' size='0.15' style='BOLD'/> |
| 82 | </Text> |
| 83 | |
| 84 | <Material diffuseColor='0.1 0.5 0.3'/> |
| 85 | </Appearance> |
| 86 | </Shape> |
| 87 | </Transform> |
| 88 | <Transform DEF='T_PoseInterface' translation='-1.5 1.5 0'> |
| 89 | <Shape> |
| 90 | <Text string='"\"T\" Pose"'> |
| 91 | |
| 92 | </Text> |
| 93 | <Appearance USE='PoseTextAppearance'/> |
| 94 | </Shape> |
| 95 | <Shape> |
| 96 | |
| 97 | <Material transparency='0.8'/> |
| 98 | </Appearance> |
| 99 | <Box size='0.45 0.2 0.001'/> |
| 100 | </Shape> |
| 101 |
<!-- 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'/> |
| 102 | < ROUTE fromNode='T_PoseTouchSensor' fromField='isActive' toNode='T_Pose' toField='commencePose'/> |
| 103 | </Transform> |
| 104 | <Transform DEF='A_PoseInterface' translation='-1.5 1 0'> |
| 105 | <Shape> |
| 106 | <Text string='"\"A\" Pose"'> |
| 107 | <FontStyle USE='SharedFont'/> |
| 108 | </Text> |
| 109 | <Appearance USE='PoseTextAppearance'/> |
| 110 | </Shape> |
| 111 | <Shape> |
| 112 | <!-- Selectable Text transparent Box for easy user selection --> |
| 113 | <Appearance USE='TransparentAppearance'/> |
| 114 | <Box size='0.45 0.2 0.001'/> |
| 115 | </Shape> |
| 116 |
<!-- 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'/> |
| 117 | < ROUTE fromNode='A_PoseTouchSensor' fromField='isActive' toNode='A_Pose' toField='commencePose'/> |
| 118 | </Transform> |
| 119 | <Transform DEF='TouchDown_PoseInterface' translation='-1.5 0.5 0'> |
| 120 | <Shape> |
| 121 | <Text string='"TouchDown Pose"'> |
| 122 | <FontStyle USE='SharedFont'/> |
| 123 | </Text> |
| 124 | <Appearance USE='PoseTextAppearance'/> |
| 125 | </Shape> |
| 126 | <Shape> |
| 127 | <!-- Selectable Text transparent Box for easy user selection --> |
| 128 | <Appearance USE='TransparentAppearance'/> |
| 129 | <Box size='0.85 0.2 0.001'/> |
| 130 | </Shape> |
| 131 |
<!-- ROUTE information for TouchDown_PoseTouchSensor node:
[from isActive to hanim_TouchDown.commencePose
]
-->
<TouchSensor DEF='TouchDown_PoseTouchSensor' description='select to transition all joints to TouchDown pose'/> |
| 132 | < ROUTE fromNode='TouchDown_PoseTouchSensor' fromField='isActive' toNode='hanim_TouchDown' toField='commencePose'/> |
| 133 | </Transform> |
| 134 | <Transform DEF='I_PoseInterface' translation='-1.5 0 0'> |
| 135 | <Shape> |
| 136 | <Text string='"\"I\" Pose"'> |
| 137 | <FontStyle USE='SharedFont'/> |
| 138 | </Text> |
| 139 | <Appearance USE='PoseTextAppearance'/> |
| 140 | </Shape> |
| 141 | <Shape> |
| 142 | <!-- Selectable Text transparent Box for easy user selection --> |
| 143 | <Appearance USE='TransparentAppearance'/> |
| 144 | <Box size='0.45 0.2 0.001'/> |
| 145 | </Shape> |
| 146 |
<!-- 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'/> |
| 147 | < ROUTE fromNode='I_PoseTouchSensor' fromField='isActive' toNode='I_Pose' toField='commencePose'/> |
| 148 | </Transform> |
| 149 | <Transform DEF='FaceLeftPoseInterface' translation='1.5 1.5 0'> |
| 150 | <Shape> |
| 151 | <Text string='"Face Left Pose"'> |
| 152 | <FontStyle USE='SharedFont'/> |
| 153 | </Text> |
| 154 | <Appearance USE='PoseTextAppearance'/> |
| 155 | </Shape> |
| 156 | <Shape> |
| 157 | <Appearance USE='TransparentAppearance'/> |
| 158 | <Box size='0.9 0.2 0.001'/> |
| 159 | </Shape> |
| 160 |
<!-- ROUTE information for FaceLeftTouchSensor node:
[from isActive to hanim_FaceLeft.commencePose
]
-->
<TouchSensor DEF='FaceLeftTouchSensor' description='select to rotate body and Face Left, leave other joints unchanged'/> |
| 161 | < ROUTE fromNode='FaceLeftTouchSensor' fromField='isActive' toNode='hanim_FaceLeft' toField='commencePose'/> |
| 162 | </Transform> |
| 163 | <Transform DEF='FaceRightPoseInterface' translation='1.5 1 0'> |
| 164 | <Shape> |
| 165 | <Text string='"Face Right Pose"'> |
| 166 | <FontStyle USE='SharedFont'/> |
| 167 | </Text> |
| 168 | <Appearance USE='PoseTextAppearance'/> |
| 169 | </Shape> |
| 170 | <Shape> |
| 171 | <!-- Selectable Text transparent Box for easy user selection --> |
| 172 | <Appearance USE='TransparentAppearance'/> |
| 173 | <Box size='0.9 0.2 0.001'/> |
| 174 | </Shape> |
| 175 |
<!-- ROUTE information for FaceRightTouchSensor node:
[from isActive to hanim_FaceRight.commencePose
]
-->
<TouchSensor DEF='FaceRightTouchSensor' description='select to rotate body and Face Right, leave other joints unchanged'/> |
| 176 | < ROUTE fromNode='FaceRightTouchSensor' fromField='isActive' toNode='hanim_FaceRight' toField='commencePose'/> |
| 177 | </Transform> |
| 178 | <Transform DEF='AnimatePosesInterface' translation='1.5 0.5 0'> |
| 179 | <Shape> |
| 180 | <Text string='"Direct animation" "to, from \"I\" Pose"'> |
| 181 | <FontStyle USE='SharedFont'/> |
| 182 | </Text> |
| 183 |
<!-- Appearance
AnimationTextAppearance is a DEF node that has 1 USE node: USE_1 -->
<Appearance DEF='AnimationTextAppearance'> |
| 184 | <Material diffuseColor='0.1 0.2 0.3'/> |
| 185 | </Appearance> |
| 186 | </Shape> |
| 187 | <Shape> |
| 188 | <!-- Selectable Text transparent Box for easy user selection --> |
| 189 | <Appearance USE='TransparentAppearance'/> |
| 190 | <Box size='0.9 0.25 0.001'/> |
| 191 | </Shape> |
| 192 |
<!-- 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'/> |
| 193 | <!-- cycleInterval=4 also hard-coded in script execution message --> |
| 194 |
<!-- 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'/> |
| 195 |
<!-- 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'/> |
| 196 | < ROUTE fromNode='AnimatePosesTouchSensor' fromField='touchTime' toNode='AnimatePosesClock' toField='startTime'/> |
| 197 | < ROUTE fromNode='AnimatePosesClock' fromField='fraction_changed' toNode='AnimatePosesLoopInterpolator' toField='set_fraction'/> |
| 198 | < ROUTE fromNode='AnimatePosesLoopInterpolator' fromField='value_changed' toNode='I_Pose' toField='set_fraction'/> |
| 199 | </Transform> |
| 200 | <Transform DEF='ResetDefaultPoseInterface' translation='1.5 0 0'> |
| 201 | <Shape> |
| 202 | <Text string='"Reset All Joints" "to Default \"I\" Pose"'> |
| 203 | <FontStyle USE='SharedFont'/> |
| 204 | </Text> |
| 205 | <Appearance USE='AnimationTextAppearance'/> |
| 206 | </Shape> |
| 207 | <Shape> |
| 208 | <!-- Selectable Text transparent Box for easy user selection --> |
| 209 | <Appearance USE='TransparentAppearance'/> |
| 210 | <Box size='0.9 0.25 0.001'/> |
| 211 | </Shape> |
| 212 |
<!-- ROUTE information for ResetPoseTouchSensor node:
[from isActive to hanim_FaceLeft.resetAllJoints
]
-->
<TouchSensor DEF='ResetPoseTouchSensor' description='select to immediately Rezero All Joints (to default "I" Pose) by sending resetAllJoints event'/> |
| 213 | < ROUTE fromNode='ResetPoseTouchSensor' fromField='isActive' toNode='hanim_FaceLeft' toField='resetAllJoints'/> |
| 214 | </Transform> |
| 215 | </Group> |
| 216 | <Group DEF='HandleInlineLoadsensorRouting'> |
| 217 | < ROUTE fromNode='HumanoidInlineLoadSensor' fromField='isLoaded' toNode='A_Pose' toField='isLoaded'/> |
| 218 | < ROUTE fromNode='HumanoidInlineLoadSensor' fromField='isLoaded' toNode='H_Pose' toField='isLoaded'/> |
| 219 | < ROUTE fromNode='HumanoidInlineLoadSensor' fromField='isLoaded' toNode='I_Pose' toField='isLoaded'/> |
| 220 | < ROUTE fromNode='HumanoidInlineLoadSensor' fromField='isLoaded' toNode='T_Pose' toField='isLoaded'/> |
| 221 | < ROUTE fromNode='HumanoidInlineLoadSensor' fromField='isLoaded' toNode='hanim_FaceLeft' toField='isLoaded'/> |
| 222 | < ROUTE fromNode='HumanoidInlineLoadSensor' fromField='isLoaded' toNode='hanim_FaceRight' toField='isLoaded'/> |
| 223 | < ROUTE fromNode='HumanoidInlineLoadSensor' fromField='isLoaded' toNode='hanim_TouchDown' toField='isLoaded'/> |
| 224 | </Group> |
| 225 | <HAnimHumanoid DEF='hanim_HumanoidStub' name='HumanoidStub' version='2.1'> |
| 226 | <!-- original HAnimHumanoid info='"humanoidVersion=2.0"' --> |
| 227 | <MetadataSet containerField='metadata' name='HAnimHumanoid.info' reference='https://www.web3d.org/documents/specifications/19774/V2.0/Architecture/ObjectInterfaces.html#Humanoid'> |
| 228 | <!-- https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4.1-CD/Part01/components/hanim.html#HAnimHumanoid --> |
| 229 | <MetadataString name='humanoidVersion' value='"2.0"'/> |
| 230 | </MetadataSet> |
| 231 | <HAnimPose USE='A_Pose' containerField='children'/> |
| 232 | <HAnimPose USE='T_Pose' containerField='children'/> |
| 233 | <HAnimPose USE='I_Pose' containerField='children'/> |
| 234 | <HAnimPose USE='H_Pose' containerField='children'/> |
| 235 | <HAnimPose USE='hanim_FaceLeft' containerField='children'/> |
| 236 | <HAnimPose USE='hanim_FaceRight' containerField='children'/> |
| 237 | <HAnimPose USE='hanim_TouchDown' containerField='children'/> |
| 238 | <!-- missing USE HAnimJoint USE='' containerField=''/> --> |
| 239 | <!-- missing USE HAnimJoint USE='' containerField=''/> --> |
| 240 | <!-- missing USE HAnimJoint USE='' containerField=''/> --> |
| 241 | <!-- missing USE HAnimJoint USE='' containerField=''/> --> |
| 242 | <!-- missing USE HAnimJoint USE='' containerField=''/> --> |
| 243 | <!-- missing USE HAnimJoint USE='' containerField=''/> --> |
| 244 | <!-- missing USE HAnimJoint USE='' containerField=''/> --> |
| 245 | <!-- missing USE HAnimJoint USE='' containerField=''/> --> |
| 246 | <!-- missing USE HAnimJoint USE='' containerField=''/> --> |
| 247 | <!-- missing USE HAnimJoint USE='' containerField=''/> --> |
| 248 | <!-- missing USE HAnimJoint USE='' containerField=''/> --> |
| 249 | <!-- missing USE HAnimJoint USE='' containerField=''/> --> |
| 250 | <!-- missing USE HAnimJoint USE='' containerField=''/> --> |
| 251 | <!-- missing USE HAnimJoint USE='' containerField=''/> --> |
| 252 | <!-- missing USE HAnimJoint USE='' containerField=''/> --> |
| 253 | <!-- missing USE HAnimJoint USE='' containerField=''/> --> |
| 254 | <HAnimJoint USE='FaceLeft_humanoid_root' containerField='joints'/> |
| 255 | <HAnimJoint USE='FaceRight_humanoid_root' containerField='joints'/> |
| 256 | <HAnimJoint USE='PoseJoint_l_shoulder' containerField='joints'/> |
| 257 | <HAnimJoint USE='PoseJoint_l_shoulder_1' containerField='joints'/> |
| 258 | <HAnimJoint USE='PoseJoint_r_shoulder' containerField='joints'/> |
| 259 | <HAnimJoint USE='PoseJoint_r_shoulder_1' containerField='joints'/> |
| 260 | </HAnimHumanoid> |
| 261 | </Scene> |
| 262 | </X3D> |
============================================================================================================================= HAnimHumanoid hanim_HumanoidStub skeleton holds X3D4 HAnim2 joints/segments. [key] jointname : segmentname ^ sitename [nodes] HAnimJoint (0), : HAnimSegment (0), % HAnimDisplacer (0), $ HAnimMotion (0), ^ HAnimSite (0), @ skin nodes (0) ============================================================================================================================= HAnimHumanoid DEF='hanim_HumanoidStub name='HumanoidStub' loa='-1' skeleton =============================================================================================================================
The following inset decorates the original HAnimHumanoid skeleton with additional visualization shapes. Authors can copy/paste this version to assist in visually diagnosing skeleton correctness.
Key to author-assist additions inserted in the HAnimHumanoid skeleton:
| <HAnimHumanoid DEF='hanim_HumanoidStub' name='HumanoidStub' version ='2.1' > | |||||||||||||||||||||||||||||
| 36 | <!-- no longer required: including full model <HAnimHumanoid DEF='hanim_JinLOA1' loa='2' name='JinLOA1' scale='0.0225 0.0225 0.0225'> etc... --> | ||||||||||||||||||||||||||||
|
231 |
<HAnimPose USE='A_Pose' containerField='children'/>
|
232 |
<HAnimPose USE='T_Pose' containerField='children'/>
|
233 |
<HAnimPose USE='I_Pose' containerField='children'/>
|
234 |
<HAnimPose USE='H_Pose' containerField='children'/>
|
235 |
<HAnimPose USE='hanim_FaceLeft' containerField='children'/>
|
236 |
<HAnimPose USE='hanim_FaceRight' containerField='children'/>
|
237 |
<HAnimPose USE='hanim_TouchDown' containerField='children'/>
|
253 |
<!-- missing USE HAnimJoint USE='' containerField=''/> -->
|
254 |
<HAnimJoint USE='FaceLeft_humanoid_root' containerField='joints'/>
|
255 |
<HAnimJoint USE='FaceRight_humanoid_root' containerField='joints'/>
|
256 |
<HAnimJoint USE='PoseJoint_l_shoulder' containerField='joints'/>
|
257 |
<HAnimJoint USE='PoseJoint_l_shoulder_1' containerField='joints'/>
|
258 |
<HAnimJoint USE='PoseJoint_r_shoulder' containerField='joints'/>
|
259 |
<HAnimJoint USE='PoseJoint_r_shoulder_1' containerField='joints'/>
|
|
|
|
</HAnimHumanoid> |
|||||||||||||||||||||||||||||
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
(node type not found) commencePose FieldTypeNotFound |
|
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
(node type not found) set_fraction SFFloat |
|
FaceLeftTouchSensor
TouchSensor isActive SFBool |
hanim_FaceLeft
HAnimPose commencePose FieldTypeNotFound |
|
FaceRightTouchSensor
TouchSensor isActive SFBool |
hanim_FaceRight
HAnimPose commencePose FieldTypeNotFound |
|
I_PoseTouchSensor
TouchSensor isActive SFBool |
I_Pose
(node type not found) commencePose FieldTypeNotFound |
|
ResetPoseTouchSensor
TouchSensor isActive SFBool |
hanim_FaceLeft
HAnimPose resetAllJoints FieldTypeNotFound |
|
T_PoseTouchSensor
TouchSensor isActive SFBool |
T_Pose
(node type not found) commencePose FieldTypeNotFound |
|
TouchDown_PoseTouchSensor
TouchSensor isActive SFBool |
hanim_TouchDown
HAnimPose commencePose FieldTypeNotFound |
|
HumanoidInlineLoadSensor
LoadSensor isLoaded SFBool |
A_Pose
(node type not found) isLoaded SFBool |
|
|
HumanoidInlineLoadSensor
LoadSensor isLoaded SFBool |
H_Pose
(node type not found) isLoaded SFBool |
|
|
HumanoidInlineLoadSensor
LoadSensor isLoaded SFBool |
I_Pose
(node type not found) isLoaded SFBool |
|
|
HumanoidInlineLoadSensor
LoadSensor isLoaded SFBool |
T_Pose
(node type not found) isLoaded SFBool |
|
|
HumanoidInlineLoadSensor
LoadSensor isLoaded SFBool |
hanim_FaceLeft
HAnimPose isLoaded SFBool |
|
|
HumanoidInlineLoadSensor
LoadSensor isLoaded SFBool |
hanim_FaceRight
HAnimPose isLoaded SFBool |
|
|
HumanoidInlineLoadSensor
LoadSensor isLoaded SFBool |
hanim_TouchDown
HAnimPose 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 30
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)
-->
<!--
For additional help information about X3D scenes, please see X3D Tooltips, X3D Resources, and X3D Scene Authoring Hints.
-->