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语法规则的简洁性。保留关键字不能用作常量…...
AI智能体交互体验优化:从对话管理到个性化记忆的工程实践
1. 项目概述:从“Agent Experience”看智能体交互体验的演进最近在GitHub上看到一个挺有意思的项目,叫“agent-experience”,作者是dhruvvsukhadia。光看这个名字,可能很多人会有点懵——这到底是做什么的?是开发AI智能…...
汽车软件化演进:从原生应用到手机集成的技术路径与实战解析
1. 从机械到智能:汽车软件化的十字路口十年前,当福特和通用汽车开始在硅谷和南加州大肆招聘软件工程师时,很多人可能还没意识到,这不仅仅是一次普通的“招兵买马”,而是一场深刻改变汽车工业基因的序曲。2014年那会儿&…...
2篇3章3节:Trae 的高效小说创作与文件管理实操
在人工智能辅助小说创作的过程中,工具操作方式、内容生成逻辑与文件管理体系,直接决定写作效率与文稿质量。Trae作为适配小说创作的专业工具,不仅支持单章、全章智能化生成正文内容,适配短篇、长篇不同创作场景,还具备多屏拆分、标签页管理、规范化文件收纳等实用功能。熟…...
2025届必备的六大AI辅助论文网站推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek DeepSeek系列模型相关的论文,全方位细致地阐述了其技术架构以及训练的方式方法。…...
黄仁勋CMU演讲:取代你的是会AI的人,所有人同一起跑线,奔跑吧
老黄又当博士了。这是他的第7个荣誉博士学位,而且英特尔CEO陈立武亲自为其授袍。卡内基梅隆大学(CMU)最新一届毕业典礼上,黄仁勋向5800多名毕业生发表演讲。面对AI浪潮的冲击,所有人都在焦虑、都在担心会不会被AI取代&…...
共享屏幕怎么弄 共享屏幕用什么工具好
共享屏幕怎么弄?不管是异地办公同步方案、远程协助操作设备,还是和朋友分享游戏画面,都离不开共享屏幕的需求。共享屏幕怎么弄才不麻烦、不卡顿?其实答案很简单,无界趣连2.0就能轻松搞定,不用复杂设置&…...
免费LLM API实战指南:从选型到架构的完整解决方案
1. 项目概述:一份免费LLM API的实用指南 如果你正在开发AI应用,或者只是想低成本地体验各种大语言模型,那么“API调用成本”绝对是一个绕不开的痛点。无论是OpenAI还是Anthropic,按Token计费的模式在频繁调用下,账单数…...
Termius v7.0.1汉化踩坑实录:从修改entry.js到完美中文界面的完整流程
Termius v7.0.1深度汉化实战:从逆向分析到完美本地化的技术探索 Termius作为一款广受开发者喜爱的SSH客户端,其v7.0.1版本在功能和性能上都有显著提升。但对于中文用户而言,官方未提供完整的本地化支持始终是个遗憾。本文将带你深入Termius内…...
RDMA之从userspace verbs 到kernel verbs
用户态RDMA(userspace verbs)RDMA是一种高性能网络协议,一般用在GPU集群的高速通信库,如NCCL、NVSHMEM等,这些都是用户态通信库,我们熟知的RDMA大部分都是用户态RDMA。比如,如下一个简单的RDMA程序int main() { // 1…...
别再乱加电阻了!手把手教你用SI9000搞定PCB阻抗匹配(附50欧姆计算实例)
高速PCB设计实战:用SI9000精准计算阻抗匹配的工程方法 当信号频率突破百兆赫兹时,PCB走线就不再是简单的电气连接——它们变成了需要精密控制的传输线。去年参与一个千兆以太网项目时,我曾目睹团队因阻抗失配导致信号完整性崩溃的惨痛案例&am…...
