变换管线

来源:互联网 发布:钻石儿童玩具淘宝网 编辑:程序博客网 时间:2024/06/11 20:11

变换管线如何处理模型视图矩阵和投影矩阵的。


     首先,我们的顶点将被视为一个1X4矩阵,其中前3个值为X,Y和Z坐标。第4个数字是一个缩放因子,如果需要的话我们可以手动进行设置。这就是w坐标,通常在默认情况下为1.0,我们很少会真正去直接修改这个值。然后,顶点将乘以模型视图矩阵,生成变换的视觉坐标。随后,视觉坐标在乘以投影矩阵,生成裁剪坐标。裁剪坐标随后再除以w坐标,生成规范化设备坐标。其中w值可能会被投影矩阵或模型视图矩阵修改,这取决于所发生的变换。透视除法将作为图元装配过程的一部分进行。最后,坐标三元组通过视口变换映射到2D平面上。这项操作也是由一个矩阵来表示的,但不能直接指定或者修改这个矩阵。OpenGL将在内部根据指定的glViewport值来设置这个矩阵。 

    P114  图4.29


--------------- 使用矩阵堆栈

    在分层方式中,一个或多个对象会相对于另一个对象进行绘制,在这种方式中经常会应用到变换。这样就会需要大量代码进行构造和管理矩阵在3D空间中建立复杂的场景。

    习惯上,我们会使用一个矩阵堆栈来帮助完成这些工作,math3d有个实用类GLMatrixStack.

    构造函数

    GLMatrixStack::GLMatrixStack(int iStackDepth = 64);  //默认的堆栈深度为64

   通过调用在顶部载入这个单位矩阵

    GLMatrixStack::LoadIdentity(void);

    或者可以在堆栈的顶部载入任何矩阵

    void GLMatrixStack::LoadMatrix(const M3DMatrix44f m);


    可以用一个矩阵乘以矩阵堆栈的顶部矩阵,相乘得到的结果随后将存储在堆栈的顶部

    void GLMatrixStack:: MultMatrix(const M3DMatrix44f);


    用GetMatrix 函数获得矩阵堆栈顶部的值,

    仅仅获得顶部矩阵的副本

    const  M3DMatrix44f & GLMatrixStack::GetMatrix(void);

    void GLMatrixStack::GetMatrix(M3DMatrix44f mMatrix);


-----------压栈和出栈

        

      void GLMatrixStack::pushMatrix(void);

      void PushMatrix(const M3DMatrix44f   mMatrix);

      void PushMatrix(GLFrame frame);

      void GLMatrixStack::PopMatrix(void);

      

  压栈 复制了当前的矩阵值,并将新的值放入了堆栈的顶部。类似的,PopMatrix 将移除顶部矩阵,并恢复下面的值

  除了将当前矩阵堆栈之外,通过M3DMatrix44f数据类型或者GLFrame类,还可以将任意一个矩阵压入到堆栈的顶部。


------------ 仿射变换

    void GLMatrixStack::Rotate(GLfloat angle,GLfloat x,GLfloat y ,GLfloat z);

    void GLMatrixStack::Translate(GLfloat x,GLfloat y,GLfloat z);

    void GLMatrixStack::Scale(GLfloat x ,GLfloat y ,GLfloat z);


Rotate函数接受角度值而不是弧度值。所有这3个函数都可以创建恰当矩阵,然后这个矩阵乘以矩阵堆栈顶部的元素,实际上就是对当前矩阵添加矩阵添加变换。



------------ 管理管线

     GLGeometryTransform为我们跟踪记录模型视图投影矩阵和正规矩阵,并快速检索模型视图投影矩阵或正规矩阵堆栈的顶部。

    例子代码:http://download.csdn.net/detail/u012419410/7858307



------------加点调料

    


0 0
原创粉丝点击