<html xmlns:v="urn:schemas-microsoft-com:vml" 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=us-ascii"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@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:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-GB link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoPlainText>Hi Joe,<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Great summary and references. However, one of the references you listed is incorrect. You wrote:<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><span style='color:#0070C0'>Schlag, 1994] John Schlag. Using geometric constructions to interpolate orientation with quaternions. Graphics Gems IV, pages 230-236, 1994.</span><o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>In fact, the article by John Schlag you are referring to is:<o:p></o:p></p><p class=MsoPlainText><span style='color:#0070C0'>John Schlag. “Using Geometric Constructions to Interpolate Orientation with Quaternions”. In Graphics Gems II, Academic Press, 1991, pp. 377–380. <o:p></o:p></span></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Consulting Graphic Gems IV, pages 230-236, there is an article "Fiber Bundle Twist Reduction", by Ken Shoemake at that location.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Regards,<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Roy<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText> <o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><span lang=EN-US style='mso-fareast-language:EN-GB'>-----Original Message-----<br>From: h-anim [mailto:h-anim-bounces@web3d.org] On Behalf Of Joe D Williams<br>Sent: 11 November 2016 01:30<br>To: X3D Graphics public mailing list <x3d-public@web3d.org>; Humanoid Animation (H-Anim) Working Group <h-anim@web3d.org><br>Subject: [h-anim] Basic Animataion data</span></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>glossary:<o:p></o:p></p><p class=MsoPlainText>Transform rotation value<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>* Euler angle - typical mocap-derived<o:p></o:p></p><p class=MsoPlainText>  animation data = x,y,z<o:p></o:p></p><p class=MsoPlainText>     (x,y,z = degrees)<o:p></o:p></p><p class=MsoPlainText>Mocap data represents:<o:p></o:p></p><p class=MsoPlainText>  * Bone or Segment orientation<o:p></o:p></p><p class=MsoPlainText>      or<o:p></o:p></p><p class=MsoPlainText> * parent Joint rotation<o:p></o:p></p><p class=MsoPlainText>Either interpretation represents<o:p></o:p></p><p class=MsoPlainText> same animation<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>* matrix = axis-angle = x,y,z,a<o:p></o:p></p><p class=MsoPlainText>     x,y,z = radians,<o:p></o:p></p><p class=MsoPlainText>     a = scale factor<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>X3D Default<o:p></o:p></p><p class=MsoPlainText>Easy to hand-edit<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>* Unit quaternion = w,x,y,z<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>      w+x+y+z = 1 = unit q<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Most common authoring tool internal and transport form Easy to add unit quats for realtime interpolated animation Can use hand-edit as  w=scale factor and x,y,z are axes  if careful to maintain uq<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>* Standards-Track Lossless conversion between forms.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>First, please notice that this Animation data is aimed at describing keyframe animation of a set of hierarchal "Joint" nodes.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Animation data is provided as arrays of:<o:p></o:p></p><p class=MsoPlainText>keyframe root position data,<o:p></o:p></p><p class=MsoPlainText>keyframe rotation data for each joint,<o:p></o:p></p><p class=MsoPlainText>number of keyframes,<o:p></o:p></p><p class=MsoPlainText>target key time frame interval<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>The data is used by defining the root position and each joint rotation at each key time. For film and video there is often no need for a list of key times indexed to each keyvalue because the frame interval is fixed.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Notice that typically, there is no consideration for non-monotonic key times, although it is highly unlikely to encounter an X3D browser that does not allow non-monotonic key times. Why, allow non-monotonic key times? Because it is usually convenient for the author to consider each joint individually and individually define the interval between associated keyvalue data points, and to minimize the actual number of key times and thus keyvalues.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>At this time, in order for an X3D HAnim to use most types of mocap data it would only be required:<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>1. Connect the joint names<o:p></o:p></p><p class=MsoPlainText>2. Convert the input data form to axis-angle, 3, Construct the interpolators and timers for each joint<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>This style of animation depends mainly or solely on application of individual rotations to individual joints in a set of hierarchal 'Joint' nodes at each key time to produce the keyframe. Current best practice for this style of animation uses unit quaternions due to efficiency. Even though the most throughly complete technical solution remains axis-angle matrix transformations, the unit quats are easy to transport and used natively in many animation creation and development tools.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>So, the choice of gltf to only transport quaternions should cause X3D and HAnim to address the idea of built-in quaternion support. As is well-shown, the maths of these three forms are well defined and conversion interactions are well understood.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>* At this time we are creating prototype support for BVH x,y,z ffps import, it seems only reasonable to encourage import of both Euler angle and unit quaternion forms.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Background<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Quaternions, Interpolation and Animation Erik B. Dam Martin Koch Martin Lillholm <a href="mailto:erikdam@diku.dk"><span style='color:windowtext;text-decoration:none'>erikdam@diku.dk</span></a> <a href="mailto:myth@diku.dk"><span style='color:windowtext;text-decoration:none'>myth@diku.dk</span></a> <a href="mailto:grumse@diku.dk"><span style='color:windowtext;text-decoration:none'>grumse@diku.dk</span></a> Technical Report DIKU-TR-98/5 Department of Computer Science University of Copenhagen Universitetsparken 1<o:p></o:p></p><p class=MsoPlainText>DK-2100 Kbh Denmark<o:p></o:p></p><p class=MsoPlainText>July 17, 1998<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Interesting Material.<o:p></o:p></p><p class=MsoPlainText>I have a copy of a pdf.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Appendix A - Conventions<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Coordinate system<o:p></o:p></p><p class=MsoPlainText>(slightly reworded by me to aim at X3D and HAnim)<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>X3D and HAnim use a right-handed coordinate system. In computer graphics some use a left-handed coordinate system. This allows the z-axis to point "into" the screen which seems natural for some styles of authoring.  However, since X3D primarily uses coordinates for animations driven by mathematical derivations and for Humanoid animations, VRML and X3D have chosen to use the mathematical standard, the right-handed coordinate system.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Rotation.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>This means that the default Humanoid pose gaze is facing +z.<o:p></o:p></p><p class=MsoPlainText>The +z axis for the character points "out" of the screen,<o:p></o:p></p><p class=MsoPlainText>+y is up,<o:p></o:p></p><p class=MsoPlainText>and +x is towards the character's left, viewer's right.<o:p></o:p></p><p class=MsoPlainText>The default X3D viewpoint is oriented to look toward -z.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>The direction of positive, or increasing rotation about an axis is obtained by the right-hand rule:<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Hold the axis with right hand and the thumb pointing in the positive direction of the axis.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Adding positive rotation will rotate in the direction of the fingers.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>It just happens that HAnim Joint rotations can be vizualized in terms of x=pitch, y=yaw, and z=roll.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Again, hold the Joint, as if you were holding the appropriate axis with right hand and the thumb pointing in the positive direction of the axis.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>A positive rotation will rotate the Joint and move child hierarchies in the direction your fingers are wrapped around the axis.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>For instance, consider a roll (positive z-axis) animation of a Joint, as would be appropriate for HAnim right hand fingers from the default pose.. The fingers are pointing down and thumb pointing toward +z. To move the fingers as if grasping the z-axis, rotate the finger joint(s) to increase their z-axis rotation.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Amazingly enough, this results in the character's right hand wrapping around the z-axis with the thumb pointed +z, and illustrates the right-hand rule perfectly.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Incidentally, this means that to get proper orientation for a gaze from the 'standard' eyeball location, then you can yaw the viewpoint <o:p></o:p></p><p class=MsoPlainText>+pi radians.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Transport Animations<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>In order to transport animations between 'standard' H-Anim characters, <o:p></o:p></p><p class=MsoPlainText>to accomplish the HAnim 'standard' initial pose prior to animation the <o:p></o:p></p><p class=MsoPlainText>Joint is defined to be at X3D default orientation, +z is out of the <o:p></o:p></p><p class=MsoPlainText>screen, +y is up, and +x is towards the character's left.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>The default initial value for all Joints:<o:p></o:p></p><p class=MsoPlainText>X3D axis-angle (matrix) form is 0 0 1 0<o:p></o:p></p><p class=MsoPlainText>and for unit quatenions is 1 0 0 0<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>An illustration:<o:p></o:p></p><p class=MsoPlainText>[standard X3D default transformations<o:p></o:p></p><p class=MsoPlainText>X3D coordinate axes]<o:p></o:p></p><p class=MsoPlainText>z (+ out toward viewer)<o:p></o:p></p><p class=MsoPlainText>y (+ up)<o:p></o:p></p><p class=MsoPlainText>x (+ character's left)<o:p></o:p></p><p class=MsoPlainText>Rotation about z brings x into y<o:p></o:p></p><p class=MsoPlainText>Rotation about y brings z into x<o:p></o:p></p><p class=MsoPlainText>Rotation about x brings y into z<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText> Schlag, 1994] John Schlag.<o:p></o:p></p><p class=MsoPlainText>Using geometric constructions to<o:p></o:p></p><p class=MsoPlainText>interpolate orientation with quaternions.<o:p></o:p></p><p class=MsoPlainText>Graphics Gems IV, pages 230-236, 1994.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>[Shoemake & Du<o:p></o:p></p><p class=MsoPlainText>, 1994] Ken Shoemake & Tom Du<o:p></o:p></p><p class=MsoPlainText>. Matrix animation and <o:p></o:p></p><p class=MsoPlainText>polar decomposition.<o:p></o:p></p><p class=MsoPlainText><a href="ftp://ftp.cis.upenn.edu/pub/graphics/shoemake/polar-decomp.ps.Z"><span style='color:windowtext;text-decoration:none'>ftp://ftp.cis.upenn.edu/pub/graphics/shoemake/polar-decomp.ps.Z</span></a>, 1994.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Shoemake, 1994b] Ken Shoemake. Quaternions. <o:p></o:p></p><p class=MsoPlainText><a href="ftp://ftp.cis.upenn.edu/pub/graphics/-"><span style='color:windowtext;text-decoration:none'>ftp://ftp.cis.upenn.edu/pub/graphics/-</span></a><o:p></o:p></p><p class=MsoPlainText>shoemake/quatut.ps.Z, 1994.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Thanks and Best,<o:p></o:p></p><p class=MsoPlainText>Joe <o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>_______________________________________________<o:p></o:p></p><p class=MsoPlainText>h-anim mailing list<o:p></o:p></p><p class=MsoPlainText><a href="mailto:h-anim@web3d.org"><span style='color:windowtext;text-decoration:none'>h-anim@web3d.org</span></a><o:p></o:p></p><p class=MsoPlainText><a href="http://web3d.org/mailman/listinfo/h-anim_web3d.org"><span style='color:windowtext;text-decoration:none'>http://web3d.org/mailman/listinfo/h-anim_web3d.org</span></a><o:p></o:p></p></div></body></html>