美文网首页
OpenGL -- 变化和矩阵堆栈

OpenGL -- 变化和矩阵堆栈

作者: 木扬音 | 来源:发表于2021-09-12 21:44 被阅读0次
    image.png

    视图变换

    • 应用到场景中的第一种变换,用来确定场景中的有利位置,在默认情况下,透视投影中位于原点(0,0,0),并沿着 Z 轴负方向进行观察
    • 试图变换将观察者放在你希望的任何位置,并允许在任何方向上观察场景,确定视图变换就像在场景中放置观察者并让它指向某一位置
    • 通过moveForward调整观察者位置
    • 从大局上考虑,在应用任何其他模型变换之前,必须先应用视图变换,视图变换移动了当前工作的坐标系,后续的变化都会基于新坐标系进行

    模型变换

    用于操纵模型与其中某特定变换,通过旋转、缩放、平移将对象移动到指定位置

    • 模型变换中,两个变换的顺序是不能交换的,交换后的矩阵相乘结果不一样
    image.png

    投影

    • 正投影 void SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax)
    • 透视投影 void SetPerspective(float fFov, float fAspect, float fNear, float fFar)

    矩阵堆栈

    程序全局只有一个矩阵堆栈,但是需要绘制的图形有多种 即 变化有很多种--每个图形所需的变换矩阵不同,如果想两个图形的操作互不影响,需要一个矩阵状态去保存空白的状态

    • 原始矩阵堆栈中,拷贝一份栈顶矩阵,压入栈顶
    • 当有变换操作时,将变换操作的矩阵与矩阵堆栈栈顶相乘,将其结果覆盖栈顶矩阵
    • 如果还有其他矩阵入栈,则继续相乘
    • 当没有矩阵需要push,即图形绘制完成后,需要pop栈顶矩阵
    image.png

    仿射变换

    矩阵堆栈中有与平移、旋转、缩放三个模型变换相对应的放射变换,可以不用通过模型变换,而是直接通过矩阵堆栈的API实现这3种变换,如下表所示 image.png

    角色帧

    主要是用来表示物体及观察者所处的位置,主要有三个参数

    //  vOrigin:当前所处的位置,默认是(0,0,0),处于原点
    // vForward:即将要去的位置,默认是(0,0,-1),朝向-z轴方向
    //  vUp:朝向哪,默认是(0,1,0),朝向+y轴方向
    class GLFrame
        {
        protected:
            M3DVector3f vOrigin;    // Where am I?
            M3DVector3f vForward;   // Where am I going?
            M3DVector3f vUp;        // Which way is up?
    

    除了矩阵,GLFrame对象也可以直接压入矩阵堆栈,主要涉及以下3个方法

    • 加载到堆栈栈顶 void GLMatrixStack::LoadMatrix(GLFrame &frame);
    • 与堆栈栈顶相乘,将结果覆盖栈顶矩阵 void GLMatrixStack::MultMatrix(GLFrame &frame);
    • 堆栈栈顶出栈 void GLMatrixStack::PushMatrix(GLFrame &frame);

    相关文章

      网友评论

          本文标题:OpenGL -- 变化和矩阵堆栈

          本文链接:https://www.haomeiwen.com/subject/zamtgltx.html