TODO : Remove redundant argument, use fovy, aspect, near, far http://www.geeks3d.com/20090729/howto-perspective-projection-matrix-in-opengl/
valueType aspect = 6.0 / 9.0; valueType[ 6 ] cp = cperspective( 60f, aspect, 1f, 100f ); assert( cp[ 4 ] == 1.0f ); assert( cp[ 5 ] == 100.0f ); assert( cp[ 0 ] == - cp[ 1 ] ); assert(( cp[ 0 ] < - 0.38489f ) && ( cp[ 0 ] > - 0.38491f )); assert( cp[ 2 ] == - cp[ 3 ] ); assert(( cp[ 2 ] < - 0.577349f ) && ( cp[ 2 ] > - 0.577351f )); assert( mat4.perspective( 60.0, aspect, 1.0, 100.0 ) == mat4.perspective( cp[ 0 ], cp[ 1 ], cp[ 2 ], cp[ 3 ], cp[ 4 ], cp[ 5 ] )); float[ 4 ][ 4 ] m4p = mat4.perspective( 60.0, aspect, 1.0, 100.0 ).data; assert(( m4p[ 0 ][ 0 ] < 2.598077f ) && ( m4p[ 0 ][ 0 ] > 2.598075f )); assert( m4p[ 0 ][ 2 ] == 0.0f ); assert(( m4p[ 1 ][ 1 ] < 1.732052 ) && ( m4p[ 1 ][ 1 ] > 1.732050 )); assert( m4p[ 1 ][ 2 ] == 0.0f ); assert(( m4p[ 2 ][ 2 ] < - 1.020201 ) && ( m4p[ 2 ][ 2 ] > - 1.020203 )); assert(( m4p[ 3 ][ 2 ] < - 2.020201 ) && ( m4p[ 3 ][ 2 ] > - 2.020203 )); assert(( m4p[ 2 ][ 3 ] < - 0.90000f ) && ( m4p[ 2 ][ 3 ] > - 1.10000f )); float[ 4 ][ 4 ] m4pi = mat4.inversePerspective( 60.0, aspect, 1.0, 100.0 ).data; assert(( m4pi[ 0 ][ 0 ] < 0.384901 ) && ( m4pi[ 0 ][ 0 ] > 0.384899 )); assert( m4pi[ 0 ][ 3 ] == 0.0f ); assert(( m4pi[ 1 ][ 1 ] < 0.577351 ) && ( m4pi[ 1 ][ 1 ] > 0.577349 )); assert( m4pi[ 1 ][ 3 ] == 0.0f ); assert( m4pi[ 3 ][ 2 ] == - 1.0f ); assert(( m4pi[ 2 ][ 3 ] < - 0.494999 ) && ( m4pi[ 2 ][ 3 ] > - 0.495001 )); assert(( m4pi[ 3 ][ 3 ] < 0.505001 ) && ( m4pi[ 3 ][ 3 ] > 0.504999 )); // maybe the next tests should be improved float[ 4 ][ 4 ] m4o = mat4.orthographic( - 1.0f, 1.0f, - 1.0f, 1.0f, - 1.0f, 1.0f ).data; assert( m4o == [ [ 1.0f, 0.0f, 0.0f, 0.0f ], [ 0.0f, 1.0f, 0.0f, 0.0f ], [ 0.0f, 0.0f, - 1.0f, 0.0f ], [ 0.0f, 0.0f, 0.0f, 1.0f ] ] ); float[ 4 ][ 4 ] m4oi = mat4.inverseOrthographic( - 1.0f, 1.0f, - 1.0f, 1.0f, - 1.0f, 1.0f ).data; assert( m4oi == [ [ 1.0f, 0.0f, 0.0f, 0.0f ], [ 0.0f, 1.0f, 0.0f, 0.0f ], [ 0.0f, 0.0f, - 1.0f, 0.0f ], [ 0.0f, 0.0f, 0.0f, 1.0f ] ] ); //TODO: look_at tests
Construct a look at matrix ( 4x4 and floating - point matrices only ).