Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 5 of 5

Thread: Getting positions and rotations for a limb?

  1. #1
    Junior Member Newbie
    Join Date
    May 2011
    Posts
    26

    Getting positions and rotations for a limb?

    Pseudo code below:
    Code :
    glPushMatrix();
    glRotatef(100,1,0,0);;
    glRotatef(50,0,1,0);
    glRotatef(100,1,0,0);
    glTranslatef(x0,y0,z0);
    glCallList(dl0);
     
    glPushMatrix();
    glRotatef(50,1,0,0);;
    glRotatef(50,0,1,0);
    glRotatef(50,1,0,0);
    glTranslatef(x1,y1,z1);
    glCallList(dl1);
     
    glPushMatrix();
    glRotatef(50,1,0,0);;
    glRotatef(100,0,1,0);
    glRotatef(50,1,0,0);
    glTranslatef(x2,y2,z2);
    glCallList(dl2);
    Relative to 0, how would I determine the translation and rotation value for the last Display List in this series, if I were exporting it like a scene? If there were no rotations, I would just add all of the translations up, but when a rotation is performed, it is a different story. Is there a quick and simple way to get that translation value relative to the origin and the rotation value that I need to use so it is also rotated the same way as when called this way? Like if I were editing the vertex data of something to be rotated and placed just like in the OpenGL window after the pushes, rotations, and translations? Thank you!

  2. #2
    Senior Member OpenGL Guru Dark Photon's Avatar
    Join Date
    Oct 2004
    Location
    Druidia
    Posts
    3,125
    Quote Originally Posted by Flotonic View Post
    Pseudo code below:[CODE]...how would I determine the translation and rotation value for the last Display List in this series, if I were exporting it like a scene?
    Do the transforms with the matrix stack, then query back the matrix. The translation is in the last column. The upper-left 3x3 are the rotation matrix (orthonormal basis vectors). Decompose into whatever form you want to represent the rotation transform in.

  3. #3
    Junior Member Newbie
    Join Date
    May 2011
    Posts
    26
    Thank you so much for your response, Dark Photon! It is now getting the correct translations, but rotations are another thing. I am getting the matrix with the following code:
    Code :
    GLint matrix[16]; glGetIntegerv(GL_MODELVIEW_MATRIX,matrix);
    I have been searching for hours but have still yet to find a function that decomposes the matrix to X, Y, Z Euler angles. Do you happen to have any code from a project of yours that happens to do this that you can share, or is there a way to get the final rotation by doing some sort of calculations with the previous rotations? Thanks again!

  4. #4
    Senior Member OpenGL Guru Dark Photon's Avatar
    Join Date
    Oct 2004
    Location
    Druidia
    Posts
    3,125
    GLint matrix[16]???

    Think you mean GLfloat matrix[16] and glGetFloatv().

  5. #5
    Junior Member Newbie
    Join Date
    May 2011
    Posts
    26
    Thanks! It is now a little closer! Some of the rotations are correct while others are wrong. Do you think it may have something to do with axis ordering?
    Code :
    GLfloat matrix[16];
    glGetFloatv(GL_MODELVIEW_MATRIX,matrix);
    float xR, yR, zR;
    EulerAnglesFromMatrix(&xR,&yR,&zR,matrix);
    #define RADTODEG (M_PI/180)
    xR/=RADTODEG;
    yR/=RADTODEG;
    zR/=RADTODEG;
    Function:
    Code :
    void EulerAnglesFromMatrix(float *attitude, float *heading, float *bank, GLfloat *mat) {
         if ( mat[6] > 0.998 || mat[6] < -0.998 ) {
             *heading = atan2( -mat[8], mat[0] );
             bank = 0;
         } else {
             *heading = atan2( mat[2], mat[10] );
             *bank = atan2( mat[4], mat[5] );
         }     *attitude = asin( mat[6] );
    }

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •