返回

OpenGL 基础变化综合练习实践总结

IOS

OpenGL 学习(七):基础变化综合练习实践总结

OpenGL,一个强大的图形库,以其在 3D 渲染和图形编程领域的广泛应用而闻名。为了加深对 OpenGL 的理解,实践是必不可少的。本文将重点介绍 OpenGL 中基础变化的综合练习,从理论基础到代码实现,一步步解析 OpenGL 变化的奥秘。

基础变化:改变几何图形的外观

OpenGL 中的基础变化包括平移、旋转和缩放,通过这些变化,我们可以控制几何图形在 3D 空间中的位置和大小。

  • 平移(Translation): 将几何图形在 x、y 或 z 轴上移动一定距离。
  • 旋转(Rotation): 绕 x、y 或 z 轴旋转几何图形。
  • 缩放(Scaling): 改变几何图形的大小,使之放大或缩小。

变换矩阵

变换矩阵是几何图形变化的一种数学工具。它是一个 4x4 矩阵,其中前三列表示 x、y 和 z 轴上的平移,第四列表示缩放因子。通过矩阵乘法,我们可以将变换矩阵应用到几何图形的顶点坐标上,从而实现几何图形的变化。

代码实现

// 平移
glm::mat4 translateMat = glm::translate(glm::mat4(1.0f), glm::vec3(0.5f, 0.5f, 0.0f));

// 旋转
glm::mat4 rotateMat = glm::rotate(glm::mat4(1.0f), glm::radians(90.0f), glm::vec3(0.0f, 1.0f, 0.0f));

// 缩放
glm::mat4 scaleMat = glm::scale(glm::mat4(1.0f), glm::vec3(2.0f, 2.0f, 2.0f));

// 组合变换
glm::mat4 combinedMat = translateMat * rotateMat * scaleMat;

通过矩阵乘法,我们可以将平移、旋转和缩放的变化组合起来,实现更复杂的几何图形变化。

综合练习:立方体旋转与缩放

为了巩固基础变化的理解,我们进行一个综合练习:绘制一个立方体,并实现其旋转和缩放。

步骤:

  1. 创建立方体顶点数据: 定义立方体的 8 个顶点坐标。
  2. 创建变换矩阵: 根据需要创建平移、旋转和缩放的变换矩阵。
  3. 应用变换: 将变换矩阵应用到立方体的顶点坐标上。
  4. 绘制立方体: 使用顶点数据和着色器绘制立方体。

代码示例:

// 顶点数据
float vertices[] = {
    // 前
    -0.5f, -0.5f,  0.5f,
     0.5f, -0.5f,  0.5f,
     0.5f,  0.5f,  0.5f,
    -0.5f,  0.5f,  0.5f,
    // 后
    -0.5f, -0.5f, -0.5f,
     0.5f, -0.5f, -0.5f,
     0.5f,  0.5f, -0.5f,
    -0.5f,  0.5f, -0.5f,
    // 上
    -0.5f,  0.5f,  0.5f,
     0.5f,  0.5f,  0.5f,
     0.5f,  0.5f, -0.5f,
    -0.5f,  0.5f, -0.5f,
    // 下
    -0.5f, -0.5f,  0.5f,
     0.5f, -0.5f,  0.5f,
     0.5f, -0.5f, -0.5f,
    -0.5f, -0.5f, -0.5f,
    // 左
    -0.5f,  0.5f,  0.5f,
    -0.5f,  0.5f, -0.5f,
    -0.5f, -0.5f, -0.5f,
    -0.5f, -0.5f,  0.5f,
    // 右
     0.5f,  0.5f,  0.5f,
     0.5f,  0.5f, -0.5f,
     0.5f, -0.5f, -0.5f,
     0.5f, -0.5f,  0.5f
};

// 更新变换矩阵
glm::mat4 translateMat = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -5.0f));
glm::mat4 rotateMat = glm::rotate(glm::mat4(1.0f), glm::radians(45.0f), glm::vec3(0.0f, 1.0f, 0.0f));
glm::mat4 scaleMat = glm::scale(glm::mat4(1.0f), glm::vec3(1.0f, 1.0f, 1.0f));

// 组合变换矩阵
glm::mat4 combinedMat = translateMat * rotateMat * scaleMat;

// 更新顶点坐标
for (int i = 0; i < 32; i += 3) {
    glm::vec4 vertex(vertices[i], vertices[i + 1], vertices[i + 2], 1.0f);
    vertex = combinedMat * vertex;
    vertices[i] = vertex.x;
    vertices[i + 1] = vertex.y;
    vertices[i + 2] = vertex.z;
}

// 绘制立方体
glDrawArrays(GL_QUADS, 0, 36);

总结

通过 OpenGL 的基础变化,我们可以灵活地控制几何图形在 3D 空间中的位置、方向和大小。通过理解变换矩阵的概念,我们可以将平移、旋转和缩放的变化组合起来,实现更复杂的几何图形变化。通过实践练习,我们可以加深对 OpenGL 变化的理解,为构建更复杂、更逼真的 3D 场景奠定坚实的基础。

附录