Determining the current coordinate-system's 'handedness'

This may be of use to some. I just had to figure this out in order to ensure I’m performing the correct face culling. Face culling is based on the face’s winding direction (clockwise/ccw) and handedness affects this order.

I figured I could determine handedness by checking the current scale vector to see the number of negative vs positive components. If I have one axis in the negative, then we’re left-handed, if I have two, right-handed, three, left handed, and if they’re all positive then it is by default right-handed. So by multiplying the 3 components of the scale vector together, we can see if the total number of negative numbers is odd or even.

This is a simple idea but it’s not so simple to know the scale vector at any given moment. There is a complex process know as matrix decomposition which can extract translation, rotation, and scale given the gl model-view matrix.

Luckily, oF’s matrix4x4 class has decomposition built in, amazing!

So here’s how it all works:

  
  
    GLfloat modl[16];  
    glGetFloatv( GL_MODELVIEW_MATRIX, modl); // get the current modelview matrix  
      
    ofVec3f scale,t;  
    ofQuaternion a,b; // throw-away variables, we only care about scale  
      
    //decompose the modelview  
    ofMatrix4x4(modl).decompose(t, a, scale, b);   
    if(scale.x*scale.y*scale.z > 0)  
        ;//right handed world!  
    else  
        ;//left handed world!  
  

assuming that the matrix decomposition algorithm oF uses can reliably extract the scale, which is apparently quite hard to do, this should always work.

I am so glad I don’t have to write a matrix decomposition routine, thanks OF!