计算机图形学 | 实验六:旋转立方体

OpenGL绘制三维彩色立方体并实现自动旋转 北京航空航天大学计算机学院 2020春季计算机图形学课程第二次作业,使用OpenGL绘制三维彩色立方体并实现自动旋转 阅读详情

华中科技大学《计算机图形学》课程

MOOC地址:计算机图形学(HUST)

计算机图形学 | 实验六:旋转立方体

在正式搭建环境之前,我们先来介绍一下读完下面的部分你会了解些什么。

  • 绘制出旋转立方体需要的新知识
  • 认识一些 OpenGL的新功能

接下来,我们来介绍一下绘制旋转立方体。绘制效果如下:

在这里插入图片描述

Z-缓冲

Z-缓存(Z-Buffer):这是一项处理 3D物体深度信息的技术,它对不同物体和同一物体不同部分的当前 Z坐标进行纪录,也就是在 3D环境中,每个像素会利用一组数据资料来定义像素在显示时的纵深度(即 Z轴坐标值)。在进行着色时,对那些在其他物体背后的结构进行消隐,使它们不被显示出来。

在 OpenGL 中,坐标映射到屏幕屏幕空间后,其 z值即最终 z-缓冲的值,只需记录每个屏幕像素点的 z 值,并与当前绘制的片元的 z值进行比对,即可判断物体是否遮挡或被遮挡。实际应用中,我们只需要开启深度测试即可。

glEnable(GL_DEPTH_TEST);

GLM函数库

GLM是 OpenGL Mathematics的缩写,它是一个只有头文件的库,也就是说我们只需包含对应的头文件就行了,不用链接和编译。GLM可以在它们的网站上下载。把头文件的根目录复制到你的 includes文件夹,就可以使用这个库了。使用这个库,好处就在于我们只需要输入特定参数,就可以生成我们需要的矩阵。

PVM矩阵

PVM矩阵即 P:projection;V:view;M:model。其中,model矩阵对应从局部坐标系到世界坐标系的变换,模型矩阵是一种转换矩阵,它能通过对对象进行平移、缩放、旋转来将它置于它本应该在的位置或方向。

view矩阵对应从世界坐标系到观察坐标系的变换,观察坐标系就是从摄像机的角度观察到的坐标系。而这通常是由一系列的平移和旋转的组合来平移和旋转场景从而使得特定的对象被转换到摄像机前面。

projection 矩阵对应从观察坐标系到剪裁空间的变换,它指定了坐标的范围,例如,每个维度都是从-1000到 1000。投影矩阵接着会将在它指定的范围内的坐标转换到标准化设备坐标系中(-1.0,1.0)。所有在在范围(-1.0,1.0)外的坐标都不会被绘制出来并且会被裁剪。由投影矩阵创建的观察区域被称为平截头体,且每个出现在平截头体范围内的坐标都会最终出现在用户的屏幕上。将一定范围内的坐标转化到标准化设备坐标系的过程(而且它很容易被映射到 2D观察空间坐标)被称之为投影,因为使用投影矩阵能将 3维坐标投影到很容易映射的2D标准化设备坐标系中。

一旦所有顶点被转换到裁剪空间,最终的操作——透视划分将会执行,在这个过程中我们将位置向量的 x,y,z分量分别除以向量的齐次 w分量;透视划分是将 4维裁剪空间坐标转换为 3维标准化设备坐标。这一步会在每一个顶点着色器运行的最后被自动执行。 在这一阶段之后,坐标经过转换的结果将会被映射到屏幕空间(由glViewport设置)且被转换成片段。

PVM矩阵的使用

那么如何在实践中使用 pvm矩阵呢,首先我们需要引入 GLM函数库的头文件,我们所需要用到的功能都在这三个头文件中。

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

然后我们需要设置 view矩阵的相关参数。

glm::vec3 camera_position = glm::vec3(0.0f, 0.0f, 3.0f); // 摄像机位置
=glm::vec3 camera_front = glm::vec3(0.0f, 0.0f, -1.0f); // 摄像机方向 
glm::vec3 camera_up = glm::vec3(0.0f, 1.0f, 0.0f); // 摄像机上向量

然后我们需要设置 projection矩阵的视野 fov:

float fov = 45.0f;

进入主循环之后我们先计算 model矩阵,首先我们需要创建一个 model矩阵,然后 glm:translate函数是进行平移变换的矩阵,将物体平移(0.0,0.0,0.0)位置,然后进行旋转,第二个参数为旋转的角度,第三个参数为旋转轴。最后进行缩放 glm::vec3变量的三个值分别代表 x,y,z方向的缩放比例。

