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

这篇具有很好参考价值的文章主要介绍了计算机图形学 | 实验六:旋转立方体。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

计算机图形学 | 实验六:旋转立方体文章来源地址https://www.toymoban.com/news/detail-462305.html

到了这里,关于计算机图形学 | 实验六:旋转立方体的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenGLES:绘制一个混色旋转的3D立方体

    混色旋转的3D立方体 之前关于OpenGLES实战开发的博文,不论是实现相机滤镜还是绘制图形,都是在2D纬度 这篇博文开始,将会使用OpenGLES进入3D世界 本篇博文会实现一个颜色渐变、旋转的3D立方体 动态3D图形的绘制,需要具备一些基础的 线性代数 (向量、矩阵) 和 空间坐标系转

    2024年02月06日
    浏览(48)
  • Unity2021 实现不同面颜色不同的立方体鼠标键盘控制旋转

    1.创建一个3D的项目 2.创建一个Cube和一个Plane(其实没啥用,可以不建) 3.在Project的Assets中创建三个文件夹,后续放代码文件 4.设置颜色。 (1)在Material文件夹中右键创建一个Material文件命名为CubeMaterial,也就是下图中第一个白色的圆圈。中间的是控制Plane的,如果没有创建

    2024年02月08日
    浏览(44)
  • 计算机图形学,OpenGL编写的一个可实现旋转缩放移动的房间,内有数十种交互

    #include stdlib.h #includestdio.h #includewindows.h #include GL/glut.h #include math.h #include gl/GLU.h //颜色宏定义 #define white 1.0f, 1.0f, 1.0f #define black 0.0f, 0.0f, 0.0f #define red 1.0f, 0.0f, 0.0f #define blue 0.0f, 0.0f, 1.0f #define skyBlue 135.0/255.0, 206.0/255.0, 1.0f #define plum 1.0f, 187.0/255.0, 1.0f //浅紫色 #define pink 1.0f, 1

    2024年04月17日
    浏览(65)
  • 计算机图形学实验四 OpenGL的鼠标交互绘制

    一、实验目的 1.掌握OpenGL的鼠标按钮响应函数。 2.掌握OpenGL的鼠标移动响应函数。 3.进一步巩固OpenGL的基本图元绘制基础。 二、实验内容 1.鼠标画草图——实现鼠标点到哪,线就画到哪。 思路: 1)在主程序注册鼠标响应和鼠标移动子函数: glutMouseFunc(mymouse); glutMotionFunc(mym

    2023年04月20日
    浏览(121)
  • 【计算机图形学】【实验报告】太阳系绘制、B样条曲线绘制(附代码)

    实 验 报 告 一、实验目的 掌握三维图形的显示原理和方法,掌握三维观察的原理和方法; 掌握OpenGL中矩阵堆栈函数的使用,会使用堆栈函数进行复杂场景的组装。 掌握OpenGL中三维观察变换常用的函数的使用方法,了解三维模型的贴图方法; 掌握自由曲线的生成方法,熟练

    2024年02月10日
    浏览(43)
  • Web前端:HTML+CSS+JS实现美女照片3D立方体旋转(1),网易资深Web前端架构师

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新Web前端全套学习资料》,

    2024年04月23日
    浏览(53)
  • 计算机图形学实验——利用MFC对话框实现多边形绘制与填充(扫描线填充算法)附源码

    内容概括: 利用基于对话框的MFC项目 实现鼠标点击绘制多边形 实现扫描线算法填充多边形 源码见Yushan-Ji/ComputerGraphics: ECNU2023秋 计算机图形学课程实验代码 (github.com) 通过鼠标交互输入多边形 对各种多边形进行填充,包括边界自交的情况 利用 OnLButtonDown 和 OnRButtonDown 函数,

    2024年02月04日
    浏览(76)
  • 【计算机图形学】二维图形裁剪算法

    Cohen-Sutherland算法 Cohen-Sutherland是最早最流行的算法。 核心思想:通过 编码测试 来减少计算交点的次数。(编码算法) 1. 区域码: 线段端点以区域赋值以四位二进制码。 编码顺序:四位从右到左分别为:左边界、右边界、下边界、上边界。 编码值:落在相应位置为1,否则

    2024年02月02日
    浏览(59)
  • 初识计算机图形学

    笔记来源:【老奇】阴差阳错 撼动世界的游戏引擎 详见本人博客: 1.Transformation 2.梳理从MVP变换到光栅化的过程 MVP变换将空间中3D物体投影到2D屏幕 详见本人博客: 1.Rasterization(光栅化) 2.梳理从MVP变换到光栅化的过程 场景是一个个由三角面组成的模型 将模型投射到像素就

    2024年01月21日
    浏览(52)
  • 计算机图形与图像技术

    可以使用Python、Java等语言。 下图中,图中各事物比例失调 如何使用代码去掉某个人(不允许使用抠图工具)?         像素(Pixel)是“图像元素”的缩写, 指的是图像的最小单位 。 它是构成数码图像或屏幕显示图像的基本单元,代表了图像中的一个小点或一个小方块

    2024年02月07日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包