<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:1355838355;
        mso-list-type:hybrid;
        mso-list-template-ids:1469627560 -1 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l0:level1
        {mso-level-start-at:0;
        mso-level-number-format:bullet;
        mso-level-text:\F0D8;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;
        mso-fareast-font-family:"Times New Roman";
        mso-bidi-font-family:"Times New Roman";}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l1
        {mso-list-id:1917933423;
        mso-list-type:hybrid;
        mso-list-template-ids:650959546 -1 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l1:level1
        {mso-level-start-at:0;
        mso-level-number-format:bullet;
        mso-level-text:\F0D8;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;
        mso-fareast-font-family:"Times New Roman";
        mso-bidi-font-family:"Times New Roman";}
@list l1:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l1:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l1:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l1:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l1:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l1:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l1:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l1:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style></head><body lang=EN-US link=blue vlink="#954F72"><div class=WordSection1><ul style='margin-top:0in' type=disc><li class=MsoListParagraph style='margin-left:0in;mso-list:l1 level1 lfo2'>x3dom now supports skinned animation in the dev build. Here are a few<o:p></o:p></li></ul><p class=MsoNormal>examples: http://andreasplesch.github.io/Library/Models/HAnim/x3d/InlineViewer.html<o:p></o:p></p><p class=MsoNormal>(BoxMan and Kicker are skinned).<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Real nice work Andreas,<o:p></o:p></p><p class=MsoNormal>Thanks, <o:p></o:p></p><p class=MsoNormal>Joe<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><div style='mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal style='border:none;padding:0in'><b>From: </b><a href="mailto:andreasplesch@gmail.com">Andreas Plesch</a><br><b>Sent: </b>Wednesday, November 28, 2018 12:50 PM<br><b>To: </b><a href="mailto:joedwil@earthlink.net">Joe D Williams</a><br><b>Cc: </b><a href="mailto:michalis.kambi@gmail.com">Michalis Kamburelis</a>; <a href="mailto:x3d-public@web3d.org">X3D Graphics public mailing list</a>; <a href="mailto:h-anim@web3d.org">Humanoid Animation (H-Anim) Working Group</a><br><b>Subject: </b>Re: [x3d-public] HAnim and glTF skins</p></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>A short update after Joe and me had a good discussion on the phone.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>We could trace back the origins of the new JointBinding fields and</p><p class=MsoNormal>confirm that they are meant to align an initially incompatible</p><p class=MsoNormal>geometry with a given animation of a skeleton. I am more confident now</p><p class=MsoNormal>that these fields essentially correspond to the InverseBindMatrix of</p><p class=MsoNormal>glTF skins.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>With regards to the relationship of the SkinBindingCoords field to the</p><p class=MsoNormal>SkinCoord field, we felt it is possible that only one or the other</p><p class=MsoNormal>should be used. This may still need some additional digging.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>We also discussed how similar glTF skinning is to HAnim skinning. For</p><p class=MsoNormal>example, glTF skinning also requires a binding of one or multiple</p><p class=MsoNormal>weighted joint (trafos) for each single vertex in a skin. in glTF,</p><p class=MsoNormal>this binding occurs in the JOINT_0 vertex attribute of a mesh, whereas</p><p class=MsoNormal>in HAnim the binding occurs in the skinCoordIndex field of a joint.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>x3dom now supports skinned animation in the dev build. Here are a few</p><p class=MsoNormal>examples: http://andreasplesch.github.io/Library/Models/HAnim/x3d/InlineViewer.html</p><p class=MsoNormal>(BoxMan and Kicker are skinned).</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Other links:</p><p class=MsoNormal>http://www.web3d.org/documents/specifications/19774-1/V2.0/HAnim/ObjectInterfaces.html#Humanoid</p><p class=MsoNormal>(sequence<float[4]> skinBindingNormals should be float[3] )</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>https://github.com/andreasplesch/x3dom/wiki/HAnim-and-glTF-skins</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>has now a complete, and working conversion of a simple glTF skinned</p><p class=MsoNormal>animation to HAnim. Since the conversion is using HAnim 1.0, instead</p><p class=MsoNormal>of the jointBinding fields, it is using an inner Joint to apply a</p><p class=MsoNormal>binding transform. I think it works well.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I may do another manual conversion of another simple glTF example.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The main issue with going further on x3dom is now that the skinned</p><p class=MsoNormal>deformation per vertex is currently done in js arrays on the CPU while</p><p class=MsoNormal>the glTF support is using directly the binary vertex data on the GPU.</p><p class=MsoNormal>So it may become necessary to move the skinning in x3dom also to the</p><p class=MsoNormal>GPU which requires uploading additional buffers and deeper</p><p class=MsoNormal>adjustments, and therefore investment. The alternative is to not use</p><p class=MsoNormal>BufferGeometry and translate to IndexedTriangleSet (et al.) which is</p><p class=MsoNormal>not very attractive.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>-Andreas</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>On Tue, Nov 27, 2018 at 2:51 AM Joseph D Williams <joedwil@earthlink.net> wrote:</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> I think we should get together on the phone and discuss. Let’s try and use the web3d conf line sometime. Wed at 5 pacific or Mondays at 3 has worked.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Each vertex of a skin has to be bound to the appropriate skeleton parts.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Thanks and Best,</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Joe</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Sent from Mail for Windows 10</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> From: Andreas Plesch</p><p class=MsoNormal>> Sent: Monday, November 26, 2018 10:37 AM</p><p class=MsoNormal>> To: Michalis Kamburelis</p><p class=MsoNormal>> Cc: X3D Graphics public mailing list</p><p class=MsoNormal>> Subject: Re: [x3d-public] HAnim and glTF skins</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> I figured out by now that these fields were added for HAnim 2.0</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> whereas X3D V3.3 uses HAnim 1.0 .</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> I think the idea is that you have a skeleton of joints with animation</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> data designed for it but the actual initial geometry is designed for</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> another initial state (pose). Then you can either redo the skeleton</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> and animation, redo the geometry, or apply a first ('binding')</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> transform to get the geometry into the state expected by the animated</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> joint transforms. This first transform would be defined by the</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> jointBinding fields, or as an inner joint in the skeleton's joint</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> hierarchy.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> I think these fields are similar to glTF's inverseBindingMatrix which</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> is also defined for each joint, and is applied to initial vertex</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> positions. So in order to play glTF skinned animations, it would make</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> more sense to implement these fields rather than finding a singular</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> solution.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> It is unclear to me how skinCoord and skinBindingCoord interrelate,</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> and why non-humanoids are supposed to use those. Probably because it</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> is common to have this initial binding step rather than compatible</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> skeletons and geometry in the first place.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Hopefully somebody can correct all the mistakes and misunderstandings</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> just offered above :)</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> -Andreas</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> _______________________________________________</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> x3d-public mailing list</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> x3d-public@web3d.org</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> http://web3d.org/mailman/listinfo/x3d-public_web3d.org</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>--</p><p class=MsoNormal>Andreas Plesch</p><p class=MsoNormal>Waltham, MA 02453</p><p class=MsoNormal><o:p> </o:p></p></div></body></html>