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 3 of 3

Thread: minus swap on sin fx matrix creates working code

  1. #1
    Intern Contributor
    Join Date
    May 2017
    Posts
    80

    minus swap on sin fx matrix creates working code

    Hi,

    I am making some custom matrices with some initial instruction on the Opengl thread. Its mostly turned into a math issue, so I've placed the question here; hope that's ok. My goal was to make the Euler rotational matrices "by hand" which took some additional internet research. In most of the three Euler angle matrices, the matrix only produces identical GLM results if the "-" in front of the sine fx is moved to the other sine fx in the matrix. Both methods and results are posted below. I've found it by empirical testing, not a formal proof. But its the only way it will work.

    Code :
    glm::mat4 rotx(float a) {
        float s = std::sin(a);
        float c = std::cos(a);
        return glm::mat4(
              1.0f,0.0f,0.0f,0.0f,
    		  0.0f, c, -s, 0.0f,
    		  0.0f, s,  c, 0.0f,
    		  0.0f,0.0f,0.0f,1.0f );
    }
    glm::mat4 roty(float a) {
        float s = std::sin(a);
        float c = std::cos(a);
        return glm::mat4(
               c, 0.0f,   s, 0.0f,
            0.0f, 1.0f, 0.0f, 0.0f,
               -s, 0.0f,    c, 0.0f,
            0.0f, 0.0f, 0.0f, 1.0f);
    };
     
    glm::mat4 rotz(float a) {
        float s = std::sin(a);
        float c = std::cos(a);
        return glm::mat4(
              c,-s,0.0f,0.0f,
    		  s,c,0.0f,0.0f,
    		  0.0f,0.0f,1.0f,0.0f,
    		  0.0f,0.0f,0.0f,1.0f );
    };

    GLM result:
    Rotate vector custom fx on x axis:vec4(4.000000, -5.156932, 5.865666, 1.000000)
    Rotate vector by GLM on x axis: vec4(4.000000, 6.699447, -4.014649, 1.000000)

    Rotate vector custom fx on y axis:vec4(6.545196, 5.000000, -3.026618, 1.000000)
    Rotate vector by GLM on y axis: vec4(-5.311184, 5.000000, 4.877635, 1.000000)

    Rotate vector custom fx on z axis:vec4(-4.323152, 4.723384, 6.000000, 1.000000)
    Rotate vector by GLM on y axis: vec4(5.557164, -3.180869, 6.000000, 1.000000)

    If I swap minus sign positions, GLM compares nicely.

    Code :
    glm::mat4 rotx(float a) {
        float s = std::sin(a);
        float c = std::cos(a);
        return glm::mat4(
              1.0f,0.0f,0.0f,0.0f,
    		  0.0f, c, s, 0.0f,
    		  0.0f, -s,  c, 0.0f,
    		  0.0f,0.0f,0.0f,1.0f );
    }
    glm::mat4 roty(float a) {
        float s = std::sin(a);
        float c = std::cos(a);
        return glm::mat4(
               c, 0.0f,   -s, 0.0f,
            0.0f, 1.0f, 0.0f, 0.0f,
               s, 0.0f,    c, 0.0f,
            0.0f, 0.0f, 0.0f, 1.0f);
    };
     
    glm::mat4 rotz(float a) {
        float s = std::sin(a);
        float c = std::cos(a);
        return glm::mat4(
              c,s,0.0f,0.0f,
    		  -s,c,0.0f,0.0f,
    		  0.0f,0.0f,1.0f,0.0f,
    		  0.0f,0.0f,0.0f,1.0f );
    };

    Rotate vector custom fx on x axis:vec4(4.000000, 6.699447, -4.014649, 1.000000)
    Rotate vector by GLM on x axis: vec4(4.000000, 6.699447, -4.014649, 1.000000)

    Rotate vector custom fx on y axis:vec4(-5.311184, 5.000000, 4.877635, 1.000000)
    Rotate vector by GLM on y axis: vec4(-5.311184, 5.000000, 4.877635, 1.000000)

    Rotate vector custom fx on z axis:vec4(5.557164, -3.180869, 6.000000, 1.000000)
    Rotate vector by GLM on y axis: vec4(5.557164, -3.180869, 6.000000, 1.000000)

  2. #2
    Senior Member OpenGL Guru
    Join Date
    Jun 2013
    Posts
    2,519
    Quote Originally Posted by technologist View Post
    I am making some custom matrices with some initial instruction on the Opengl thread. Its mostly turned into a math issue, so I've placed the question here; hope that's ok. My goal was to make the Euler rotational matrices "by hand" which took some additional internet research. In most of the three Euler angle matrices, the matrix only produces identical GLM results if the "-" in front of the sine fx is moved to the other sine fx in the matrix.
    Moved relative to what?

    Bear in mind that GLM's matrix constructors take their arguments in column-major order, so the constructed matrix is transposed relative to how it appears in the code. The first four arguments form the first column of the constructed matrix, the next four the second column, and so on.

    GLM's behaviour is consistent with GLSL and with historical OpenGL behaviour (glLoadMatrix() and glMultMatrix() require data in column-major order, glGetDoublev(GL_MODELVIEW_MATRIX) etc return data in column-major order. Newer versions provide some support for row-major order, but column-major order remains the default.

  3. #3
    Intern Contributor
    Join Date
    May 2017
    Posts
    80
    Quote Originally Posted by GClements View Post
    Moved relative to what?

    Bear in mind that GLM's matrix constructors take their arguments in column-major order, so the constructed matrix is transposed relative to how it appears in the code. The first four arguments form the first column of the constructed matrix, the next four the second column, and so on.

    GLM's behaviour is consistent with GLSL and with historical OpenGL behaviour (glLoadMatrix() and glMultMatrix() require data in column-major order, glGetDoublev(GL_MODELVIEW_MATRIX) etc return data in column-major order. Newer versions provide some support for row-major order, but column-major order remains the default.
    Yes, you're right. The other examples I encountered must have been row-major. The (-) sign was on the sine of the first row. Moving this to the second sin occurrence below it (my wimpy 'relative' term) w/GLM must have been due to the column-major attribute. I looked at 3 x 3 matrices as well and converted them...they were row-major as well.

Posting Permissions

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