zoukankan      html  css  js  c++  java
  • OpenGL学习笔记《五》转换

      转换(Transformations),主要是指位移(Translate),缩放(Scaling),旋转(Rotation)三种,opengl实现这三种转换,主要是通过矩阵的运算来实现的。在这里就会涉及到一定的矩阵、向量的运算了。

      opengl没有提供现成的矩阵、向量运算的库,这个需要我们自己引入第三方的库,在教程中作者是使用到了GLM库,可以在这里下载。

      因为矩阵运算并不满足交换律,所以在这里进行转换的矩阵操作对于运算顺序有要求,需要先缩放(Scaling),再旋转(Rotation),最后再位移(Rotation)。而实际书写过程可能又是这样的顺序:T * R * S,在代码中调用顺序是 T、R、S, 在这里需要注意一下。我们理解/读矩阵组合运算的式子,应该是从右到左的顺序。

      glm提供现成的位移、缩放、旋转的矩阵运算方法,分别为glm::translateglm::scaleglm::rotation,假如我们在这里需要实现一个缩放、旋转、位移的组合操作,我们的代码大概是这样的:

    // 转换矩阵
    glm::mat4 trans = glm::mat4(1.0f);
    // 位移 x轴移动0.5单位,y轴移动-0.5单位
    trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f));
    // 旋转 绕y轴旋转45度
    trans = glm::rotation(trans, glm::radians(45.0f), glm::vec3(0.0f, 1.0f, 0.0f));
    // 缩放 0.5
    trans = glm::scale(trans, glm::vec3(0.5f, 0.5f, 0.5f));

      这是一个组合运算的过程,最终得到一个转换后的矩阵。再将转换好的矩阵传给顶点着色器,就能看到最终的转换效果了。顶点着色器接收转换后的矩阵:

    #version 330 core
    layout (location = 0) in vec3 aPos;
    layout (location = 1) in vec3 aColor;
    layout (location = 2) in vec2 aCoord;
    out vec3 oColor;
    out vec2 oCoord;
    uniform mat4 u_transform;
    void main()
        gl_Position = u_transform * vec4(aPos, 1.0f);
        oColor = aColor;
        oCoord = aCoord;
    }

      GLSL内部也有对应的mat4类型的变量,用来存储传递过来的转换矩阵数据,再将这个乘以顶点坐标,既可以得到转换后的坐标信息。

      赋值uniform部分对应的调整为

    glUniformMatrix4fv(location, 1, GL_FALSE, glm::value_ptr(trans));

      参数1为uniform变量的位置索引,参数4就是我们要传递过来的矩阵数据,glm使用value_ptr方法将glm存储的矩阵格式转换为GLSL使用的格式。

      对应的代码在这里

  • 相关阅读:
    Repo介绍
    =vscode========》快捷键
    linux c延时程序大全
    Linux vi/vim
    =vscode========》实用小技巧
    编程中闰年判断条件
    代码质量的评价标准
    Python如何计算编辑距离?
    python 格式化输出保留一位小数
    字符串拆分 split()方法
  • 原文地址:https://www.cnblogs.com/zhong-dev/p/11649813.html
Copyright © 2011-2022 走看看