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

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

  • 计算机图形学 | 实验六:旋转立方体
    • Z-缓冲
    • GLM函数库
    • PVM矩阵
    • PVM矩阵的使用

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

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);

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/18097.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

携创教育:自考、成考、开放大学几年能够毕业拿证?

目前&#xff0c;国家承认的成人学历提升的形式只有3种&#xff0c;分别是自考&#xff0c;成考&#xff0c;开放大学。 ▼各学历形式拿证时间▼ ★自学考试 自考没有入学考试&#xff0c;只需要参加相应的课程考试&#xff0c;所有课程考试合格后&#xff0c;符合毕业条件即可…

【Linux】usb游戏手柄测试、编程

1、简述 在ubuntu18.04下使用usb游戏手柄,之前联系客服,客服回答不清楚是否支持linux,因此采购一款北通蝙蝠2的手柄来测试 2、测试 2.1 测试环境 系统:Ubuntu18.04 正常电脑系统ubuntu中都是自带手柄驱动的joystick,即内核配置已添加选项:Joysticks interface和Joys…

制作帮助中心过程中常见的误区与解决方法?

制作帮助中心是为了帮助用户了解产品和解决问题的重要手段。然而&#xff0c;在制作的过程中&#xff0c;我们可能会遇到一些误区&#xff0c;这些误区可能会导致我们的帮助中心无法达到预期的效果。因此&#xff0c;在本文中&#xff0c;我们将探讨制作帮助中心过程中常见的误…

try(){}用法try-with-resources、try-catch-finally

属于Java7的新特性。 经常会用try-catch来捕获有可能抛出异常的代码。如果其中还涉及到资源的使用的话&#xff0c;最后在finally块中显示的释放掉有可能被占用的资源。 但是如果资源类已经实现了AutoCloseable这个接口的话&#xff0c;可以在try()括号中可以写操作资源的语句(…

Oracle SQL优化相关数据项

要掌握SQL调优技术,就需要能读懂SQL语句的执行计划,要想读懂SQL语句的执行计划,不仅需要准确理解SQL语句执行计划中各操作及其含义,还需要准确理解SQL语句执行计划中各数据项的含义。本书第7章中,已经对SQL语句执行计划中各个操作的含义做了详尽的阐述,本章中,我们将对S…

(4)Qt——基本组件

目录 1. Designer 设计师** 2. Layout 布局*** 3. 基本组件 3.1 QWidget** 3.2 ui指针 3.3 QLabel 标签** 3.4 QAbstractButton 按钮类** 3.5 QLineEdit 单行文本输入框** 3.6 QComboBox 组合框** 3.7 一组与数值相关的组件* 1. Designer 设计师** Designer是一款独立的用于设计…

ShardingSphere系列四(Sharding-JDBC内核原理及核心源码解析)

文章目录 1. ShardingSphere内核解析1.1 解析引擎1.2 路由引擎1.3 改写引擎1.4 执行引擎1.5 归并引擎 2. ShardingSphere的SPI扩展点2.1 SPI机制2.2 ShardingSphere中的SPI扩展点2.3 实现自定义主键生成策略 3. ShardingSphere源码 1. ShardingSphere内核解析 ShardingSphere虽…

SuperMap GIS基础产品桌面GIS FAQ集锦(2)

SuperMap GIS基础产品桌面GIS FAQ集锦&#xff08;2&#xff09; 【iDesktop】【10.2.1】【11.0.1】 请问在 iDesktop 桌面端对线数据集进行打断线操作后&#xff0c;打断的线不显示是什么原因呢&#xff1f; 【问题原因】 当时操作的线数据集空间索引存在异常&#xff0c;导致…

PostgreSQL 新闻速递 谷歌基于POSTGRESQL 兼容数据库提供更大规模的数据库服务

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

初级算法-贪心算法

