Hello PD list !<div><br></div><div>My first message here !</div><div><br></div><div>I have a little problem and I need some of your logic, because I&#39;ve took my project from paper scratch to the end pd patch like I thought it should, but obviously it&#39;s not working right !</div>

<div><br></div><div>So I got a kinect ... keeewl ! I managed to install it on Ubuntu then on Pure Data with pix_openni, thanks to Matthias ! </div><div><br></div><div>I want to calculate the angles of rotations of each joints of the skeleton in order to apply it on a 3D character rig. I just want the rotations, no translations, because the guy in front of camera might not have the same proportions as the model, I just want to reproduce the rotation of the angles !</div>

<div><br></div><div>Now I&#39;m gona tell you what I do, and if one know what&#39;s wrong ... please tell me :) I&#39;m writting in normal code so it&#39;s clearer here</div><div><br></div><div>That&#39;s what I do first to get each angle in degree</div>

<div><br></div><div>function getAngle(AB,BC) {</div><div><br></div><div><span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">AC = sqrt((AB*AB)+(BC*BC));</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">BD = AC - AB;</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">angle</span> <span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">= atan(AB/BC)+atan(BD/BC)</span></div>

<div><span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">angle</span> = <span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">(</span>
<span style="font-size:13px;font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;background-color:rgb(245,245,255)">angle</span> <span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">*180/PI)*2</span> <font face="verdana, geneva, lucida, lucida grande, arial, helvetica, sans-serif"><br>

</font></div><div><span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">return angle%360;</span></div><div><br></div><div>}</div>

<div><br class="Apple-interchange-newline">_X = getAngle(<span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif">(hand.x-</span>
shoulder <span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif">.x),</span><span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif">(</span>
<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">hand</span> <span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif">.y-</span>
shoulder <span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif">.y)</span><span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif"> </span>);</div>

_Y = getAngle(<span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif">(</span>
<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">hand</span> <span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif">.x-</span>
shoulder <span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif">.x),</span><span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif">(</span>
<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">hand</span> <span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif">.z-</span>
shoulder <span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif">.z)</span><span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif"> </span>);
<br class="Apple-interchange-newline">_Z = getAngle(<span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif">(</span>
<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">hand</span> <span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif">.y-</span>
shoulder <span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif">.y),</span><span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif">(</span>
<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">hand</span> <span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif">.z-</span>
shoulder <span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif">.z)</span><span style="font-size:13px;background-color:rgb(245,245,255);font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif"> </span>);<div>

<br></div><div>When _X, _Y and _Z are applied to the rotation values of a cube, it&#39;s kinda matching with X and Y but when I plug Z it goes really weird.</div><div>After some readings, I found out about Gimbal Lock. So I&#39;ve read this 
<a href="http://www.cs.princeton.edu/~gewang/projects/darth/stuff/quat_faq.html#Q26">http://www.cs.princeton.edu/~gewang/projects/darth/stuff/quat_faq.html#Q26</a> wich is great info !</div><div>And I used the sources they give, simplified them to do just what I wan, and translated it in PD graphical language. I checked many time every calculation so it&#39;s same result as the original sources of the link above. The degrees seems to be transformed correctly, but when applied to my cube, still not matching moves !!! Brrrrr ....</div>

<div><br></div><div>Other fact I don&#39;t know how to take, when I compare the results of the sources from the link above to the one on a online calculator euler-&gt;quaternion-&gt;euler, I have different results in one case, if abc(C) &gt; 0.005, when Y angle is almost 90°. But even by translating the source of this online calculator to a PD patch and applying it to my cube, it&#39;s still not right !!</div>

<div><br></div><div>Here is the sources of the gimbal lock fix I use</div><div><br></div><div><span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">RADIANS = 180/3.14159;</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)"><span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">sin_Y = Math.sin(_Y/RADIANS);</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">cos_X = Math.cos(_X/RADIANS);</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">cos_Z = Math.cos(_Z/RADIANS);</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">sin_X = Math.sin(_X/RADIANS);</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">sin_Z = Math.sin(_Z/RADIANS);</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">cos_Y = Math.cos(_Y/RADIANS);</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)"><span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">Y = -Math.asin(-sin_Y);</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">C = Math.cos(Y);</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">Y *= RADIANS;</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)"><span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">if (Math.abs(C) &gt; 0.005) {</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)"><span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">RX = (cos_X*cos_Y)/ C</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">RY = -(-sin_X*cos_Y)/ C</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)"><span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">X = Math.atan2(RY,RX);</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">X *= RADIANS;</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)"><span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">RX = (cos_Y*cos_Z)/ C</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">RY = -(-cos_Y*sin_Z)/ C</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)"><span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">Z = Math.atan2(RY,RX);</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">Z *= RADIANS;</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)"><span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">}else{</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)"><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">X = 0;</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<br><span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">RX = ((sin_X*sin_Y)*sin_Z)+(cos_X*cos_Z); </span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">RY = -(sin_X*sin_Y)*cos_Z+cos_X*sin_Z;</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)"><span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">Z = Math.atan2(RX,RY);</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">Z *= RADIANS;</span><br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">

<br style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)"><span style="font-family:verdana,geneva,lucida,&#39;lucida grande&#39;,arial,helvetica,sans-serif;font-size:13px;background-color:rgb(245,245,255)">}</span>
</div><div><br></div><div>If anyone can tell me what&#39;s wrong would be great, I&#39;m really stuck, but still looking for solutions everywhere, so I&#39;ll keep you updated, and hopefully share the patch when it&#39;s finished :)</div>

<div><br></div><div>thanks for reading,</div><div><br></div><div>cheers </div>