美文网首页
变换:向量和矩阵

变换:向量和矩阵

作者: Gaolex | 来源:发表于2016-05-22 08:33 被阅读221次

主要使用了:

  • 矩阵构造(平移、旋转、综合变换)
  • 模型视图矩阵
  • 三角形批次类(创建花托)
  • 投影矩阵(透视投影)

示例程序绘制了一个在屏幕中间旋转的线框花托。

// ModelviewProjection.cpp
// OpenGL SuperBible
// Demonstrates OpenGL the ModelviewProjection matrix
// Program by Richard S. Wright Jr.
#include <GLTools.h>    // OpenGL toolkit
#include <GLMatrixStack.h>
#include <GLFrame.h>
#include <GLFrustum.h>
#include <GLGeometryTransform.h>
#include <GLBatch.h>
#include <StopWatch.h>

#include <math.h>
#ifdef __APPLE__
#include <glut/glut.h>
#else
#define FREEGLUT_STATIC
#include <GL/glut.h>
#endif


// Global view frustum class
//使用GLFrustum类来设置透视投影
GLFrustum           viewFrustum;

// The shader manager
//着色器管理器
GLShaderManager     shaderManager;

// The torus
//三角形批次类
GLTriangleBatch     torusBatch;


// Set up the viewport and the projection matrix
//设置视图和投影矩阵
void ChangeSize(int w, int h)
    {
    // Prevent a divide by zero
    //防止h变为0
    if(h == 0)
        h = 1;
    
    // Set Viewport to window dimensions
    //设置视口窗口尺寸
    glViewport(0, 0, w, h);
    //SetPerspective函数的参数是一个从顶点方向看去的视场角度(用角度值表示)
    //宽度和高度的比值和从近剪切面到原件切面的距离
    viewFrustum.SetPerspective(35.0f, float(w)/float(h), 1.0f, 1000.0f);
    }


// Called to draw scene
//调用场景
void RenderScene(void)
    {
    // Set up time based animation
    //设置时间为基础的动画
    static CStopWatch rotTimer;
    float yRot = rotTimer.GetElapsedSeconds() * 60.0f;
    
    // Clear the window and the depth buffer
    //清除窗口和深度缓冲区
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // Matrix Variables
    //矩阵变量
    M3DMatrix44f mTranslate, mRotate, mModelview, mModelViewProjection;
    
    // Create a translation matrix to move the torus back and into sight
    //创建一个平移矩阵来移动这个圆环面
    m3dTranslationMatrix44(mTranslate, 0.0f, 0.0f, -2.5f);
    
    // Create a rotation matrix based on the current value of yRot
    //创建一个基于yrot值的旋转矩阵
    m3dRotationMatrix44(mRotate, m3dDegToRad(yRot), 0.0f, 1.0f, 0.0f);
    
    // Add the rotation to the translation, store the result in mModelView
    //加上旋转的位移,结果存储在mmodelview
    m3dMatrixMultiply44(mModelview, mTranslate, mRotate);
    
    // Add the modelview matrix to the projection matrix, 
    // the final matrix is the ModelViewProjection matrix.
    //添加模型视图矩阵的投影矩阵,  最后的矩阵是modelviewprojection矩阵。
    m3dMatrixMultiply44(mModelViewProjection, viewFrustum.GetProjectionMatrix(),mModelview);
        
    // Pass this completed matrix to the shader, and render the torus
    //把这个已完成的矩阵传递给着色,并渲染这个圆环面
    GLfloat vBlack[] = { 0.0f, 0.0f, 0.0f, 1.0f };
    shaderManager.UseStockShader(GLT_SHADER_FLAT, mModelViewProjection, vBlack);  
    torusBatch.Draw();


    // Swap buffers, and immediately refresh
    //交换缓冲区,并立即刷新
    glutSwapBuffers();
    glutPostRedisplay();
    }

// This function does any needed initialization on the rendering
// context. 
//此函数在渲染上下文中需要初始化任何初始化。
void SetupRC()
    {
    // Black background
    glClearColor(0.8f, 0.8f, 0.8f, 1.0f );

    glEnable(GL_DEPTH_TEST);

    shaderManager.InitializeStockShaders();
  
    // This makes a torus
    gltMakeTorus(torusBatch, 0.4f, 0.15f, 30, 30);

    //用于控制多边形的显示方式
    //表示物体的所有面向面用线段显示
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    }


///////////////////////////////////////////////////////////////////////////////
// Main entry point for GLUT based programs
int main(int argc, char* argv[])
    {
    gltSetWorkingDirectory(argv[0]);//设置当前工作目录
    
    glutInit(&argc, argv);//传输命令行参数并初始化GLUT库

    //使用双缓冲窗口和使用RGBA颜色模式
    //GLUT_DEPTH位标志将一个深度缓冲区分配为显示的一部分,因此我们可以执行深度测试
    // GLUT_STENCIL确保我们也会有一个可用的模板缓冲区
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
    glutInitWindowSize(800, 600);//窗口大小
    glutCreateWindow("ModelViewProjection Example");//窗口标题
    glutReshapeFunc(ChangeSize);//改变窗口大小的回调函数
    glutDisplayFunc(RenderScene);//OpenGL渲染代码
        
    //初始化glew库  
    GLenum err = glewInit();
    if (GLEW_OK != err) {
        fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
        return 1;
        }
    
    SetupRC();//RC代表渲染环境(Rendering Context)
    
    glutMainLoop();//主消息循环  
    return 0;
    }

运行结果:

ModelviewProjection

相关文章

  • 线性代数

    向量--> 矩阵和矩阵变换

  • 线性代数的几何理解

    矩阵:由基组成,表示标准基变换后的基列向量:基矩阵乘法:矩阵乘向量:矩阵变换作用于某向量;矩阵乘矩阵:两次线性变化...

  • 变换:向量和矩阵

    主要使用了: 矩阵构造(平移、旋转、综合变换) 模型视图矩阵 三角形批次类(创建花托) 投影矩阵(透视投影) 示例...

  • 向量 矩阵 矩阵变换

    1. 向量 1.1 向量基本介绍 说道这里就涉及到一些数学知识了,不要害怕,我会结合实际的空间来说,高等数学中关于...

  • 矩阵和矩阵的相乘_线性代数_day15

    矩阵在图像变换中的应用 矩阵乘法的定义 矩阵和矩阵的相乘,就是分成每一个矩阵和向量的相乘 矩阵A的列数必须和矩阵B...

  • OpenGL 向量 矩阵 变换

    向量 单位向量 标量:只有大小,例如:1,2,3...向量:既有大小又有方向。单位向量:向量长度(向量的模)为1的...

  • 基变换

    在同一个向量空间中的不同的基下进行坐标变换,就是基变换。完成基变换的矩阵,叫做过渡矩阵。 过渡矩阵定义定义.PNG...

  • 3.矩阵和列表

    ①变换向量在数据库或矩阵中的顺序 将第四列gene向量变成第一列 矩阵创建,查看矩阵行列数,矩阵取子集,矩阵行列置...

  • 第27课 复数矩阵和快速傅里叶变换

    当向量和矩阵是复数时,求两个复向量的内积 傅里叶复数矩阵,特殊的快速傅里叶变换(简称FFT) 在计算机经常用到,特...

  • 线性代数启示录(一)

    线性代数的内容包含向量空间,子空间,内积空间,线性变换,矩阵理论,特征值和特征向量,二次型等等,矩阵论因其广泛应用...

网友评论

      本文标题:变换:向量和矩阵

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