主要记录算法和数据结构学习笔记&#xff0c;新的一年更上一层楼&#xff01; 初级算法-贪心算法 一、分发饼干二、摆动序列三、最大子序和四、买卖股票最佳时机五、跳跃游戏六、跳跃游戏二七、k次取反后最大化的数组和八、加油站九、分发糖果十、柠檬水找零十一、根据身高重建…

David Silver Lecture 4: Model-Free Prediction

1 Introduction 任务&#xff1a;第三章使用动态规划方法&#xff0c;解决known的MDP问题&#xff0c;这章通过model free prediction对一个unknown的MDP估计他的value function。下一章通过Model free control的方法针对一个unknown的MDP optimise value function。 2 Monte…

Android类似微信聊天页面教程(Kotlin)五——选择发送图片

前提条件 安装并配置好Android Studio Android Studio Electric Eel | 2022.1.1 Patch 2 Build #AI-221.6008.13.2211.9619390, built on February 17, 2023 Runtime version: 11.0.150-b2043.56-9505619 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Windows 11 …

paddleLite在Android部署初体验(环境问题)

paddleLite初体验&#xff08;环境问题&#xff09; Android Studio下载Paddle Lite Demo打开项目环境配置下载到手机 Paddle Lite是百度开发的一种方便部署的深度学习推理框架&#xff0c;笔者最近想接触一些模型部署相关项目&#xff0c;就先接触了一下Paddle Lite&#xff0…

eks实践案例

Eks&#xff1a; ami-0c23197c88296c1b5 eks集群&#xff1a; 拉面 - 知乎 https://blog.csdn.net/saynaihe/category_12204222.html 什么是 Amazon EKS&#xff1f; - Amazon EKS kubectl 使用指南 https://zhuanlan.zhihu.com/p/364994610 k8s HPA自动伸缩 手把手教你 K8…

【花雕学AI】我们如何才能避免被ChatGPT替代?——一个跨学科的视角

ChatGPT是一个由OpenAI开发的AI文本工具&#xff0c;它可以理解和生成自然语言&#xff0c;从而与用户进行对话。ChatGPT是基于GPT-3或者GPT-4模型的&#xff0c;这是目前最大和最先进的语言模型之一。ChatGPT通过在大量的互联网文本数据上进行预训练和强化学习&#xff0c;学习…

Mongodb 在工业场景下的数字解决方案

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

UICollectionView 实现整页翻动(每页3个cell)

提示&#xff1a;页面架构是通过UICollectionView做的分页&#xff0c;分页点PageControl使用的是<SDCycleScrollView/TAPageControl.h> &#xff0c;布局架构使用的是Masonry 前言 为了实现UICollectionView无限翻动&#xff0c;连续滑动&#xff0c;主要是利用pagingE…

2023年计算机视觉与模式识别国际会议(CCVPR 2023)

会议简介 Brief Introduction 2023年计算机视觉与模式识别国际会议(CCVPR 2023) 会议时间&#xff1a;2023年9月15日-17日 召开地点&#xff1a;英国牛津 大会官网&#xff1a;www.ccvpr.org 计算机视觉技术与模式识别是现代科学中备受关注的热点技术&#xff0c;它的革新对各行…

改写句子的软件有哪些-免费改写文章的软件

改写句子的软件 改写句子的软件是一种广泛应用于文字处理的工具&#xff0c;其主要作用是通过对原文中的语言结构和表述方式进行调整和优化&#xff0c;以改进文章的质量和可读性。改写句子的软件广泛用于新闻报道、科学文章、学术论文、书籍等各类文本材料中&#xff0c;旨在…

港科夜闻|广东省委常委、副省长王曦到访香港科技大学

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、广东省委常委、副省长王曦到访香港科技大学。在香港科大校长、粤港澳大湾区院士联盟理事会主席叶玉如教授陪同下&#xff0c;王曦常委率代表团参观国家级科研设施和了解学校发展情况&#xff0c;并与在港中国科学院院士座…