HPB rotation to rotation around axis



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 05/11/2003 at 15:51, xxxxxxxx wrote:

    Hi,

    how can I convert rotation of object (obtained using GetRot(), i.e. HPB vector) to rotations around x,y,z axis? I've been trying to do it this way:

    Matrix mrz = Matrix::rotateZ(rz);
            Matrix mry = Matrix::rotateY(ry);
            Matrix mrx = Matrix::rotateX(rx);
            return mrz * mry * mrx;

    where the matrices are 4x4 OpenGL matrices and rotate{X,Y,Z} are rotations around axis X, Y and Z respectively and the argument is in radians. It's same as this sequence of OpenGL calls:

    glRotatef(rad2deg(rz),0,0,1);
            glRotatef(rad2deg(ry),0,1,0);
            glRotatef(rad2deg(rx),1,0,0);

    Is this correct or does Cinema4D use different semantics? I can't make it work...

    Thanks!



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 21/11/2003 at 07:47, xxxxxxxx wrote:

    Why use XYZ rotations? GL directly allows to set a Matrix. (If you still need the rotation thingy, take a look at GraphicsGems 4, they have source code for calculating rotations from a matrix).
    Matrix mg=op->GetMg();
    Real c[16];
    c[0] = mg.v1.x;
    c[1] = mg.v1.y;
    c[2] = mg.v1.z;
    c[3] = 0;
    c[4] = mg.v2.x;
    c[5] = mg.v2.y;
    c[6] = mg.v2.z;
    c[7] = 0;
    c[8] = mg.v3.x;
    c[9] = mg.v3.y;
    c[10] = mg.v3.z;
    c[11] = 0;
    c[12] = mg.off.x;
    c[13] = mg.off.y;
    c[14] = mg.off.z;
    c[15] = 1;
    glLoadMatrixf(c);



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 22/11/2003 at 04:35, xxxxxxxx wrote:

    Quote: _Why use XYZ rotations? GL directly allows to set a Matrix.
    >
    > * * *
    _


    Why, because I need them, I didn't say I'm using OpenGL. Besides, the matrix would still not be usable in OpenGL because c4d uses left-handed coordinate system and OpenGL uses right handed-one.

    I figured it out in the meantime, so in case anybody ever needs something similar, it's like this:
    C4d uses left-handed system. HPB rotation translates to rotation about axes in this way: H is rotation around (0,-1,0) axis (y-axis, the angle is negated), P around (-1,0,0) and B around (0,0-1). Accounting for OpenGL's right-handed system, the rotations will become
    rx = p
    ry = h
    rz = -b
    When applying the rotation, the order is rotY(ry)*rotX(rx)*rotZ(rz)


Log in to reply