glm::mat4 model(1);//model矩阵,局部坐标变换至世界坐标 
model = glm::translate(model, glm::vec3(0.0,0.0,0.0)); 
model = glm::rotate(model, (float)glfwGetTime(), glm::vec3(0.5f, 1.0f, 0.0f)); 
model = glm::scale(model, glm::vec3(1.0f,1.0f,1.0f));

为了得到我们需要的 view矩阵,我们需要先创建一个 mat4 view矩阵,通过 glm中的 rotate函数去计算,第一个是相机的位置,第二个参数是相机所正对的目标的坐标,这里使用 camera_position+camera_front(相机的方向),进行向量的加法之后可以获得相机正对的坐标,第三个参数是相机的上向量。

glm::mat4 view(1);//view矩阵,世界坐标变换至观察坐标系 
view = glm::lookAt(camera_position, camera_position + camera_front, camera_up);

在 GLM中可以这样创建一个透视投影矩阵,它的第一个参数定义了 fov的值,它表示的是视野,并且设置了观察空间的大小。对于一个真实的观察效果,它的值经常设置为 45.0,但想要看到更多结果你可以设置一个更大的值。第二个参数设置了宽高比,由视口的高除以宽。第三和第四个参数设置了平截头体的近和远平面。我们经常设置近距离为 0.1而远距离设为 100.0。所有在近平面和远平面的顶点且处于平截头体内的顶点都会被渲染。

glm::mat4 projection(1);//projection矩阵,投影矩阵 
projection = glm::perspective(glm::radians(fov), (float)screen_width / screen_height, 0.1f, 100.0f);

我们之前的操作都只是得到 model,view和 projection矩阵,但是不能忘记将这三个矩阵传入到着色器,否则着色器是没有办法使用的。

glGetUniformLocation 可以获得某个着色器中参数的位置,第一个参数为着色器 id,第二个参数为该参数的名称。

int model_location = glGetUniformLocation(shader.ID, "model");
// 获取着色器内某个参数的位置

glUniformMatrix4fv是向指定位置传入一个 4X4的矩阵值。通过这两个函数我们将 pvm矩阵传入着色器中。

glUniformMatrix4fv(model_location, 1, GL_FALSE, glm::value_ptr(model));// 写入参数值

最后,在着色器中,对于矩阵的乘法,由于不符合乘法交换律,所以我们应当注意相乘顺序。

gl_Position = projection * view * model * vec4(aPos, 1.0);

整个绘制旋转立方体的程序的新知识点介绍就到此为止,效果如下:

在这里插入图片描述

计算机图形学实验三立体线框模型透视投影 一、实验目的 (1)掌握使用点表和面表构造立方体线框模型的方法。 (2)掌握视点求坐标的计算方法。 (3)掌握立方体线框模型二维透视投影图的绘制方法。 (4)掌握立方体线框模型二维透视投影图的旋转方法。 二、实验步骤 (1)构造三维点CP3类、CP2类、Cline类、Face类 (2)添加成员函数和函数声明 (3)添加函数内容 (4)添加主要函数 voidCTest... 阅读详情

相关推荐

计算机图形学实验

文章目录实验介绍实验内容实验一实验二实验三实验四实验五实验源码 实验介绍 大二学期的计算机图形学课程,内容包含扫描转换算法,裁剪算法,图形变换,三维图形投影和消隐,曲线和曲面;从完成情况来看虽算不上十分出色,但也花了很多时间和精力,代码必然存在一些冗余、不足和待改进之处,故公开和大家交流和参考 实验内容 实验一 (●’◡’●) 效果展示 实验题1-1:绘制任意斜率的直线 实验题1-3:用中点画圆法画圆 实验题1-4:中点画圆法画椭圆 实验题1-5:中点画圆法画圆弧 实

weixin_42815846的博客 6780

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

计算机图形学作业( 三):使用openGL画一个立方体,并实现平移、旋转和放缩变换题目引入GLM库画立方体模型、观察和投影 题目 引入GLM库 利用openGL进行3D绘图需要用到大量的数学矩阵运算,而OpenGL没有自带任何的矩阵和向量知识,需要我们自己定义数学类和函数,这相对比较麻烦。所以我们需要引入GLM库,GLM能快速帮助我们实现各种数学矩阵运算。 前往GLM官方github仓库,选择0...

看门猫的博客 2万+

OpenGL旋转立方体的实现

西电计算机图形学大作业

上善若水 1万+

glUniformMatrix4fv

void glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value) 通过一致变量(uniform修饰的变量)引用将一致变量值传入渲染管线。 location : uniform的位置。 count : 需要加载数据的数组元素的数量或者需要修改的矩阵的数量。 t...

android开发笔记 1万+

孔令德的计算机图形学课程实验

