计算机图形学作业( 三):使用openGL画一个立方体,并实现平移、旋转和放缩变换

article/2025/8/8 12:39:19

计算机图形学作业( 三):使用openGL画一个立方体,并实现平移、旋转和放缩变换

  • 题目
  • 引入GLM库
  • 画立方体
    • 模型、观察和投影
    • 修改着色器
    • 立方体的顶点
    • 深度测试
  • 立方体变换
    • 平移
    • 旋转
    • 放缩
  • 渲染管线的理解
  • 代码

题目

在这里插入图片描述

引入GLM库

利用 openGL 进行 3D 绘图需要用到大量的数学矩阵运算,而 OpenGL 没有自带任何的矩阵和向量知识,需要我们自己定义数学类和函数,这相对比较麻烦。所以我们需要引入 GLM 库,GLM 能快速帮助我们实现各种数学矩阵运算。

前往 GLM官方github仓库,选择0.9.8.5版本,下载该版本的 glm-0.9.8.5.zip 或 glm-0.9.8.5.zip 压缩包,解压之后,在项目里引用以下文件即可:

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

画立方体

模型、观察和投影

利用 openGL 进行 3D 绘图时,首先要定义一个模型矩阵 model,这个矩阵包含了对 3D 物体的位移、缩放与旋转操作。这个模型矩阵创建如下:

glm::mat4 model;
model = glm::rotate(model, glm::radians(-55.0f), glm::vec3(1.0f, 0.0f, 0.0f));

然后,我们需要创建一个观察矩阵,因为我们创建的 3D 物体默认在世界坐标的原点(0, 0, 0),而摄像机的位置也是(0, 0, 0),所以,为了能看清楚3D物体的全貌,我们必须向前移动整个场景,这就是观察矩阵的作用。

在 openGL 中,世界坐标系的坐标表示为(x, y, z),分别对应下图位置:

在这里插入图片描述

注意,将摄像机向后移动,和将整个场景向前移动是一样的。这里我们将场景向 z 轴的负方向移动,以便于摄像机能观察到物体。

glm::mat4 view;
view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));

最后我们需要做的是定义一个投影矩阵。我们希望在场景中使用透视投影,所以像这样声明一个投影矩阵:

glm::mat4 projection;
projection = glm::perspective(glm::radians(45.0f), screenWidth / screenHeight, 0.1f, 100.0f);

修改着色器

我们创建了模型、观察和投影矩阵,应该把它们传入着色器,着色器的修改如下:

const char* vertexShaderSource = "#version 330 core\n""layout (location = 0) in vec3 aPos;\n""layout (location = 1) in vec3 aColor;\n""out vec3 ourColor;\n""uniform mat4 model;\n""uniform mat4 view;\n""uniform mat4 projection;\n""void main()\n""{\n""gl_Position = projection * view * model * vec4(aPos, 1.0);\n""ourColor = aColor;\n""}\0";

然后再程序中获取 uniform 变量,并赋值

//获取着色器程序uniform
unsigned int modelLoc = glGetUniformLocation(shaderProgram, "model");
unsigned int viewLoc = glGetUniformLocation(shaderProgram, "view");
unsigned int projectionLoc = glGetUniformLocation(shaderProgram, "projection");
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, &view[0][0]);
glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, &projection[0][0]);

立方体的顶点

要想渲染一个立方体,我们一共需要36个顶点(6个面 x 每个面有2个三角形组成 x 每个三角形有3个顶点),顶点如下:

float vertices[] = {-0.5f, -0.5f, -0.5f,  0.0f, 0.0f,0.5f, -0.5f, -0.5f

http://chatgpt.dhexx.cn/article/9ZGsQBW3.shtml

相关文章

一文掌握基于深度学习的自动驾驶小车开发(Pytorch实现,含完整数据和源码,树莓派+神经计算棒)

目录 一 . 基本介绍 二、模拟平台安装和基本使用 三、基于OpenCV的自动驾驶控制 3.1基于HSV空间的特定颜色区域提取 3.2基于canny算子的边缘轮廓提取 3.3感兴趣区域定位 3.4基于霍夫变换的线段检测 3.5动作控制&#xff1a;转向角 四、基于深度学习的自动驾驶控制 4.…

OpenGL坐标变换及其数学原理,两种摄像机交互模型(附源程序)

&#xfeff;&#xfeff; 实验平台&#xff1a;win7&#xff0c;VS2010 先上结果截图&#xff08;文章最后下载程序&#xff0c;解压后直接运行BIN文件夹下的EXE程序&#xff09;&#xff1a; a.鼠标拖拽旋转物体&#xff0c;类似于OGRE中的“OgreBites::CameraStyle::CS_ORB…

Python-WingIde各种调试方法

一、 本地从IDE启动文件调试 主要步骤:设置断点,F5开始调试 二、 本地从IDE外启动文件调试 1.) 从WingIDE的安装目录(默认C:\Program Files (x86)\Wing IDE 6.0)复制wingdbstub.py到被调试代码所在目录 2.) 代码中添加importwingdbstub 3.) IDE左下角设置如图 4.) 在…

图形处理单元(GPU)的演进

CPU 和 GPU 好久没有更新了&#xff0c;最近在阅读 CUDA 相关的一些论文&#xff0c;因为都是碎片化阅读&#xff0c;容易导致读过后&#xff0c;可能过一段时间又忘记掉&#xff0c;所以决定抽时间翻译翻译阅读的论文&#xff0c;一方面增强自己记忆&#xff0c;一方面与大家共…

图形学 光栅化 matlab 源代码

