zoukankan      html  css  js  c++  java
  • 坐标系统

    我们为上述的每一个步骤都创建了一个变换矩阵:模型矩阵、观察矩阵和投影矩阵。一个顶点坐标将会根据以下过程被变换到裁剪坐标:

    Vclip=MprojectionMviewMmodelVlocalVclip=Mprojection⋅Mview⋅Mmodel⋅Vlocal

    注意矩阵运算的顺序是相反的(记住我们需要从右往左阅读矩阵的乘法)。最后的顶点应该被赋值到顶点着色器中的gl_Position,OpenGL将会自动进行透视除法和裁剪。

    顶点着色器的输出要求所有的顶点都在裁剪空间内,这正是我们刚才使用变换矩阵所做的。OpenGL然后对裁剪坐标执行透视除法从而将它们变换到标准化设备坐标

    OpenGL会使用glViewPort内部的参数来将标准化设备坐标映射到屏幕坐标,每个坐标都关联了一个屏幕上的点(在我们的例子中是一个800x600的屏幕)。这个过程称为视口变换。

    1     //创建一个正射投影矩阵
    2     //前两个参数指定了平截头体的左右坐标,第三四个三叔指定了平截头体的底部和顶部,通过这四个参数我们定义了近平面和远平面的大小
    3     //然后第五个和第六个参数则定义了近平面和远平面的距离,这个投影矩阵会将这些处于这些x, y, z值范围内的坐标变换为标准化设备坐标
    4     glm::ortho(0.0f, 800.0f, 0.0f, 600.0f, 0.1f, 100.0f);
    1 //创建一个透视投影矩阵
    2     //第一个参数定义了fov的值,它表示的是视野(Fiele of View), 并且设置了观察空间的大小,如果想要一个真实的观察效果,它的值通常设置为
    3     //45.0f, 但想要一个末日风格的结果你可以将其设置一个更大的值。
    4     //第二个参数设置了宽高比,有视口的宽除以高所得,
    5     //第三四个参数设置了平头截体的近和远平面,我们通常设置近距离为0.1f, 而远距离设为100.0f, 所有在近平面和远平面内切处于平截头体内的顶点都会被渲染
    6     glm::mat4 proj = glm::perspective(glm::radians(45.0f), (float)width / (float)height, 0.1f, 100.0f);
     1 //创建一个模型矩阵
     2     glm::mat4 model;
     3     model = glm::rotate(model, glm::radians(-55.0f), glm::vec3(1.0f, 0.0f, 0.0f));    //绕x轴旋转-55度
     4 
     5     //创建一个观察矩阵
     6     glm::mat4 view;
     7     view = glm::translate(view, glm::vec3(0.0f, 0.0f,-3.0f));    //注意,我们将矩阵向们要进行移动场景的反方向移动, vec3为转轴
     8 
     9     GLfloat screenWidth = 800;
    10     GLfloat screenHeight = 600;
    11     //创建一个投影矩阵(此处是透视投影)
    12     glm::mat4 projection;
    13 
    14     projection = glm::perspective(glm::radians(45.0f), screenWidth / screenHeight, 0.1f, 100.0f);  //宽高比应与窗口宽高比例一致

    在顶点着色器中分别为三个变换矩阵声明一个uniform,然后将它乘以顶点坐标,注意矩阵运算的顺序是相反的(记住我们需要从右往左阅读矩阵的乘法)Vclip=MprojectionMviewMmodelVlocalVclip=Mprojection⋅Mview⋅Mmodel⋅Vlocal

    1     int modelLoc = glGetUniformLocation(ourShader.ID, "model");
    2         glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
    3 
    4         glUniformMatrix4fv(glGetUniformLocation(ourShader.ID, "view"), 1, GL_FALSE, glm::value_ptr(view));
    5         glUniformMatrix4fv(glGetUniformLocation(ourShader.ID, "projection"), 1, GL_FALSE, glm::value_ptr(projection));

    创建10个立方体

     1 float vertices[] = {
     2         -0.5f, -0.5f, -0.5f,  0.0f, 0.0f,
     3         0.5f, -0.5f, -0.5f,  1.0f, 0.0f,
     4         0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
     5         0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
     6         -0.5f,  0.5f, -0.5f,  0.0f, 1.0f,
     7         -0.5f, -0.5f, -0.5f,  0.0f, 0.0f,
     8 
     9         -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,
    10         0.5f, -0.5f,  0.5f,  1.0f, 0.0f,
    11         0.5f,  0.5f,  0.5f,  1.0f, 1.0f,
    12         0.5f,  0.5f,  0.5f,  1.0f, 1.0f,
    13         -0.5f,  0.5f,  0.5f,  0.0f, 1.0f,
    14         -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,
    15 
    16         -0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
    17         -0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
    18         -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
    19         -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
    20         -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,
    21         -0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
    22 
    23         0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
    24         0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
    25         0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
    26         0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
    27         0.5f, -0.5f,  0.5f,  0.0f, 0.0f,
    28         0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
    29 
    30         -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
    31         0.5f, -0.5f, -0.5f,  1.0f, 1.0f,
    32         0.5f, -0.5f,  0.5f,  1.0f, 0.0f,
    33         0.5f, -0.5f,  0.5f,  1.0f, 0.0f,
    34         -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,
    35         -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
    36 
    37         -0.5f,  0.5f, -0.5f,  0.0f, 1.0f,
    38         0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
    39         0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
    40         0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
    41         -0.5f,  0.5f,  0.5f,  0.0f, 0.0f,
    42         -0.5f,  0.5f, -0.5f,  0.0f, 1.0f
    43     };
    44 
    45     //在一个glm::vec3数组中定义10个立方体的位置
    46     glm::vec3 cubePosition[] = {
    47         glm::vec3(0.0f, 0.0f, 0.0f),
    48         glm::vec3(2.0f, 5.0f, -15.0f),
    49         glm::vec3(-1.5f, -2.2f, -2.5f),
    50         glm::vec3(-3.8f, -2.0f, -12.3f),
    51         glm::vec3(2.4f, -0.4f, -3.5f),
    52         glm::vec3(-1.7f, 3.0f, -7.5f),
    53         glm::vec3(1.3f, -2.0f, -2.5f),
    54         glm::vec3(1.5f, 2.0f, -2.5f),
    55         glm::vec3(1.5f, 0.2f, -1.5f),
    56         glm::vec3(-1.3f, 1.0f, -1.5f)
    57     };
     1     glUniformMatrix4fv(glGetUniformLocation(ourShader.ID, "view"), 1, GL_FALSE, glm::value_ptr(view));
     2          glUniformMatrix4fv(glGetUniformLocation(ourShader.ID, "projection"), 1, GL_FALSE, glm::value_ptr(projection));
     3     glBindVertexArray(VAO);
     4         for (unsigned int i = 0; i < 10; i++)
     5         {
     6             glm::mat4 model;
     7             model = glm::translate(model, cubePosition[i]);
     8             float angle = 20.0f * i;
     9             if (i % 4 == 0)
    10             angle = glfwGetTime() * (25.0f + i * 10) ;
    11             //model = glm::rotate(model, glm::radians(angle), glm::vec3(1.0f, 0.3f, 0.5f));
    12             model = glm::rotate(model, glm::radians(angle), glm::vec3((0.1 * i), 0.3f, 0.05 * i));  //转动立方体,vec3为绕着转动的轴
    13             glUniformMatrix4fv(glGetUniformLocation(ourShader.ID, "model"), 1, GL_FALSE, glm::value_ptr(model));  
    14             glDrawArrays(GL_TRIANGLES, 0, 36);
  • 相关阅读:
    ThinkPhp3.2.3缓存漏洞复现以及修复建议
    thinkphp3.2.3 缓存导致getshell终极解决办法
    phpstudy后门漏洞复现php5.2
    phpStudy后门漏洞利用复现
    SQL语句利用日志写shell拿权限
    针对phpstudy默认设置的利用
    黑暗世界的搜索引擎
    CVE-2019-0708—微软RDP远程桌面代码执行漏洞复现
    记一次渗透某XX站
    通过USB 2.0电缆手动设置内核模式调试
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/9585734.html
Copyright © 2011-2022 走看看