当前位置: 首页 > news >正文

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.objpenguin.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阅读器系列: 需求分析和文件读写目录提取类💎列表控件与目录字体控件绑定书籍管理系统💎用树形图管理书籍 添加控件 除了字体、字体大小之外,文字和背景颜色也会影响阅读观感&#xff0c…...

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,火狐查找速度快,效率高&#xff0…...

数字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语法规则的简洁性。保留关键字不能用作常量…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...