<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;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        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;
        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:249194565;
        mso-list-type:hybrid;
        mso-list-template-ids:-246875282 -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;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style></head><body lang=EN-US link=blue vlink="#954F72" style='word-wrap:break-word'><div class=WordSection1><ul style='margin-top:0in' type=disc><li class=MsoListParagraph style='margin-left:0in;mso-list:l0 level1 lfo1'> Blender uses interpolation. It has keyframes. It's the same as in all<o:p></o:p></li></ul><p class=MsoNormal>other 3D authoring software (Blender, 3ds Max, Maya...).<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Sure, Michalis then there should be no problems with the simple stuff like this. Like in those examples where you just start with ‘primate’ and go from there. Hanim wants to start with the idea of ‘standard’ animations applied to a ‘standard’ skeleton.  After all, that is why hanim is world standard, because it shows the best of what everyone already was doing. the same systems have been doing the same things the same way for at over 20 years, so it should be easy<span style='font-family:"Segoe UI Emoji",sans-serif'>😊</span></p><p class=MsoNormal><o:p> </o:p></p><ul style='margin-top:0in' type=disc><li class=MsoListParagraph style='margin-left:0in;mso-list:l0 level1 lfo1'>Transformations can be used to directly transform<o:p></o:p></li></ul><p class=MsoNormal>children, and/or the transformation can act as a bone, and<o:p></o:p></p><p class=MsoNormal>transforming it appropriately affects the "skin" mesh.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Yes, lucky that bone orientations are the same as joint rotations if the skeleton bones get attached to the appropriate joints and that skin to skeleton bindings work if the appropriate bones refer to the appropriate joints. </p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Any tool wanting to work with x3d hanim should have a button that starts with a ‘standard’ skeleton, After that it probably doesn’t matter if the other tool exposes bones or joints for skin bindings and weights  First, it only matters that blender can export and import a simple level 1 hanim skeleton with segment geometry. Next, level 2 skeleton to skin bindings. There may be lots of ways to do this internally to the particular tool, but can the user create something that can be exported to x3d in conforming hanim?</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thanks,</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><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:michalis.kambi@gmail.com">Michalis Kamburelis</a><br><b>Sent: </b>Wednesday, June 23, 2021 1:26 PM<br><b>To: </b><a href="mailto:joedwil@earthlink.net">Joseph D Williams</a><br><b>Cc: </b><a href="mailto:x3d-public@web3d.org">X3D Graphics public mailing list</a><br><b>Subject: </b>Re: [x3d-public] Blender X3D exporter: what to do, how to do it</p></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>John, Joseph: thank you for comments, answers below :)</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>> if one exports something, provide a way to import it, perhaps in another form.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Indeed, I fully agree that it should work like that in the end.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Blender glTF importer+exporter are nicely aligned in this regard: most</p><p class=MsoNormal>things that can be exported, can also be imported, and result in the</p><p class=MsoNormal>same thing. It is not 100% possible (as Blender features are just not</p><p class=MsoNormal>equal to glTF features, nor to X3D features) but it's doing as good</p><p class=MsoNormal>job as possible.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>But, practically, for some use-cases one way is more important than</p><p class=MsoNormal>the other. I will go as far as say openly: "good exporter" is IMHO</p><p class=MsoNormal>more critically needed than "good importer", because in a "normal</p><p class=MsoNormal>workflow" the exporter is needed more. By "normal workflow" I mean</p><p class=MsoNormal>this:</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>- you hire a graphic artist to make 3D model for your visualization,</p><p class=MsoNormal>- they work in Blender,</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>- and at the end export from Blender to a format supported by 3D</p><p class=MsoNormal>renderers (including, but not limited to, game engines), like to glTF</p><p class=MsoNormal>or to X3D.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>In this approach (very typical in my experience) you need a good</p><p class=MsoNormal>exporter, and you don't really need importer. I know there are</p><p class=MsoNormal>different use-cases (I happened to work with them too), when importer</p><p class=MsoNormal>becomes useful too, but they are just more rare --in my experience.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>That is why I wrote in my doc:</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>"""</p><p class=MsoNormal>Note: There's also an X3D importer. Ideally the X3D exporter and X3D</p><p class=MsoNormal>importer features should match (like the glTF importer + exporter).</p><p class=MsoNormal>But for now, it is much more important IMHO to "just have a better</p><p class=MsoNormal>exporter". Of course it depends on the use-case, but basically I would</p><p class=MsoNormal>suggest to focus on the exporter first, and worry about importer</p><p class=MsoNormal>later.</p><p class=MsoNormal>"""</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Joseph:</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>> What is the underlying method for animation? Does Blender use interpolation or is every frame a keylframe</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Blender uses interpolation. It has keyframes. It's the same as in all</p><p class=MsoNormal>other 3D authoring software (Blender, 3ds Max, Maya...).</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>You can transform (by keyframes) various things, in particular</p><p class=MsoNormal>transformations. Transformations can be used to directly transform</p><p class=MsoNormal>children, and/or the transformation can act as a bone, and</p><p class=MsoNormal>transforming it appropriately affects the "skin" mesh.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>> For hanim we need joint to skin vertx bindings and weights. How does Blender accomplish ‘skin’ animation driven be joint rotation?</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Blender has "armature with bones" (which is another way of saying</p><p class=MsoNormal>"skin with joints"). There are multiple ways to assign weights to</p><p class=MsoNormal>vertexes, more automatic and more manual. Joint rotation, as well as</p><p class=MsoNormal>other joint transformation, transforms the associated vertexes with</p><p class=MsoNormal>the given weights.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>In my view, Blender does support what is "industry standard for</p><p class=MsoNormal>animation by skinning". And it is consistent with features available</p><p class=MsoNormal>in other 3D authoring software (at least 3ds Max, Maya that I know at</p><p class=MsoNormal>basic level).</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I suggested in my document to export Blender "skinned animation" to</p><p class=MsoNormal>X3D using H-Anim, as H-Anim is the only way to make "skinned</p><p class=MsoNormal>animation" in X3D now. And from what I understand, it has a matching</p><p class=MsoNormal>feature set, matching also glTF skinned animation. So yes, it should</p><p class=MsoNormal>be possible. We would have a big problem in X3D if we cannot express a</p><p class=MsoNormal>standard approach to skinned animation :), but I believe we can.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>This is also somewhat connected to my other work -- I work on having a</p><p class=MsoNormal>perfect support for both glTF and X3D in my Castle Game Engine. Right</p><p class=MsoNormal>now we support both glTF skinned animation, and X3D H-Anim, but *not*</p><p class=MsoNormal>through the same system underneath. But it will be improved. It will</p><p class=MsoNormal>have to be unified at some point, going through the same system, and</p><p class=MsoNormal>making skinned animation on GPU -- hopefully proving that both X3D and</p><p class=MsoNormal>glTF can express the "standard skinned animation" as designed in</p><p class=MsoNormal>Blender and similar authoring software. glTF already has proven that</p><p class=MsoNormal>(by their Blender->glTF), I want X3D to prove it too :)</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>> Trying to animate skin using coordinate interpolator(s) is entirely different than hanim and basically useless for hanim because this has nothing to do with skeleton Joint driven animations.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Yes, it is something entirely different. This """fallback method that</p><p class=MsoNormal>just exports key poses using CoordinateInterpolator""" is *not* about</p><p class=MsoNormal>H-Anim. I clarified this in the document.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Regards,</p><p class=MsoNormal>Michalis</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>śr., 23 cze 2021 o 19:37 Joseph D Williams <joedwil@earthlink.net> napisał(a):</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>> Support animation by interpolating object transformation (translation, rotation, scale).</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> What is the underlying method for animation? Does Blender use interpolation or is every frame a keylframe</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>> Support animation by skinning. Using H-Anim for this is the best we have now in X3D (despite the fact that you will call a "humanoid" things that are really just "any mesh under skinning").</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>> For hanim we need joint to skin vertx bindings and weights. How does Blender accomplish ‘skin’ animation driven be joint rotation?</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>> A fallback method that just exports key poses using CoordinateInterpolator may also be sensible, depending on how easy it is.</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>> Trying to animate skin using coordinate interpolator(s) is entirely different than hanim and basically useless for hanim because this has nothing to do with skeleton Joint driven animations. The only use of this is when the author just drags a shape around to get keyframes for an interpolator, which is fine for some stuff, but not emulating hanim level 1 joint-driven animations or level 2 skin animation.</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>> Does Blender use anything like the hanimdisplacer?</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>> Unless we can retrieve a reasonable skeleton that is activated by joint rotations (level 1) and the skin bindings (level 2) it is not hanim and so no reason to even try to call it hanim export. .</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>> Thanks,</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>><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>> From: Michalis Kamburelis</p><p class=MsoNormal>> Sent: Tuesday, June 22, 2021 5:49 AM</p><p class=MsoNormal>> To: X3D Graphics public mailing list</p><p class=MsoNormal>> Subject: [x3d-public] Blender X3D exporter: what to do, how to do it</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 wrote a document outlining my Blender->X3D exporter wishlist, and</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> how to submit patches to Blender:</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>> https://docs.google.com/document/d/1ad5XsU43gQGxqC7ehSBr21mdX2dQjKZCSXUQtvRwTHw/edit?usp=sharing</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>> Please feel free to distribute it to whoever is interested. Comments welcome :)</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>> Regards,</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Michalis</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></div></body></html>