HNU计算机图形学-作业二
HNU计算机图形学-作业二
- 作业二:纹理和照明
- 前言
- 介绍
- 实施详细信息
- 任务1:加载复杂对象
- 任务2:纹理映射和照明
- 任务3:互动活动和动画
- 额外任务:增强场景的视觉效果(最高20%)
- 最终实现效果
作业二:纹理和照明
前言
完整工程文件
说实话第二次作业和第一次作业相比也没多什么东西,就是用了一些更高级点的技术(光照,纹理和3D模型等等),纯粹就是将各个模型堆在一起而已,但也完成了文档要求的所有内容。至于assimp库是从网上下载的,摄像机类和shader和texture类是从learnOpenGL这个网站抄的。凑合看看吧
介绍
在本任务中,您需要使用OpenGL构建一个更加逼真和复杂的场景。为了完成这项任务,您将在OpenGL中体验更多功能,包括照明、复杂的模型构建和加载、纹理映射和交互式事件。您将使用基本体图形 或直接从.obj文件加载三维模型,然后查看/建模变换以创建此三维场景。将使用纹理贴图和照明使场景和对象更加逼真。鼠标/键盘输入和窗口事件处理将有助于实现交互式动画。

在该指定中,场景中有两个模型。其中一个(背景雪原)比较简单,另一个(企鹅)比较复杂。我们可以自己设计背景雪原的顶点属性。然而,对于企鹅来说,它是如此复杂,以至于我们需要通过.obj文 件加载模型。此外,雪原和企鹅被渲染成不同的纹理和灯光效果。所显示的场景可以通过用户的交互式输入来控制。您还可以丰富在指定1中创建的场景。
实施详细信息
任务1:加载复杂对象
使用Open Asset Import Library,或我们拥有的函数Model loadOBJ(const char*objPath)给定加载至少一个复杂模型,即演示程序中的企鹅。在本部分中,您可以通过修改void sendDataToOpenGL()子例程来使用Model loadOBJ(const char*objPath)`函数。
我们在演示程序中提供了模型,即snowfield.obj和penguin.obj。我们鼓励您从Internet下载其他.obj文件或使用Blender来设计您的对象。
(你需要检查penguin.obj,因为如果你直接画企鹅,它会非常巨大。具体来说,你需要做一些转换。)
任务2:纹理映射和照明
您需要将不同的纹理映射到两个模型,即演示程序中的雪地和企鹅。我们将使用(请参阅依赖项/stb_image)来加载纹理图像。您需要使用键盘交互来更改企鹅的纹理。您首先需要生成一个OpenGL纹理, 并通过修改void texture::setupTexture(const char*texturePath)子例程来设置纹理参数。
然后,分别在void sendDataToOpenGL()和void paintGL(void)子例程中加载纹理并将其绑定到不同的模型。stb imagelibrary
在这里,我们还在演示程序中提供了两个模型的纹理,也鼓励您从互联网上下载其他纹理或自己绘制/过滤纹理。
此外,3D场景应使用至少两个光源进行照明。一个应该是环境(定向)灯。对于其他光源,您可以 自己决定位置和颜色。添加此类光源的主要目的是在模型上产生漫射光和镜面光效果。您可以通过修改void paintGL(void)子例程来完成此操作。
任务3:互动活动和动画
在此任务中,您需要实现以下交互式事件和动画:
(a) 照明控制
按“w”键和“s”键可分别增加和减少定向光的亮度。
(b) 纹理控制
按“1”和“2”键为企鹅切换两种不同的纹理,我们还提供了两种可以应用于企鹅的纹理。(即penguin/penguin_01.jpg,penguin/penguin_02.jpg)
按“3”和“4”键可以切换雪原的两种不同纹理,我们还提供了两种可以应用于企鹅的纹理。(即雪地/雪地_01.jpg,雪地/雪地_02.jpg)
© 对象控件
按下箭头键“↑↓←→”
以控制企鹅的运动。具体而言,“↑↓”
分别指示向前和向后移动。“←→”
分别指示向左和向右旋转。(请参阅演示程序中企鹅的动画)
(d) 视图控件
通过鼠标控制摄像机的视图,这意味着:
当单击左键,鼠标上下移动时,您看到的整个场景会相应地上下移动。
(请参阅演示程序。不需要右键单击功能。)
在本任务中,您可以修改以下子程序来实现上述要求:
void mouse_button_callback(GLFWwindow*窗口,int按钮,int操作,int mods)
{
// Sets the mouse-button callback for the current window.
}
void cursor_position_recallback(GLFWwindow*窗口,双x,双y)
{
// Sets the cursor position callback for the current window
}
void scroll_callback(GLFWwindow*窗口,双xoffset,双yoffset)
{
// Sets the scoll callback for the current window.
}
void key_callback(GLFWwindow*窗口,int键,int扫描代码,int操作,int mods)
{
// Sets the Keyboard callback for the current window.
}
额外任务:增强场景的视觉效果(最高20%)
OpenGL为您的程序提供了许多功能来创建各种视觉效果。你可以自己研究它们,并将它们引入作业中
以下是一些建议的改进:
• 加载更复杂的模型,并将其他纹理映射到它们上,以形成一个有意义的场景。(10%)
• 使用不同类型的光源来制作有意义的场景,例如Pointlight、Spotlight等的组合(10%)
• 复杂模型上的阴影映射。(10%)
• 绘制点或线来跟踪其中一个复杂模型的运动。(10%)
• 任何其他有趣的效果。
最终实现效果

夜晚开灯效果:

使用方法:
Manipulation:
Key:
Key “ESC”:退出程序
Key “1”:切换企鹅模型纹理
Key “2”:切换企鹅模型纹理
Key “3”:切换雪地模型纹理
Key “4”:切换雪地模型纹理
Key “W”:定向光加强
Key “S”:定向光减弱
Key “ENTER”:切换球场地板贴图
Key “X”:白天和黑夜模式切换(注:白天和黑夜分别有太阳模型和月球模型在上空移动,用于模拟太阳东升西落)
Key “Z”:球场四盏路灯的照明开关
Key “UP”:控制企鹅前行
Key “DOWN”:控制企鹅后退
Key “LEFT”:控制企鹅左转
Key "RIGHT:控制企鹅右转
Key "SPACE:控制企鹅跳跃
//以下功能得在退出第三人称跟随时使用,如何退出请看鼠标事件
Key “T”:控制摄像机前移
Key “G”:控制摄像机后移
Key “F”:控制摄像机左移
Key “H”:控制摄像机右移
Mouse:
鼠标左键:第三人称视角跟随开关(初始默认开启)
鼠标右键:手电筒开关(需在关闭第三人称跟随时才能使用)
鼠标滑轮:控制屏幕视角大小
鼠标移动:当关闭第三人称跟随时摄像机会跟随鼠标移动而移动
//注意:本项目有个小bug,当退出第三人称视角跟随并且再次移动摄像机位置,然后再点击左键回到第三人称视角时,摄像机的主视角可能会不正对企鹅模型(或者视角丢失),需要再退出第三人称跟随然后重新调整摄像机位置和视角。
用)
鼠标滑轮:控制屏幕视角大小
鼠标移动:当关闭第三人称跟随时摄像机会跟随鼠标移动而移动
//注意:本项目有个小bug,当退出第三人称视角跟随并且再次移动摄像机位置,然后再点击左键回到第三人称视角时,摄像机的主视角可能会不正对企鹅模型(或者视角丢失),需要再退出第三人称跟随然后重新调整摄像机位置和视角。
就这样吧,简简单单的一个作业。第三次就是比较有难度的。
相关文章:
HNU计算机图形学-作业二
HNU计算机图形学-作业二 作业二:纹理和照明前言介绍实施详细信息任务1:加载复杂对象任务2:纹理映射和照明任务3:互动活动和动画额外任务:增强场景的视觉效果(最高20%) 最终实现效果 作业二&…...
湖南大学OS-2020期末考试解析
【特别注意】 答案来源于@wolf以及网络 是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 这张卷子有点老了,部分题目可能有用。如果仔细研究应该会有所收获。 【试卷与答案】 一、选择题(15%) 1.下列关于进程状态转换,不正确的是:C A. …...
【用户认证】密码加密,用户状态保存,cookie,session,token
相关概念 认证与授权 认证(authentication )是验证你的身份的过程,而授权(authorization)是验证你有权访问的过程 用户认证的逻辑 获取用户提交的用户名和密码根据用户名,查询数据库,获得完…...
LVS+Keepalivedd
Keepalived 一、Keepalived及其工作原理二、实验非抢占模式的设置 三、脑裂现象四、Nginx高可用模式 一、Keepalived及其工作原理 keepalived是一个基于VRRP协议来实现的LVS服务高可用方案,可用解决静态路由出现的单点故障问题。 在一个LVS服务集群中通常有主服务器…...
WPF开发txt阅读器7:自定义文字和背景颜色
文章目录 添加控件具体实现代码说明 txt阅读器系列: 需求分析和文件读写目录提取类💎列表控件与目录字体控件绑定书籍管理系统💎用树形图管理书籍 添加控件 除了字体、字体大小之外,文字和背景颜色也会影响阅读观感,…...
Elasticsearch文件存储
分析Elasticsearch Index文件是如何存储的? 主要是想看一下FST文件是以什么粒度创建的? 首先通过kibana找一个索引的shard,此处咱们就以logstash-2023.05.30索引为例 查看下shard分布情况 GET /_cat/shards/logstash-2023.05.30?vindex …...
chatgpt赋能python:如何安装pyecharts
如何安装pyecharts Pyecharts是一个基于echarts的数据可视化工具,它是Python语言的一个库,可以通过Python编程语言进行数据可视化,并且能通过交互式的方式展示出来。 在本文中,我们将介绍如何安装pyecharts,如果您是…...
cmake 添加一个库
目录 项目格式 cmake基本语法 设置编译器 添加库 链接库 添加库的头文件 cmake打印字符串 库的cmake文件 cmake生辰库 mian函数中使用 让库成为可选的 cmake基本语法 设置option变量 cmake设置条件链接库 链接库 添加头文件 修改cmake配置文件 修改引用的源码…...
代码随想录二刷 226 翻转二叉树 102 二叉树的层序遍历 101 对称二叉树
226 翻转二叉树 代码如下 func invertTree(root *TreeNode) *TreeNode { if root nil { 采用前序遍历,如果当前节点为空,就返回空 return nil } root.Left,root.Right root.Right, root.Left 交换该节点的…...
【深入浅出C#】章节 3: 控制流和循环:条件语句
条件语句是编程中一种常用的控制结构,用于根据给定的条件来执行不同的代码块。它基于条件的真假来决定程序的执行路径,使程序能够根据不同的情况采取不同的行动。条件语句的作用在于根据特定的条件来控制程序的行为,使程序能够根据不同的情况…...
Java框架学习--Spring
1.Spring概念【托管很多对象的框架】 一个包含了众多工具方法的IoC容器。 1.1 什么是容器? 容器是用来容纳各种物品的(基本)装置。--来自百度百科 之前常见的容器有: List/Map-》数据存储容器 Tomcat-》Web容器 1.2什么是IoC? IoCInve…...
【爬虫】Xpath和CSS信息提取的方法异同点
类似点: Xpath与css都有web页面定位元素的功能Xpath与css结构类似 区别: 1. Xpath比较强大,而css选择器在性能上更优,运行速度更快,语法更简洁 CSS再chrome,火狐查找速度快,效率高࿰…...
数字IC前端学习笔记:FIFO的Verilog实现(二)
相关文章 数字IC前端学习笔记:LSFR(线性反馈移位寄存器) 数字IC前端学习笔记:跨时钟域信号同步 数字IC前端学习笔记:信号同步和边沿检测 数字IC前端学习笔记:锁存器Latch的综合 数字IC前端学习笔记&am…...
2.2 搭建Spark开发环境
一、Spark开发环境准备工作 由于Spark仅仅是一种计算框架,不负责数据的存储和管理,因此,通常都会将Spark和Hadoop进行统一部署,由Hadoop中的HDFS、HBase等组件负责数据的存储管理,Spark负责数据计算。 安装Spark集群前…...
webpack指定输出资源的路径和名称
如图,在前面的章节我们打包后的文件默认都输出到了dist目录下,无论是图片、还是js都在同一级别目录,这里目前处理的资源比较少,如果资源一多,所有的资源都在同一级目录,看起来很费劲。 那么这节就介绍一下…...
Spring事务四
spring 事务的隔离级别 当多个事务同时访问数据库中的同一数据时,可能会出现数据不一致的情况,为了避免这种情况发生,就需要使用事务隔离机制。Spring框架中定义了5种事务隔离级别,分别为: DEFAULT(默认隔…...
项目管理专业人员能力评价等级证书(CSPM)的级别介绍
2021年10月,中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系,开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会(CAS)组织开展的项…...
设计模式-创建型模式(单例、工厂、建造、原型)
Concept-概念前置 设计模式:软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。 面向对象三大特性:封装、继承、多态。 面向对象设计的SOLID原则: (1)开放封闭原则&#…...
用饭店来形象比喻线程池的工作原理
一、线程池解决的问题? 使用线程池主要解决在程序中频繁创建和销毁线程导致的资源浪费,线程池可以维护一定量的线程来执行所需要的任务,维护的线程也可以重复使用。 二、用形象的饭店来解释工作原理 线程池就相当于一家饭店, 任…...
GO学习笔记之表达式
GO学习笔记之表达式 保留字运算符优先级二元运算符位运算符自增指针 保留字 Go语言仅25个保留关键字(keyword),这是最常见的宣传语,虽不是主流语言中最少的,但也确实体现了Go语法规则的简洁性。保留关键字不能用作常量…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
