理解OpenGL中的模型视图矩阵变换

理解OpenGL中的模型视图矩阵变换

对于学习OpenGL,或者其他的API,基础的矩阵变换是最重要的。矩阵变换是重中之重。

下面就拿红皮书上的最简单的demo:cube.c来说。

调用函数 glMatrixMode (GL_MODELVIEW);指定修改模型视图矩阵,以后调用glLoadIdentity ();   将当前的矩阵置为单位矩阵,有利于后面的运算。

下面我们假设将对创建的模型glutWireCube (1.0); 进行平移,缩放,旋转(就绕x轴吧),

按照OpenGL提供的语句只需要调用

// 将模型移动到z轴的-5.0位置,此时相机位于原点,
// 与gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);的效果一样,
// 移动的相对性.
glTranslated( 0.0 0.0 - 5.0 );
glScaled(
1.0 2.0 1.0 );
glRotated(
20 .,  1.0 0.0 0.0 );  // x为旋转轴

其实在OpenGL内部的实现就是将相应的变换矩阵与当前的矩阵(已经被glLoadIdentity置为了单位矩阵)相乘,所以下面我们就利用OpenGL提供的函数:glMultMatrixf(const GLFloat* m )实现相同的效果。此时必须注意:在OpenGL中矩阵是列优先或者说列主序指定的矩阵,所以是行优先表示下的转置矩阵。

至于这些矩阵怎么得出来的,随便打开一本计算机图形学的书籍,里面都会有齐次坐标和矩阵变换的讲解。

下面是用矩阵实现的代码,可以测试,效果一样。

     // 注意OpenGL里面的矩阵是:转置矩阵
     float  TransMatrix[ 16 ] = {
        
1 .,  0 .,  0 .,  0 .,
        
0 .,  1 .,  0 .,  0 .,
        
0 .,  0 .,  1 .,  0 .,
        
0 .,  0 .,  - 5 .,  1.0
     }
;
     glMultMatrixf(TransMatrix);

    
float  ScaleMatrix[ 16 ] = {
        
1 .,  0 .,  0 .,  0 .,
        
0 .,  2 .,  0 .,  0 .,
        
0 .,  0 .,  1 .,  0 .,
        
0 .,  0 .,  0 .,  1.0
     }
;
     glMultMatrixf(ScaleMatrix);

    
float  RotateMatrix[ 16 ] = {
        
1 .,  0 .,  0 .,  0 .,
        
0 ., cos( 20 .), sin( 20 .),  0 .,
        
0 .,  - sin( 20 .), cos( 20 .),  0 .,
        
0 .,  0 .,  0 .,  1.0
     }
;
     glMultMatrixf(RotateMatrix);

上面用的是三个矩阵, 其实一个矩阵就一步就实现,就是先计算上面的三个矩阵的乘积,经过计算的矩阵如下:

     float  FinalMatrix[ 16 ] = {
        
1.000000 ,   0.000000 ,   0.000000 ,   0.000000 ,
        
0.000000 ,   0.816164 ,   0.912945 ,   0.000000 ,
        
0.000000 ,   - 1.825891 ,   0.408082 ,   0.000000 ,
        
0.000000 ,   0.000000 ,   - 5.000000 ,   1.000000
     }
;
     glMultMatrixf(FinalMatrix);
三种实现最终的效果一样。

你可能感兴趣的:(理解OpenGL中的模型视图矩阵变换)