授课总学时64,实验项目学时12  实验一  绘制任意斜率的直线(2学时)        验证性 实验内容:利用中点Bresenham算法,编程实现绘制任意斜率的直线。 基本要求: 1. 掌握中点Bresenham算法的原理和算法; 2. 使用鼠标在屏幕上绘制任意斜率的直线; 实验拓展:彩色直线与反走样直线。   实验二  交互式绘制多边形(2学时)  

klingde的专栏 1万+

计算机图形学-旋转的茶壶

12月31号,跨年的晚上,实在太无聊了,还是敲会代码吧! 可以利用鼠标移动旋转,也可以利用键盘x y z键实现旋转。 下面是效果图。 代码如下。 #include #define GLUT_DISABLE_ATEXIT_HACK #include float theta[] = { 0, 0, 0, 0 }; int axis = 3; float step = 2.0; in

Calm微笑 6241

OpenGL ES之glUniform函数

函数名: glUniform 功能: 为当前程序对象指定Uniform变量的值。(译者注:注意,由于OpenGLES由C语言编写,但是C语言不支持函数的重载,所以会有很多名字相同后缀不同的函数版本存在。其中函数名中包含数字(1、2、3、4)表示接受这个数字个用于更改uniform变量的值,i表示32位整形,f表示32位浮点型,ub表示8位无符号byte,ui表示32位无符号整形,v表示接受相应的指针类型。) 函数原型: voidglUniform1f(GLintlocati...

u010029439的博客 1692

图形学实验 旋转茶壶 OpenGL实现

图像学实验 旋转茶壶环境Windows10Visual Studio 2017配置32和64位OpenGL环境。配置方法和工程文件:点击下载配置文件实验代码// 实验三 旋转茶壶.cpp: 定义控制台应用程序的入口点。 // #include"stdafx.h" #define GLUT_DISABLE_ATEXIT_HACK #pragma comment(lib, "glut32.lib")...

王会长的博客 5616

OpenGL学习笔记(四)

OpenGL初级篇(四)

weixin_42050609的博客 1137

计算机图形学实验(OpenGL实现):Spinning Pinwheel

实验要求: 构建且渲染一个3D风车模型(如下图所例示)。其中,三个叶片(包括中间的黄色三角形)在一个2D平面上,手柄在另外一个离相机更近的2D平面上。三个叶片、中心的三角形、手柄分别用不同的颜色显示。注:图中画的黑色线条是为了方便演示,不要求绘制。 实现风车的旋转动画。要求风车的三个叶片以及中间的黄色三角形(在其所在平面上)一起绕着中心一点不停旋转,且将此动画渲染出来。 实现通过键盘对动画的交互控制,包括切换旋转方向、增大旋转速度以及减小旋转速度。 设计按钮和菜单两个控件,用于动画的交互控

Tzankho的博客 2941

手把手教你离线部署bert-base-uncased模型(附完整文件清单)

本文提供了一份详尽的bert-base-uncased模型离线部署指南。针对严格内网或无网络环境,文章不仅列出了包括config.json、pytorch_model.bin在内的完整必需文件清单,还详细解释了每个文件的作用,并给出了使用snapshot_download工具或手动下载的两种文件获取方法。重点阐述了如何正确设置本地路径、编写健壮的加载代码,并通过多层次验证确保模型在离线环境下成功运行,有效解决了部署过程中常见的文件缺失和路径错误问题。

weixin_29034963的博客 322

OpenGL进阶 | 绘制一个三角形

OpenGL:利用shader绘制一个三角形。

该用户还没想到好的昵称的博客 1935

用STC8单片机解码EV1527遥控信号:从波形分析到C代码实现(附完整库)

本文详细介绍了如何使用STC8单片机解码EV1527遥控信号,从波形分析到C代码实现的完整过程。内容包括EV1527协议解析、硬件搭建、信号捕获技巧、解码算法实现及优化策略,并附有完整库代码,帮助开发者快速实现智能家居设备的无线控制。

weixin_34093995的博客 299

计算机图形学练习(二)——正方体绕轴旋转

正方体绕轴旋转 只要在旋转立方体的代码上做稍微的改动即可 旋转立方体 本文将立方体立起来旋转,关键在于初始偏转角度的计算 transform = glm::rotate(transform, glm::radians(45.0f) * static_cast<GLfloat>(glfwGetTime()), glm::vec3(0.0f, 1.0f, 0.0f)); transform = glm::rotate(transform, (glm::f32)acos(1 / sqrt(3)), g

qq_44018760的博客 2015

头歌操作系统2.3系统调用命令ls执行的系统调用

设置版本0内核为分析对象。然后一直c直到虚拟机出现。然后一直c就是答案了。

m0_74128952的博客 1万+

Python多版本共存指南:用CMD命令一键切换3.6和3.8解释器(含pip使用技巧)

本文详细介绍了在Windows CMD环境下实现Python多版本(如3.6和3.8)共存与一键切换的完整方案。通过文件重命名策略、环境变量优化和自定义脚本,开发者可快速切换Python解释器版本,并管理各版本独立的pip依赖库,确保项目环境隔离与兼容性。

weixin_29035405的博客 424

计算机图形学MFC自学笔记:三维几何变换(旋转立方体)

计算机图形学MFC自学笔记:三维几何变换(旋转立方体) 随着万恶之源概率论的期末考试结束,计算机图形学梅开二度 孔老师的宝书镇楼 视频链接: 计算机图形学全套算法讲解和C++编码实现(共23讲配套源码) ...

bailichen800的博客 5900

内网穿透-frp二层隧道搭建

环境: weblogic: 192.168.0.133 10.10.20.12 win7 : 10.10.20.7 10.10.10.7go语言、跨平台的 可以分为frpc和frps frpc—>请求----->frps frps:放到黑客公网上 1.需要出网 2.配置: frpc:放到肉鸡上,请求frps 2.端口转发 2.1frpc传到肉鸡(weblogic) 利用工具,传入内存马到weblogic,然后使用冰蝎进行连接 然后在文件管理中上传frpc.exe和frpc.ini文件 fr

yyytaotao的博客 2105

计算机图形学(六)——画一个旋转的立方体

画一个会动的立方体 //画立方体 #include <iostream> #define GLEW_STATIC #include"Shader.h" #include"Camera.h" #include<GL/glew.h> #include<GLFW/glfw3.h> #include<glm/glm.hpp> #include<glm/gtc/matrix_transform.hpp> #include<glm/gtc/type

qq_44018760的博客 2173

[低代码 + AI] 明道云与 Dify 的三种融合实践方式详解

融合方式技术路径优点局限或注意事项UI 嵌入iframe 表单嵌入快速集成、用户体验一致无法自定义交互逻辑明道云调用 DifyAPI 请求节点工作流自动化、逻辑灵活有 timeout 限制、需优化 promptDify 调用明道云插件或 API 调用节点可查询实际业务数据、增强 AI 智能需理解明道云 API 结构、权限设置复杂明道云与 Dify 的结合为低代码平台注入了智能动力。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1187

卷积层 (Convolutional Layer) 原理与代码实例讲解

卷积层 (Convolutional Layer) 原理与代码实例讲解 关键词:卷积层,卷积操作,滤波器,特征提取,神经网络 1. 背景介绍 卷积神经网络 (Convolutional N

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 770

Python实现动态3D立方体:旋转的3D立方体动画

3D动画在数据可视化和图形学中具有重要意义,能够生动地展示复杂的三维结构和运动。在这篇博客中,我们将使用Python来实现一个动态旋转的3D立方体。通过利用Matplotlib库,我们能够轻松创建和动画化3D立方体。

屿小夏.的知识博客 1447

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

计算机图形学(一)——opengl实现三维立方体添加纹理光照与材质、键盘鼠标控制平移旋转和放大缩小

1.实验要求: 用OpenGL和C语言编写一个带纹理和材质的一个立方体的交互式程序。 1)要求生成一个在立方体,并在立方体的六个面上并分别实现不同的纹理映射和材质。纹理的类型为BMP图片纹理,材质类型可以自己设计。例如,三个面上实现纹理映射的头像和生活照,另外三个面上实现材质(金属、塑料等)。 2)可以利用鼠标和键盘进行交互,实现该立方体的旋转、平移和缩放。 2.实验效果图如下: 正常情况下 加...

诶你爱我吗的博客 8832

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

计算机图形学图形旋转_计算机图形学中的旋转

计算机图形学图形旋转 计算机图形学| 回转 (Computer Graphics | Rotation) Rotation is a type of transformation that is very often used in computer graphics and image processing. Rotation is a process of rotating an object...

cumt30111的博客 5394

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

《计算机图形学》实验三:图形变换

本博客计算机图形学系列文章索引: 地址:《计算机图形学系列相关文章索引(持续更新)》 参考教材:《计算机图形学》 机械工业出版社 ,徐文鹏主编 源代码如下: #include #include #include GLfloat rtri=0.0f; //链接必要的库文件 #pragma comment( lib, "opengl32.lib" ) #pragm

Naruto 1万+
上一篇: 计算机图形学 | 裁剪与屏幕映射
下一篇: Leetcode2511. 最多可以摧毁的敌人城堡数目
UestcXiye
博客等级 码龄8年 9032粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值