实验二&#xff1a;直线的光栅化算法 DDA Bresenham 实验三&#xff1a;圆的光栅化算法 编程实现两种中点画圆算法&#xff0c;第2种算法利用二阶差分方法&#xff1b; 实验四&#xff1a;多边形扫描转换算法 4.1对多边形扫描线填充算法进行简要描述&#xff0c;并给出多边形扫…

图形学入门合集1

Games101作业0 1虚拟机的使用 1.1虚拟机的安装 这里我们使用 Oracle VM VirtualBox 虚拟机。如果你使用 Windows 系统&#xff0c;你可以直接下载[链接](https://download.virtualbo%20%09%09x.org/virtualbox/6.1.4/VirtualBox-6.1.4-136177-Win.exe)&#xff0c;下载完成后…

Recorder︱图像特征检测及提取算法、基本属性、匹配方法

在做图像的研究&#xff0c;发现对图像本质、内核以及可以提取的特征方式一点儿都不懂&#xff0c;赶紧补补课。 . 一、图像常用属性 本节指的是一般来说&#xff0c;图像处理的一些角度&#xff0c;也是根据一些美图软件最为关注的一些图像属性&#xff1a; 基本属性&#…

视觉SLAM十四讲学习笔记-第三讲-相似、仿射、射影变换和eigen程序、可视化演示

专栏系列文章如下&#xff1a; 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-开发环境搭建_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第三讲-旋转矩阵和E…

多视图几何三维重建实战系列之MVSNet

点击上方“3D视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 1. 概述 MVS是一种从具有一定重叠度的多视图视角中恢复场景的稠密结构的技术&#xff0c;传统方法利用几何、光学一致性构造匹配代价&#xff0c;进行匹配代价累积&#xff0c;再估计深度值。虽然传统方法有较…

一文搞懂NSCT(Nonsubsampled Contourlet)变换,matlab程序实现并讲解NSCT_TOOLBOX的使用方法

文章目录 一、前言二、NSCT理论背景三、NSCT图像表述3.1 图像变换综述3.2 非下采样的金字塔分解3.2 非下采样的方向滤波器组分解 四、NSCT的matlab程序实现五、总结5.1 NSCT现存不足5.2 致谢 一、前言 在这篇文章中我将从图像分解领域的发展方面为大家讲解NSCT的出现背景和实现…

视图几何三维重建实战系列之MVSNet

点击上方“3D视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 1. 概述 MVS是一种从具有一定重叠度的多视图视角中恢复场景的稠密结构的技术&#xff0c;传统方法利用几何、光学一致性构造匹配代价&#xff0c;进行匹配代价累积&#xff0c;再估计深度值。虽然传统方法有较…

[模板匹配霍夫变换]——模板匹配分析、霍夫变换分析

一、模板匹配分析 所谓模板匹配&#xff0c;就是在给定的图片中查找和模板最相似的区域&#xff0c;该算法的输入包括模板和图片&#xff0c;整个任务的思路就是按照滑窗的思路不断的移动模板图片&#xff0c;计算其与图像中对应区域的匹配度&#xff0c;最终将匹配度最高的区域…

计算机视觉学习第5章——多视图几何

目录 一、 外极几何 1.1 简单数据集 1.2 用Matplotlib绘制三维数据 1.3 计算F&#xff1a;八点法 1.4 外极点和外极线 二、照相机和三维结构的计算 2.1 三角部分 2.2 由三维点计算照相机矩阵 2.3 由基础矩阵计算照相机矩阵 三、多视图重建 3.1 稳健估计基础矩阵 …

Python计算机视觉——多视图几何

文章目录 第五章 多视图几何5.1 外极几何5.1.1 一个简单的数据集5.1.2 用Matplotlib绘制三维数据5.1.3 计算F&#xff1a;八点法5.1.4 外极点和外极线 5.2 照相机和三维结构的计算5.2.1 三角剖分5.2.2 由三维点计算照相机矩阵5.2.3 由基础矩阵计算照相机矩阵 5.3 多视图重建5.3…

curvelet变换的理解

一、matlab下curvelet工具包配置 首先在curvelet官方网站下载curvelet工具包&#xff0c;解压&#xff0c;其中包含了matlab与C语言两种实现的版本。 打开matlab&#xff0c;点击set path&#xff0c;选择“添加并包含子文件夹”&#xff0c;将有关的matlab代码&#xff0c;即…

java几何画板_geogebra几何画板下载

geogebra几何画板官方版是一款功能十分强大、非常专业的理科几何绘制工具&#xff0c;使用geogebra几何画板官方版您可以在上面画点、向量、线段、直线、多边形、圆锥曲线&#xff0c;甚至是函数以图像的形式呈现到您眼前。geogebra几何画板最新版是款非常不错的软件。 基本简介…

如何远程连接SQL Server数据库

一.设置客户端网络实用工具 点击“开始”&#xff0d;“程序”&#xff0c;在“Microsoft SQL Server”菜单中选择“客户端网络实用工具”。 在“别名”选项中点击“添加”。 在“服务器别名”中&#xff0c;填入您网站域名&#xff0c;在“网络库”区域中点击“TCP/IP”,在…

连接远程Mysql数据库

一、运行环境 数据库&#xff1a;Mysql 数据库所在系统&#xff1a;Linux(Ubuntu) IDE&#xff1a;PyCharm 测试环境&#xff1a;windows10 二、相关配置 1. 切换root用户权限 >> sudo -s2. 修改数据库配置 >> sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf #…

如何配置SQL Server数据库远程连接

本地数据库&#xff08;SQL Server 2012或以上&#xff09; 连接外网服务器的数据库&#xff0c;外网的服务器端需要做如下配置&#xff1a; 1、首先是要打开 数据的配置管理工具 2、配置相关的客户端协议&#xff0c;开启TCP/IP 3、数据库默认的远程端口是 1433&#xff08;不…