<div dir="auto">I will try to check the latest castle-model-viewer and castle-model-converter.  If they ignores the missing joints field, we’re good.</div><div dir="auto"><br></div><div dir="auto">Also, I will look at joints in X3DUOM to see if the joints field is required.</div><div dir="auto"><br></div><div dir="auto">John</div><div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Wed, Mar 5, 2025 at 1:41 PM Joe D Williams <<a href="mailto:joedwil@earthlink.net">joedwil@earthlink.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:12pt"><p style="margin:0.1rem 0px;line-height:1">Hi John,</p>
<p style="margin:0.1rem 0px;line-height:1">  </p>
<p style="margin:0.1rem 0px;line-height:1">‘joints’ is that silly field child of Humanoid that lists the Joint nodes with a list collection of USE notations. </p>
<p style="margin:0.1rem 0px;line-height:1"> </p>
<p style="margin:0.1rem 0px;line-height:1">‘joints’ is not a field of skeleton. It is a field of Humanoid. </p>
<p style="margin:0.1rem 0px;line-height:1"> </p>
<p style="margin:0.1rem 0px;line-height:1">So, Humanoid and Joint are nodes while skeleton is a node type</p>
<p style="margin:0.1rem 0px;line-height:1">(otherwise called a 'container') </p>
<p style="margin:0.1rem 0px;line-height:1">Same as the keyword 'geometry' is a node type and IndexedFaceSet is a node name.</p>
<p style="margin:0.1rem 0px;line-height:1"> </p>
<p style="margin:0.1rem 0px;line-height:1">skin is also a container, could be called a node type. </p>
<p style="margin:0.1rem 0px;line-height:1"> </p>
<p style="margin:0.1rem 0px;line-height:1">The node type says what node names can appear in the container.</p>
<p style="margin:0.1rem 0px;line-height:1">The node name says what data is in the node. </p>
<p style="margin:0.1rem 0px;line-height:1">  </p>
<p style="margin:0.1rem 0px;line-height:1">So: </p>
<p style="margin:0.1rem 0px;line-height:1">There are two container fields for HAnimJoint, ‘skeleton’ (for the first one, the root),<br>and ‘children’ (default for the rest of the Joint hierarchy).<br>  <br>See, when you look at the Classic, the name of the 'nodetype' (containerfield) is the first text and then in the xml it gets to be containerfield='nodetype'</p>
<p style="margin:0.1rem 0px;line-height:1"><br>Done that way to eliminate the need for wrapper tags (maybe called container tags) in the xml, if I recall. </p>
<p style="margin:0.1rem 0px;line-height:1">In xml, we get an attr rather than a tag; thank goodness for all good favors.</p>
<p style="margin:0.1rem 0px;line-height:1">  </p>
<p style="margin:0.1rem 0px;line-height:1">All Fine,</p>
<p style="margin:0.1rem 0px;line-height:1">Joe</p>
</div>
<div style="border-left:1px solid #aaa;box-sizing:border-box;padding:10px 0 10px 15px;margin:0">
<p>-----Original Message-----<br>From: X3D Ecosystem public discussion <<a href="mailto:x3d-ecosystem@web3d.org" target="_blank">x3d-ecosystem@web3d.org</a>><br>Sent: Mar 5, 2025 10:53 AM<br>To: X3D Ecosystem public discussion <<a href="mailto:x3d-ecosystem@web3d.org" target="_blank">x3d-ecosystem@web3d.org</a>><br>Cc: John Carlson <<a href="mailto:yottzumm@gmail.com" target="_blank">yottzumm@gmail.com</a>><br>Subject: [X3D-Ecosystem] Fwd: RawKee Update - Implemented a companion export script for x3d.py</p>
<p style="margin:0.1rem 0;line-height:1.0"> </p>
<div dir="auto">Correction.</div>
<div><br>
<div class="gmail_quote">
<div class="gmail_attr" dir="ltr">---------- Forwarded message ---------<br>From: <strong class="gmail_sendername" dir="auto">John Carlson</strong> <span dir="auto"><<a href="mailto:yottzumm@gmail.com" target="_blank">yottzumm@gmail.com</a>></span><br>Date: Wed, Mar 5, 2025 at 12:44 PM<br>Subject: Fwd: [X3D-Ecosystem] RawKee Update - Implemented a companion export script for x3d.py<br>To: X3D Ecosystem public discussion <<a href="mailto:x3d-ecosystem@web3d.org" target="_blank">x3d-ecosystem@web3d.org</a>></div>
<br><br>
<div dir="auto">There are three container fields for HAnimJoint, ‘skeleton’, ‘children’ (default) and ‘joints’.  I don’t disagree with Joe.</div>
<div>
<div class="gmail_quote">
<div dir="auto"> </div>
<div dir="auto">Until tools ignore the missing joints field, it’s still with us.</div>
</div>
</div>
<div>
<div class="gmail_quote">
<div dir="auto"> </div>
<div dir="auto">John</div>
<div>
<div class="gmail_quote">
<div class="gmail_attr" dir="ltr">On Wed, Mar 5, 2025 at 12:22 PM Joe D Williams <<a href="mailto:joedwil@earthlink.net" rel="noopener" target="_blank">joedwil@earthlink.net</a>> wrote:</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:#cccccc">
<div style="font-family:arial,sans-serif;font-size:12pt;color:#000000">
<p style="margin:0.1rem 0px;line-height:1;font-family:arial,sans-serif">Only the first Joint, root, has containerField 'skeleton'  </p>
<p style="margin:0.1rem 0px;line-height:1;font-family:arial,sans-serif">All other child Joints are containerField 'children' </p>
<p style="margin:0.1rem 0px;line-height:1;font-family:arial,sans-serif"> </p>
<p style="margin:0.1rem 0px;line-height:1;font-family:arial,sans-serif">the keyword 'skeleton' is not a Node, it is a container, a type </p>
<p style="margin:0.1rem 0px;line-height:1;font-family:arial,sans-serif"> </p>
<p style="margin:0.1rem 0px;line-height:1;font-family:arial,sans-serif">Classic</p>
<p style="margin:0.1rem 0px;line-height:1;font-family:arial,sans-serif"> </p>
<p style="margin:0.1rem 0px;line-height:1;font-family:arial,sans-serif"> skeleton [<br>    DEF Joe_HumanoidRoot ...Joint ...</p>
<p style="margin:0.1rem 0px;line-height:1;font-family:arial,sans-serif"> ]</p>
<p style="margin:0.1rem 0px;line-height:1;font-family:arial,sans-serif"> </p>
<p dir="auto" style="margin:0.1rem 0px;line-height:1;font-family:arial,sans-serif">xml</p>
<p style="margin:0.1rem 0px;line-height:1;font-family:arial,sans-serif"><Joint  DEF='Joe_HumanoidRoot' ...  containerField='skeleton'  </p>
<p style="margin:0.1rem 0px;line-height:1;font-family:arial,sans-serif"> </p>
</div>
HAnimHumanoid is a node, not a type. 
<p style="margin:0.1rem 0px;line-height:1">  </p>
<p style="margin:0.1rem 0px;line-height:1">Joe</p>
<p style="margin:0.1rem 0px;line-height:1"> </p>
<div style="border-left-width:1px;border-left-style:solid;box-sizing:border-box;padding:10px 0px 10px 15px;margin:0px;border-left-color:#aaaaaa">
<p>-----Original Message-----<br>From: X3D Ecosystem public discussion <<a href="mailto:x3d-ecosystem@web3d.org" rel="noopener" target="_blank">x3d-ecosystem@web3d.org</a>><br>Sent: Mar 5, 2025 10:06 AM<br>To: John Carlson <<a href="mailto:yottzumm@gmail.com" rel="noopener" target="_blank">yottzumm@gmail.com</a>><br>Cc: Bergstrom, Aaron <<a href="mailto:aaron.bergstrom@und.edu" rel="noopener" target="_blank">aaron.bergstrom@und.edu</a>>, X3D Ecosystem public discussion <<a href="mailto:x3d-ecosystem@web3d.org" rel="noopener" target="_blank">x3d-ecosystem@web3d.org</a>><br>Subject: Re: [X3D-Ecosystem] RawKee Update - Implemented a companion export script for x3d.py</p>
<p style="margin:0.1rem 0px;line-height:1"> </p>
<div>
<p class="MsoNormal">I suppose I could do a quick check to see if the root node in the ‘skeleton’ field has DEF=’somestring’ defined. And if so, and only then perform the flip.</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">That would make it more portable.</p>
<p class="MsoNormal"> </p>
<div style="border-width:1pt medium medium;border-style:solid none none;padding:3pt 0in 0in;border-color:#e1e1e1 currentcolor currentcolor">
<p class="MsoNormal"><strong>From:</strong> John Carlson <<a href="mailto:yottzumm@gmail.com" rel="noopener" target="_blank">yottzumm@gmail.com</a>> <br><strong>Sent:</strong> Wednesday, March 5, 2025 11:50 AM<br><strong>To:</strong> Bergstrom, Aaron <<a href="mailto:aaron.bergstrom@und.edu" rel="noopener" target="_blank">aaron.bergstrom@und.edu</a>><br><strong>Cc:</strong> X3D Ecosystem public discussion <<a href="mailto:x3d-ecosystem@web3d.org" rel="noopener" target="_blank">x3d-ecosystem@web3d.org</a>><br><strong>Subject:</strong> Re: [X3D-Ecosystem] RawKee Update - Implemented a companion export script for x3d.py</p>
</div>
<p class="MsoNormal"> </p>
<div>
<p class="MsoNormal">Just to be aware, if skeleton comes before joints, then this code would flip them.  You need to compare jIdx to sIdx before flipping them, AFAIK.  I realize that you’ve ordered them properly elsewhere.</p>
</div>
</div>
</div></blockquote></div></div></div></div></div></div></div><div style="border-left:1px solid #aaa;box-sizing:border-box;padding:10px 0 10px 15px;margin:0"><div><div class="gmail_quote"><div><div class="gmail_quote"><div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:#cccccc">
<div style="border-left-width:1px;border-left-style:solid;box-sizing:border-box;padding:10px 0px 10px 15px;margin:0px;border-left-color:#aaaaaa">
<div>
<div>
<p class="MsoNormal"> </p>
</div>
<div>
<p class="MsoNormal"> </p>
</div>
<div>
<div>
<div>
<p class="MsoNormal">On Wed, Mar 5, 2025 at 10:57 AM Bergstrom, Aaron <<a href="mailto:aaron.bergstrom@und.edu" rel="noopener" target="_blank">aaron.bergstrom@und.edu</a>> wrote:</p>
</div>
<blockquote style="border-width:medium medium medium 1pt;border-style:none none none solid;padding:0in 0in 0in 6pt;margin-left:4.8pt;margin-right:0in;border-color:currentcolor currentcolor currentcolor #cccccc">
<div>
<div>
<p class="MsoNormal"> </p>
<p class="MsoNormal">if nType == "HAnimHumanoid":</p>
<p class="MsoNormal" style="text-indent:0.5in">jIdx = -1</p>
<p class="MsoNormal" style="text-indent:0.5in">sIdx = -1</p>
<p class="MsoNormal" style="text-indent:0.5in">for idx in range(len(mNodeList)):</p>
<p class="MsoNormal" style="margin-left:0.5in;text-indent:0.5in">if mNodeList[idx] == "joints":</p>
<p class="MsoNormal" style="margin-left:1in;text-indent:0.5in">jIdx = idx</p>
<p class="MsoNormal" style="margin-left:0.5in;text-indent:0.5in">elif mNodeList[idx] == "skeleton":</p>
<p class="MsoNormal" style="margin-left:1in;text-indent:0.5in">sIdx = idx</p>
<p class="MsoNormal" style="margin-left:0.5in;text-indent:0.5in">if sIdx != -1 and jIdx != -1:</p>
<p class="MsoNormal" style="margin-left:1in;text-indent:0.5in">mNodeList[jIdx] = "skeleton"</p>
<p class="MsoNormal" style="margin-left:1in;text-indent:0.5in">mNodeList[sIdx] = "joints"</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"> </p>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</div>
<p style="margin:0.1rem 0px;line-height:1"> </p>
</blockquote>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

<p style="margin:0.1rem 0;line-height:1.0"> </p></blockquote></div></div>