<div dir="ltr"><div dir="ltr">thanks for noting questions, Joe. this is all resolvable with carefully precise mathematical thinking.<div><br></div><div>some clarifications for HAnim specification:<div><ul><li>x-y-z are an axis</li><li>x-y-z (axis) plus an angle is a rotation</li><li>every rotation is relative to its parent coordinate frame, creating a new coordinate frame</li><li>this is both rendering and animation basis of HAnimJoint hierarchy</li><li>careful reading of HAnimJoint llimit and ulimit field definitions shows that they are a SFVec3f 3-tuple axis constraint,</li><li>careful reading of HAnimJoint limitOrientation shows it allows reorienting limits within an HAnimJoint</li><li>those fields are all defined in spec already, we are trying to work with them as written,</li><li>those fields do not constrain orientation fully, only the axes (pretty curiously insufficient),</li><li>adding minAngle/maxAngle means we can fully constrain a joints orientation.</li></ul><div>some clarifications regarding the two X3D examples passed:</div></div><div><ul><li>CylinderSensor constraints a given axis and allows varying angle,</li><li>the gimbals superimpose 3 independent CylinderSensor rotation angles, in a nested fashion around 3 coordinate frames, to act on a single transformation's coordinate frame,</li><li>multiple labeling and representation approaches are possible, and computable, either for single rotations or nested roll-pitch-yaw rotation about x-y-z axes respectively,</li><li>any single arbitrary axis-angle rotation can be mathematically decomposed and equivalently represented as three simultaneous nested rotations about perpendicular axes (for example roll-pitch-yaw),</li><li>the gimbals example lets you perform any three perpendicular rotations to arrive at a single composed rotation, also showing computed axis-angle values (see console for further data),</li><li>all labeling and representations are different ways of describing a single unique representation.</li><li>these widgets might help us rotate a joint (one at a time please) and show range of motion (ROM) constraints understandably.</li></ul><div>it takes a while to put these concepts together, hope this explains a little better.</div><div><br></div><div>saving grace: whether in real world or in virtual 3d world, any object exists at exactly one location and exactly one orientation, regardless of however you might want to represent that mathematically.</div><div><br></div><div>p.s. am personally glad we are each in one place at one time, oriented in one direction at each time! 🫣</div><div><br></div><div>have fun taking apart and reassembling rotations in X3D and HAnim!</div><div><br></div><div>all the best, Don</div><div><br></div><div><br></div><div><br></div></div></div></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Tue, Aug 12, 2025 at 2:03 PM Joe D Williams <<a href="mailto:joedwil@earthlink.net">joedwil@earthlink.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);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">> <span style="color:rgb(0,0,0);font-family:"Segoe UI";font-size:small;white-space:normal;float:none;display:inline"> roll-pitch-yaw</span> </p>
<p style="margin:0.1rem 0px;line-height:1"> </p>
<p style="margin:0.1rem 0px;line-height:1">that is a different coordinate system than std x3d and glTF, and the gl. </p>
<p style="margin:0.1rem 0px;line-height:1">maybe does not make any dif for gimbal example, just recall that </p>
<p style="margin:0.1rem 0px;line-height:1">std x3d is pitch-yaw-roll.</p>
<p style="margin:0.1rem 0px;line-height:1">Note GeoPose uses coord sys like gimbal example. </p>
<p style="margin:0.1rem 0px;line-height:1"> </p>
<p style="margin:0.1rem 0px;line-height:1">Thanks but I still think we need min and max for 3 axes, all independent. </p>
<p style="margin:0.1rem 0px;line-height:1">I think best to be able to define min for x y z as a single axis-angle value </p>
<p style="margin:0.1rem 0px;line-height:1">and x y z max as a single axis-angle value then tool can find limit values </p>
<p style="margin:0.1rem 0px;line-height:1">from those. </p>
<p style="margin:0.1rem 0px;line-height:1">Thanks and Fun,</p>
<p style="margin:0.1rem 0px;line-height:1">Joe </p>
<p style="margin:0.1rem 0px;line-height:1"> </p>
</div>
<div style="border-left:1px solid rgb(170,170,170);box-sizing:border-box;padding:10px 0px 10px 15px;margin:0px">
<p>-----Original Message-----<br>From: Don Brutzman <<a href="mailto:don.brutzman@gmail.com" target="_blank">don.brutzman@gmail.com</a>><br>Sent: Aug 11, 2025 7:05 PM<br>To: Carol McDonald <<a href="mailto:cemd2@comcast.net" target="_blank">cemd2@comcast.net</a>>, Joe D Williams <<a href="mailto:joedwil@earthlink.net" target="_blank">joedwil@earthlink.net</a>>, Richard F. Puk <<a href="mailto:puk@igraphics.com" target="_blank">puk@igraphics.com</a>><br>Cc: <<a href="mailto:h-anim@web3d.org" target="_blank">h-anim@web3d.org</a>>, X3D Public Mailing List <<a href="mailto:x3d-public@web3d.org" target="_blank">x3d-public@web3d.org</a>><br>Subject: Gimbals and ArbitraryAxisCylinderSensor rotation examples</p>
<p style="margin:0.1rem 0px;line-height:1"> </p>
<div dir="ltr">
<div style="margin:0px;min-width:0px;padding:0px 0px 20px;width:auto;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:medium">
<div>
<div id="m_3231199305946770708gmail-:86" style="direction:ltr;margin:8px 0px 0px;padding:0px;font-size:0.875rem;overflow-x:hidden">
<div id="m_3231199305946770708gmail-:87" style="direction:ltr;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:small;line-height:1.5;font-family:Arial,Helvetica,sans-serif;overflow:auto hidden">
<div dir="ltr">
<div dir="ltr"><span style="font-family:"Segoe UI"">Here are the roll-pitch-yaw rotation examples we explored during today's call. Useful widgets.</span>
<div><span style="font-family:"Segoe UI""> </span></div>
<div><span style="font-family:"Segoe UI""><span style="font-family:"Segoe UI"">General index link for gimbals example:<br></span></span>
<ul>
<li style="margin-left:15px"><strong><em>X3D Example Archives: </em></strong><strong>Basic, Distributed Interactive Simulation, Gimbals<br></strong></li>
<li style="margin-left:15px"><a href="https://www.web3d.org/x3d/content/Basic/DistributedInteractiveSimulation/GimbalsIndex.html" rel="noopener" target="_blank"><strong>https://www.web3d.org/x3d/content/Basic/DistributedInteractiveSimulation/GimbalsIndex.html</strong></a></li>
<li style="margin-left:15px"><a href="https://www.web3d.org/x3d/content/Basic/DistributedInteractiveSimulation/GimbalsExampleX_ITE.png" rel="noopener" target="_blank">https://www.web3d.org/x3d/content/Basic/DistributedInteractiveSimulation/GimbalsExampleX_ITE.png</a></li>
</ul>
<span style="font-family:"Segoe UI""><span style="font-family:"Segoe UI"">General index link for cylinder sensor example:<br></span></span>
<ul>
<li style="margin-left:15px"><strong><em>X3D Example Archives: </em></strong><strong>Savage, Tools, Animation, Arbitrary Axis Cylinder Sensor Examples<br></strong></li>
<li style="margin-left:15px"><a href="https://savage.nps.edu/Savage/Tools/Animation/ArbitraryAxisCylinderSensorExamplesIndex.html" rel="noopener" target="_blank"><strong>https://savage.nps.edu/Savage/Tools/Animation/ArbitraryAxisCylinderSensorExamplesIndex.html</strong></a><strong> </strong> </li>
<li style="margin-left:15px">(<a href="https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/content/examples/Savage/Tools/Animation/ArbitraryAxisCylinderSensorExamples.rotated.png" rel="noopener" target="_blank">sourceforge copy</a>)</li>
<li style="margin-left:15px">(forked archive soon to migrate to <a href="http://web3d.org/" rel="noopener" target="_blank">web3d.org</a> so future url addresses will change)</li>
</ul>
</div>
<div><span style="font-family:"Segoe UI"">Hopefully these illustrate why I think it is possible for us to control and constrain rotations to predefine Range of Motion (ROM) in an HAnimJoint. As ever, implementation and evaluation is necessary.</span></div>
<div><span style="font-family:"Segoe UI""> </span></div>
<div><span style="font-family:"Segoe UI"">This is slightly analagous to the joint widgets in the amazing video that Aaron shared.</span></div>
<div>
<ul>
<li style="margin-left:15px"><span style="font-family:"Segoe UI"">antCGi Rigging & Animation Tools Preview</span></li>
<li style="margin-left:15px"><span style="font-family:"Segoe UI""><a href="https://youtu.be/CY7TKtalFaQ?t=62" rel="noopener" target="_blank">https://youtu.be/CY7TKtalFaQ?t=62</a></span><strong style="font-family:"Segoe UI""> </strong></li></ul></div>
<div><span style="font-family:"Segoe UI""><strong>Suggested implementation approach, next steps:</strong></span></div>
<div><span style="font-family:"Segoe UI""><strong>- </strong>use the Cylinder Sensor approach, which is a prototype, with a single </span><span style="font-family:"Segoe UI"">humanoid</span><span style="font-family:"Segoe UI""> joint</span></div>
<div><span style="font-family:"Segoe UI"">- get comfortable with that, maybe the Red Box roll, Green </span></div>
<div><span style="font-family:"Segoe UI"">- i turn the gimbals model into a reusable prototype as well</span></div>
<div><span style="font-family:"Segoe UI"">- we hook that up as yet-another way to animate a humanoid joint too</span></div>
<div><span style="font-family:"Segoe UI"">- then figure out good ways to illustrate HAnimJoint minAngle/maxAngle range of motion (ROM) examples.</span></div>
<div><span style="font-family:"Segoe UI""> </span></div>
<div><span style="font-family:"Segoe UI"">Onward we go... Have fun with X3D and HAnim! 😀</span></div>
<div><span style="font-family:"Segoe UI""> </span></div>
<div><span style="font-family:"Segoe UI"">all the best, Don</span></div>
<div><span style="font-family:"Segoe UI""> </span></div>
</div>
<div> </div>
<div> </div>
</div>
<div> </div>
</div>
</div>
<div id="m_3231199305946770708gmail-:7w" style="font-size:0.875rem;margin:15px 0px;clear:both">
<div style="width:608px;border-top:1px dotted rgb(216,216,216)"> </div>
<div style="width:1px;height:1px;overflow:hidden">Attachments area</div>
<div id="m_3231199305946770708gmail-:7q"></div>
<div id="m_3231199305946770708gmail-:7v" style="padding-top:16px"><span style="display:block;float:left;margin:0px 0px 16px 16px;height:120px;width:180px"><span style="display:block;float:left;margin:0px 0px 16px 16px;height:120px;width:180px"><a style="color:rgb(34,34,34);text-decoration-line:none;display:inline-block;height:120px;width:180px;overflow:hidden;outline:none" role="link" href="https://www.youtube.com/watch?v=CY7TKtalFaQ&t=62&authuser=0" rel="noopener" target="_blank"><span id="m_3231199305946770708gmail-:1i2" style="width:1px;height:1px;overflow:hidden">Preview YouTube video antCGi Rigging & Animation Tools Preview</span></a></span></span>
<div aria-hidden="true">
<div style="background-image:initial;background-position:initial;background-size:initial;background-repeat:initial;background-origin:initial;background-clip:initial;margin:auto"> </div>
<div style="overflow:visible;height:0px;border-top:1px solid rgb(229,229,229)">
<div style="width:0px;height:118px;border-left:1px solid rgb(229,229,229)"> </div>
</div>
<div style="overflow:hidden"><img id="m_3231199305946770708gmail-:1hz" style="opacity: 1; border: none; margin: auto; max-width: 120%; min-width: 100%;" src="https://i.ytimg.com/vi/CY7TKtalFaQ/hqdefault.jpg">
<div id="m_3231199305946770708gmail-:1gz" style="background-color:rgba(0,0,0,0.4);border-top:none">
<div style="float:left;display:flex;height:32px;width:32px"><img id="m_3231199305946770708gmail-:1h1" style="width: 16px; height: 16px; border: none;" src="https://ssl.gstatic.com/docs/doclist/images/mediatype/icon_2_youtube_x16.png"></div>
<div style="overflow:hidden">
<div>
<div style="overflow:hidden;text-overflow:ellipsis;color:rgb(119,119,119);font-size:12px;font-weight:bold;line-height:16px;margin-right:32px;margin-top:8px"> </div>
</div>
</div>
</div>
</div>
<div style="height:20px;width:20px;border-right:20px solid transparent">
<div id="m_3231199305946770708gmail-:1i4" style="width:0px;height:0px;opacity:0.5;border:10px solid rgb(119,119,119)"></div>
</div>
</div>
<span style="display:block;float:left;margin:0px 0px 16px 16px;height:120px;width:180px"><a id="m_3231199305946770708gmail-:7p" style="color:rgb(34,34,34);text-decoration-line:none;display:inline-block;height:120px;width:180px;overflow:hidden;outline:none" role="link" href="https://www.youtube.com/watch?v=CY7TKtalFaQ&t=62&authuser=0" rel="noopener" target="_blank"></a></span>
<div style="height:0px;overflow:hidden;clear:both"> </div>
</div>
</div>
<div style="clear:both"> </div>
</div>
</div>
</div>
</div>
<p style="margin:0.1rem 0px;line-height:1"> </p></blockquote></div></div>