[x3d-public] Problems with HAnimMotion - WAS: RE: Example HAnimMotion node

Don Brutzman don.brutzman at gmail.com
Wed Oct 22 14:30:32 PDT 2025


[added Dr. Myeong Won Lee plus hanim and x3d-public mailing lists]

BLUF:  HAnimMotion is well specified but various implementation efforts
need improvement.

Thanks for your thoughtful, forward-leaning note and efforts Aaron.

We do have an *HAnimMotion example in the archives*, apologies I missed
that model earlier:

   - X3D Example Archives: Humanoid Animation, Specifications, Korean
   Character Motion Annex D 01 Jin
   - Articulated 3D game character designed with a general graphics tool,
   then converted into an X3D HAnim model.
   -
   https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Specifications/KoreanCharacterMotionAnnexD01JinIndex.html

*X3D documentation* links for HAnim in this model:

   -
   https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Specifications/KoreanCharacterMotionAnnexD01Jin.html#358
   (line 358
   <https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Specifications/KoreanCharacterMotionAnnexD01Jin.html#358>
   )
   - Visualization report for HAnimHumanoid model hanim_AnnexD01Jin
   -
   https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Specifications/KoreanCharacterMotionAnnexD01Jin.html#AnnexD01JinHAnimHumanoidReport

=============================================================================================================================
HAnimHumanoid hanim_AnnexD01Jin skeleton holds X3D4 HAnim2
joints/segments with an animating motion node.
  [key] jointname : segmentname ^ sitename
[nodes] HAnimJoint (18), : HAnimSegment (18), % HAnimDisplacer (0), $
HAnimMotion (1), ^ HAnimSite (0), @ skin nodes (0)
=============================================================================================================================
HAnimHumanoid DEF='hanim_AnnexD01Jin name='AnnexD01Jin' loa='-1'motions
  HAnimMotion motion_animation
skeleton
  humanoid_root : sacrum
    sacroiliac : pelvis
      l_hip : l_thigh
      | l_knee : l_calf
      |   l_talocrural : l_talus
      |     l_metatarsophalangeal_2 : l_tarsal_proximal_phalanx_2
      r_hip : r_thigh
      | r_knee : r_calf
      |   r_talocrural : r_talus
      |     r_metatarsophalangeal_2 : r_tarsal_proximal_phalanx_2
      vl5 : l5
        skullbase : skull
        l_shoulder : l_upperarm
        | l_elbow : l_forearm
        |   l_radiocarpal : l_carpal
        r_shoulder : r_upperarm
          r_elbow : r_forearm
            r_radiocarpal : r_carpal

$ HAnimHumanoid AnnexD01Jin holds 1 HAnimMotion node: motion_animation
=============================================================================================================================

with matching HAnim specification reference

   - HAnim 2.0 Part 2: Humanoid animation (HAnim) motion data animation,
   Annex D (informative) Examples of HAnim motion data animation using a
   Motion object
   -
   https://www.web3d.org/documents/specifications/19774/V2.0/MotionDataAnimation/ExampleMocapAnimationMotionObject.html

Am getting very limited response to this model in current browsers.  X_ITE
repositions but does not play.  X3DOM does not support HAnimMotion node,
Castle Viewer and FreeWrl load the model but are silent about HAnimMotion.

Authoring tool support is provided by X3D-Edit, X3DJSAIL, X3DPSAIL, X3D
Toolips and all of our XML validation tools.  X3D-Edit validation follows -
this console output matches the build diagnostics created when model
archives are built and deployed)  As ever, if anyone detects missing or
overzealous tests for Quality Assurance (QA), am happy to add them.

--------- X3D Validator checks commenced for
KoreanCharacterMotionAnnexD01Jin.x3d ---------
Performing well-formed XML check...
Checking file:/C:/x3d-code/
www.web3d.org/x3d/content/examples/HumanoidAnimation/Specifications/KoreanCharacterMotionAnnexD01Jin.x3d.
..
Well-formed XML check: pass

Performing DOCTYPE check...
[X3dDoctypeChecker] success: valid XML declaration
found.[X3dDoctypeChecker] success: final X3D 4.0 DOCTYPE found.

