文章目录

  • 实验内容
    • 实验步骤
      • 1、场景设计和显示
      • 2、添加纹理
      • 3、添加光照、材质、阴影效果
      • 4、用户交互实现视角切换完成对场景的任意角度浏览
      • 5、通过交互控制物体
      • *6、补充说明
    • 实验效果
      • 场景效果
      • 其他物体效果
    • 使用说明

实验内容

在屏幕上显示一个包含多个虚拟物体的虚拟场景,并响应一定的用户交互操作。

  1. 场景设计和显示
    学生可以通过层级建模( 实验补充1和2)的方式建立多个虚拟物体,由多个虚拟物体组成一个虚拟场景,要求在程序中显示该虚拟场景,场景可以是室内或者室外场景;场景应包含地面。层级建模的最深层次需要达到至少四层。
  2. 添加纹理
    参考实验4.1,为场景中至少两个主要物体添加纹理贴图 。
  3. 添加光照、材质、阴影效果
    参考实验3.2,实验3.3和实验3.4,实现光照效果、材质、阴影等。
  4. 用户交互实现视角切换完成对场景的任意角度浏览
    参考实验3.1,完成相机变换。
  5. 通过交互控制物体
    参考实验2.3,实现物体的变换,允许用户通过键盘或者鼠标实现场景中至少两个物体的控制(移动,旋转,缩放等等)。

实验步骤

1、场景设计和显示

①、本次实验我将绘制一个平台作为地面,将所有虚拟物体放在上面。
此处推荐一个图形学神器软件:MagicaVoxel。
在MagicaVoxel内可以自由绘制像素模型,以obj格式保存后即可读取到作业中。

②、层级建模
(1)、人物模型幽灵结构框图:

(2)、通过Magicavoxel绘制出人物的各个身体部件。参考实验补充2,先将各部分初始化(以躯干为例):

(3)、随后以obj的方式读入:

(4)、随后,以躯干(Torso)开始构建层级,后续调整人物位置只需要调整躯干即可(为方便位置调整,我定义了全局变量x_step_size和_y_step_size来控制模型在平面的位置):

2、添加纹理

①、设置TriMesh.cpp,
(1)、纹理坐标位置:

(2)、读取obj时,读取到纹理坐标:

(3)、随后来存储点对应的纹理坐标:

②、着色器的纹理设置
(1)顶点着色器中添加传给片元着色器的纹理变量texCoord,随后传给片元着色器:

(2)、片元着色器中定义接收纹理数据的fColor,接收顶点着色器传来的纹理数据:

③、随后MeshPainter.cpp中的load_texture_STBImage函数即可正常读取纹理图片,并将其传递给着色器,同时在bindObjectAndData函数中,绑定纹理数据并将纹理坐标传给着色器:

④、使用bindObjectAndData初始化各种对象后,即可添加obj及其纹理图片进行绘制:

3、添加光照、材质、阴影效果

①、首先设置光源的位置,同时设置光源的参数:

②、设置Torso的材质,让Torso可以反光:

③、在addMesh函数中添加阴影绘制代码:

④、addMesh中的bindLightAndMaterial函数用来传递光照、材质等数据:

⑤、随后在片元着色器中添加四个归一的法向量,同时添加光的反色系数:

之后绘制的物体即可正常有反光性质,同时在y=0的平面生成阴影。

4、用户交互实现视角切换完成对场景的任意角度浏览

①、首先在Camera.h中初始化相机的参数(观察位置):

②、随后添加键盘、鼠标的交互
(1)键盘中使用如下按键交互:
u/U: 增加/减小相机的rotateAngle,即向右/左移动相机;
i/I: 增加/减小相机的upAngle,即向上/下移动相机;
o/O: 增加/减小相机的radius,即拉远/近相机;
space: 相机回到初始位置。

(2)、鼠标中使用如下操作来交互
鼠标滚轮向前/后滑动: 减小/增大radius,即可拉进/远相机位置;

以界面中心为坐标原点建立二维坐标,鼠标在界面移动,相机可以往坐标的地方移动。

5、通过交互控制物体

①、幽灵转身/行走
(1)、转身。
首先参考实验补充2,通过按键a / d来使torso的theta减小/增大,从而达到让其向左/右转身:

(2)、行走。
A、将其行走动作拆分:左右小腿分别往前时,以及再插入站立时,四种状态;通过设置躯干角度来实现,通过walk函数不断循环即可(下图角度以第一步行走为例):

B、绘制幽灵时,之前提到的幽灵初始位置由躯干坐标(x_step_size, 0, y_step_size)来控制。以向左走为例:按方向键←时,躯干的theta减少90°,即幽灵向左转身,同时躯干的位置向左移动0.1个单位,可通过按压来实现一直行走。所以加入键盘交互如下:

②、风车的旋转

(1)、绘制风车翼时,使用变量r来控制角度:

(2)、随后写个渲染r自动增大的函数autoRotate,并在display函数中调用,即可实现风车的自动旋转:

(3)、在键盘交互中,也可通过按 f 键来加快风车的旋转速度(可按压):

③、妹子NPC的放大/缩小

(1)、绘制妹子时,使用变量s来控制其setScale:

(2)、随后在键盘交互中,通过按键l / L来实现妹子NPC的放大/缩小:

*在main函数中加入抗锯齿效果,可使物体运动更流畅:

glfwWindowHint(GLFW_SAMPLES, 8);

*6、补充说明

考虑到虚拟场景的多样的以及基于现实的可能性,我使用addMesh绘制房子、风车等物体,使之在地面上存在阴影,但我也绘制了部分“没有阴影”的物体,如:地面(需要阴影落在地面上)、池塘(池塘镶嵌在地面内,自身不存在影子)、幽灵(幽灵没有影子)。
所以我在MeshPainter.h和MeshPainter.cpp中,添加了drawMesh2,取消了其阴影绘制部分,在绘制这些物体时,就使用此函数来传递变换矩阵,即可去除这些物体的影子。

实验效果

场景效果

其他物体效果

层级建模幽灵 建筑 池塘 风车 妹子

使用说明

项目地址

1、鼠标交互
①、鼠标滚轮向前/后滑动可以拉进/远相机位置;
②、以界面中心为坐标原点建立二维坐标,鼠标在界面移动,相机可以往坐标的地方移动。

2、键盘交互
①、幽灵:
方向键↑: 控制幽灵转身往前走;
方向键↓: 控制幽灵转身往后走;
方向键←: 控制幽灵转身往左走;
方向键→: 控制幽灵转身往右走。
a: 控制幽灵往左边旋转
d: 控制幽灵往右边旋转

②、风车(已自动旋转)
f: 手动加速风车旋转。

③、妹子:
l/L: 放大/缩小妹子。

④、相机:
SPACE: 相机回到初始位置;
u/U: 相机往右/左旋转;
i/I: 相机往上/下旋转;
o/O: 相机视角拉远/拉近。

⑤、页面
h: 弹出操作提示;
ESC: 退出。