Performing DTD validation...
Checking file:/C:/x3d-code/
www.web3d.org/x3d/content/examples/HumanoidAnimation/Specifications/KoreanCharacterMotionAnnexD01Jin.x3d.
..
Referenced entity at "
http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd
".
Referenced entity at "http://www.w3.org/2001/XMLSchema.dtd".
Referenced entity at
"jrt:/java.xml/jdk/xml/internal/jdkcatalog/w3c/dtd/schema10/datatypes.dtd".
XML DTD validation: pass

Performing X3D schema validation...
Checking file:/C:/x3d-code/
www.web3d.org/x3d/content/examples/HumanoidAnimation/Specifications/KoreanCharacterMotionAnnexD01Jin.x3d.
..
Referenced entity at "
http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd
".
Referenced entity at "http://www.w3.org/2001/XMLSchema.dtd".
Referenced entity at
"jrt:/java.xml/jdk/xml/internal/jdkcatalog/w3c/dtd/schema10/datatypes.dtd".
XML schema validation: pass

Performing X3D regular expression (regex) values check...
X3D regex check: complete

Performing X3D Schematron check...
X3D version 4.0 was approved by Web3D Consortium and ISO in 2023.[/X3D,
diagnostic]
X3D version 4.0 offers many new features including interoperability with
HTML5, glTF 2.0 Physically Based Rendering (PBR), and Web Audio API.[/X3D,
diagnostic]
<HAnimHumanoid DEF='hanim_AnnexD01Jin' name='AnnexD01Jin'/> version='2.0'
with X3D version='4.0' [/X3D/Scene/HAnimHumanoid, diagnostic]
====================================================================================================================
[/X3D/Scene/HAnimHumanoid, diagnostic]
<HAnimHumanoid DEF='hanim_AnnexD01Jin' name='AnnexD01Jin'/> node
count(HAnimJoint)           within skeleton hierarchy        =
18[/X3D/Scene/HAnimHumanoid, diagnostic]
<HAnimHumanoid DEF='hanim_AnnexD01Jin' name='AnnexD01Jin'/> node
count(HAnimSegment)         within skeleton hierarchy        =
18[/X3D/Scene/HAnimHumanoid, diagnostic]
<HAnimHumanoid DEF='hanim_AnnexD01Jin' name='AnnexD01Jin'/> node
count(HAnimSite)            within HAnimHumanoid             =
0[/X3D/Scene/HAnimHumanoid, diagnostic]
<HAnimHumanoid DEF='hanim_AnnexD01Jin' name='AnnexD01Jin'/> node
count(HAnimSite//Viewpoint) within skeleton hierarchy        =
0[/X3D/Scene/HAnimHumanoid, diagnostic]
<HAnimHumanoid DEF='hanim_AnnexD01Jin' name='AnnexD01Jin'/> node
count(HAnimDisplacer)       within skeleton hierarchy        =
0[/X3D/Scene/HAnimHumanoid, diagnostic]
<HAnimHumanoid DEF='hanim_AnnexD01Jin' name='AnnexD01Jin'/> node
count(<HAnimJoint   USE='*' containerField = 'joints'/>)     =
18[/X3D/Scene/HAnimHumanoid, diagnostic]
<HAnimHumanoid DEF='hanim_AnnexD01Jin' name='AnnexD01Jin'/> node
count(<HAnimSegment USE='*' containerField = 'segments'/>)   =
18[/X3D/Scene/HAnimHumanoid, diagnostic]
<HAnimHumanoid DEF='hanim_AnnexD01Jin' name='AnnexD01Jin'/> node
count(<HAnimSite    USE='*' containerField = 'sites'/>)      =
0[/X3D/Scene/HAnimHumanoid, diagnostic]
<HAnimHumanoid DEF='hanim_AnnexD01Jin' name='AnnexD01Jin'/> node
count(<HAnimSite    DEF='*' name ends with '_view'/>)        =
0[/X3D/Scene/HAnimHumanoid, diagnostic]
====================================================================================================================
[/X3D/Scene/HAnimHumanoid, diagnostic]
<HAnimJoint DEF='hanim_l_metatarsophalangeal_2'
name='l_metatarsophalangeal_2'/> has parent HAnimJoint name='l_talocrural'
rather than expected parent name='l_tarsometatarsal_2', recommend checking
model
[/X3D/Scene/HAnimHumanoid/HAnimJoint[1]/HAnimJoint/HAnimJoint[1]/HAnimJoint/HAnimJoint/HAnimJoint,
warning]
<HAnimJoint DEF='hanim_r_metatarsophalangeal_2'
name='r_metatarsophalangeal_2'/> has parent HAnimJoint name='r_talocrural'
rather than expected parent name='r_tarsometatarsal_2', recommend checking
model
[/X3D/Scene/HAnimHumanoid/HAnimJoint[1]/HAnimJoint/HAnimJoint[2]/HAnimJoint/HAnimJoint/HAnimJoint,
warning]
<HAnimJoint DEF='hanim_vl5' name='vl5'/> has parent HAnimJoint
name='sacroiliac' rather than expected parent name='humanoid_root',
recommend checking model
[/X3D/Scene/HAnimHumanoid/HAnimJoint[1]/HAnimJoint/HAnimJoint[3], warning]
<HAnimJoint DEF='hanim_skullbase' name='skullbase'/> has parent HAnimJoint
name='vl5' rather than expected parent name='vc1', recommend checking model
[/X3D/Scene/HAnimHumanoid/HAnimJoint[1]/HAnimJoint/HAnimJoint[3]/HAnimJoint[1],
warning]
<HAnimJoint DEF='hanim_l_shoulder' name='l_shoulder'/> has parent
HAnimJoint name='vl5' rather than expected parent
name='l_acromioclavicular', recommend checking model
[/X3D/Scene/HAnimHumanoid/HAnimJoint[1]/HAnimJoint/HAnimJoint[3]/HAnimJoint[2],
warning]
<HAnimJoint DEF='hanim_r_shoulder' name='r_shoulder'/> has parent
HAnimJoint name='vl5' rather than expected parent
name='r_acromioclavicular', recommend checking model
[/X3D/Scene/HAnimHumanoid/HAnimJoint[1]/HAnimJoint/HAnimJoint[3]/HAnimJoint[3],
warning]

--------- X3D Validator checks complete for
KoreanCharacterMotionAnnexD01Jin.x3d ---------

*Implementation recap. * If memory serves, we depended on the Suwon HAnim
Editor for animation demonstrations of this example.  To my knowledge,
unfortunately no public version this tool has been shared, but we did see
some compelling demonstrations together at the Web3D 2025 Conference in
Siena.  I've copied Dr. Myeong Won Lee is you would like to pursue that
further.

HAnimMotion is based directly on BVH files for motion-capture data.  BVH
has been widely implemented but inconsistently utilized...  No particular
standard can be found, and it seems to have been popular partly because the
company BioVision was no longer in existence and thus unable to assert
IPR or sue anyone.

   - Wikipedia:  Biovision Hierarchy
   - https://en.wikipedia.org/wiki/Biovision_Hierarchy

Usually we are pretty insistent and onerous about insisting on 2
implementations before advancing any node in the standards.  There may have
been another implementation besides the Suwon codebase, am simply not
sure.  Given that it is very closely aligned with BVH, and we had multiple
tools with a validating non-trivial example, I think we might have
(reluctantly) moved forward with only one player... again, not sure.  Sorry
to be uncertain.  Hopefully we did not blunder.

I don't blame you for questioning whether to go forward if no
implementations exist... that is the primary bargain we make with the X3D
and HAnim standards.  Nevertheless I have high confidence that HAnimMotion
node is well specified, HAnimMotion data is validatable, and
HAnimMotion can be consistently repeatable by other X3D players.

I welcome any corrections and improvements to the Example Archives model.

Thank you for pursuing this.  There are many thousands of BVH models out
there (with some format variations and looseness involved).  It will be
great when we become adept at massaging & converting them into well-defined
HAnimMotion nodes (X3D-Edit has an initial implementation).  If we become
really capable at that task, especially if using your planned
implementation, we might then work on BVH validation reports during
conversion as diagnostics, and perhaps even direct import (as a HAnimMotion
node url field) as part of the draft HAnim v2.1 specification.

Seems like much excellent capability beckons!  Onward...

all the best, Don
-- 
X3D Graphics, Maritime Robotics, Distributed Simulation
Relative Motion Consulting  https://RelativeMotion.info


On Wed, Oct 22, 2025 at 8:46 AM Bergstrom, Aaron <aaron.bergstrom at und.edu>
wrote:

> All,
>
>
>
> My particular use case is not to perform any direct BVH to X3D conversion,
> or vice versa. Rather, my use cases are as follows:
>
>    1. BVH data is imported into Maya and applied to a Maya skeleton per
>    established best practices for Maya character animation. Then the animation
>    data is collected from the Maya skeleton by RawKee at export time (the way
>    I currently do it), but instead of being written out as Routes,
>    Interpolators, and a TimeSensor, it is written out as a HAnimMotion node.
>    2. A Maya animation artists animates an existing Maya character. Then
>    the animation data is collected from the Maya skeleton by RawKee at export
>    time (the way I currently do it), but instead of being written out as
>    Routes, Interpolators, and a TimeSensor, it is written out as a HAnimMotion
>    node.
>
>
>
> In the end, it doesn’t matter to RawKee whether the original animation
> data comes from a BVH file or from an animator. I just want to properly
> populate an HAnimMotion node with animation data.
>
>
>
> It seems that the only existing HAnimMotion example doesn’t work, and it
> also appears to not conform to the official X3D spec, per John’s
> description.
>
>
>
> I have to question why the HAnimMotion node is even in the X3D spec since
> there seems to be no working implementation of it in any existing browser,
> nor even any version of it in an X3D file.
>
>
>
> Neither X3DOM, nor CGE support the HAnimMotion node.
>
>
>
> X_ITE documentation says it does, but I don’t see an example of the
> HAnimMotion node on the X_ITE website, and the one version of the node on
> the Web3D X3D example site doesn’t seem to work with X_ITE. Though, as
> discussed by John, that one example doesn’t appear to match the spec anyway.
>
>
>
> I’m not sure it’s worth implementing HAnimMotion in RawKee if it can’t
> even be tested in any of the browsers.
>
>
>
> Aaron
>
>
>
> *From:* Joe D Williams <joedwil at earthlink.net>
> *Sent:* Wednesday, October 22, 2025 9:46 AM
> *To:* Don Brutzman <don.brutzman at gmail.com>; Bergstrom, Aaron <
> aaron.bergstrom at und.edu>
> *Cc:* John Carlson <yottzumm at gmail.com>; Joe D Williams <
> joedwil at earthlink.net>
> *Subject:* Re: Example HAnimMotion node
>
>
>
> I would be interested in recoding JoeKick to a BVH, currently thinking of
> and study of glTF encoding for skeleton.
>
>
>
> Otherwise I haven't seen anything since Pirroette: *spell check, that we
> looked at but I basically gave up on.
>
> Still potentially a good notsimple example conversion since BVH skeleton
> obviously did not convert using rules we had then.
>
> Maybe now there might be convert BVH to FBX or OBJ or JSON.
>
>
>
>
>
> -----Original Message-----
> From: Don Brutzman <don.brutzman at gmail.com>
> Sent: Oct 21, 2025 2:59 PM
> To: Bergstrom, Aaron <aaron.bergstrom at und.edu>
> Cc: John Carlson <yottzumm at gmail.com>, Joe D Williams <
> joedwil at earthlink.net>
> Subject: Re: Example HAnimMotion node
>
>
>
> cc: Joe
>
>
>
> I don't think we have a working example in the archives, and have lost
> track with what we were doing for testing back then.
>
>
>
> I'd welcome a simple Motion node example in the archives, for starters.  I
> suggest reaching out to the mailing lists and see who has one.
>
>
>
> New years resolution, perhaps: we ought to get competent at BVH import and
> conversion to HAnimMotion node examples.
>
>
>
> Thanks for asking Aaron.
>
>
>
> all the best, Don
>
> --
>
> X3D Graphics, Maritime Robotics, Distributed Simulation
>
> Relative Motion Consulting  https://RelativeMotion.info
>
>
>
> On Mon, Oct 20, 2025 at 9:31 PM Bergstrom, Aaron <aaron.bergstrom at und.edu>
> wrote:
>
> Don and John,
>
>
>
> Do either of you have an example of HAnim content that uses an HAnimMotion
> node? I don’t see anything in the X3D examples website under HAnim.
>
>
>
> After reading through the BVH specs, I think I understand how the
> HAnimMotion node works, but I would like to see a working version of it as
> an X3D file.
>
>
>
> Thanks,
>
>
>
> Aaron
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20251022/1f1ac290/attachment-0001.html>


More information about the x3d-public mailing list