【计算机图形学】期末大作业_虚拟场景建模相关推荐

  1. 深大计算机图形学大作业之虚拟场景建模

    目录 前言 要求 场景概览 机器人层级模型 为立方体部件贴纹理 关键帧动画 关键帧动画循环 体素建模 场景布局 添加光影特效 延迟渲染管线 立方体贴图 环境映射 Phong光照 阴影映射 体积光 de ...

  2. 深圳大学计算机图形学期末大作业——OpenGL glfw库实现简单的Minecraft游戏

    源代码: OpenGL大作业OpenCraft-其他文档类资源-CSDN下载 目录 1. OBJ文件读取 2. 物体渲染与纹理着色. 3. 相机变换的实现 4. 光照与阴影的实现 5. 阴影设计 6. ...

  3. 计算机图形学期末作业,计算机图形学期末大作业3D建模.doc

    文档介绍: 深圳大学实验报告课程名称:计算图形学 实验名称:3D建模和真实感图形绘制学院:计算机与软件学院专业:计算机科学与技术报告人:学号:班级:1同组人:无指导教师:周虹实验时间:2014年11. ...

  4. HTML5期末大作业:管理系统网站设计——学生信息管理系统模板 (13页) HTML+CSS+JavaScript html网页设计期末大作业_网页设计平时作业

    HTML5期末大作业:管理系统网站设计--学生信息管理系统模板 (13页) HTML+CSS+JavaScript html网页设计期末大作业_网页设计平时作业 常见网页设计作业题材有 个人. 美食. ...

  5. python期末大作业_上海交通大学python期末大作业题目(姚天昉)

    姚天昉是上海交大一位非常有名的计算机老师,期末大作业非常难,给弟弟妹妹们透露下.ps:这是大作业一,另有大作业二即将公布,敬请关注! Project A Simulating a Physical S ...

  6. HTML5期末大作业:三亚旅游网站设计——三亚旅游网页设计(6页) html网页设计期末大作业_网页设计平时作业

    HTML5期末大作业:三亚旅游网站设计--三亚旅游网页设计(6页) html网页设计期末大作业_网页设计平时作业 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. ...

  7. HTML+CSS+JS`管理系统网站设计——学生信息管理系统模板 (13页) HTML+CSS+JavaScript html网页设计期末大作业_网页设计平时作业

    HTML5期末大作业:管理系统网站设计--学生信息管理系统模板 (13页) HTML+CSS+JavaScript html网页设计期末大作业_网页设计平时作业 常见网页设计作业题材有 个人. 美食. ...

  8. HTML5期末大作业:动漫网站设计——动漫电影《你的名字》(7页) HTML+CSS+JavaScript 学生DW网页设计作业成品 html网页设计期末大作业_网页设计平时作业

    HTML5期末大作业:动漫网站设计--动漫电影<你的名字>(7页) HTML+CSS+JavaScript 学生DW网页设计作业成品 html网页设计期末大作业_网页设计平时作业 常见网页 ...

  9. DIV+CSS进行布局 HTML+CSS+JS大作业——汽车销售网站模板(7页) html网页设计期末大作业_网页设计平时作业模板下载

    HTML+CSS+JS大作业--汽车销售网站模板(7页) html网页设计期末大作业_网页设计平时作业模板下载 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. ...

最新文章

  1. Visual C++ 2008入门经典 第十五章 在窗口中绘图
  2. 项目托管到GitHub及简单使用
  3. 深度学习图片分类CNN模板
  4. mongodb--find高级用法
  5. 小甲鱼python视频第八讲(课后习题)
  6. cobbler自动化安装详解
  7. 【OS学习笔记】二十九 保护模式八:任务切换对应的汇编代码之用户程序代码
  8. 深度学习准备「爆破」著名的欧拉方程
  9. CentOS7安装单机版RabbitMQ集群
  10. jsp连接sqlServer数据库教程、jsp连接sqlServer数据库报ClassNotFoundException异常
  11. 子类调用父类的构造函数几种情况
  12. Spring操作数据库几十次后就JDBC begin transaction failed
  13. 商业杂志图表的经典用色
  14. JDK 的下载与安装(非常详细!)
  15. 面试自我介绍和简历上的内容能不能相同?
  16. trader vn 显示不全_一个VNPY 的“CTP:平昨仓位不足”问题的解决记录
  17. Google, with new Pixel and camera, is serious about devices
  18. Android 在build.gradle文件中读取json文件
  19. Node开发后台API接口项目
  20. Golang位运算符

热门文章

  1. canvas 绘点图
  2. CPU卡PSAM卡 响应指令
  3. c语言试题及答案解析,C语言期末考试题(卷)(含答案解析).doc
  4. 2022年乡村医生考试精选模拟题及答案
  5. 测试过程中如何分析抓包工具抓的HTTP或TCP包
  6. 游戏脚本在移动游戏设计中的作用_游戏可以在教育中起到哪些正面的作用?
  7. CentOS 6.x 使用包管理器安装配置Apache+PHP+MySql
  8. Android深度探索--HAL与驱动开发----第五章读书笔记
  9. JAVAEE和项目开发——JSP详解
  10. python re库 正则表达式