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

实验内容

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

  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、添加纹理

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: 退出。

  • 14
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
计算机图形学作业题 1. 计算机中由图形的形状参数(方程或分析表达式的系数,线段的端点坐标等)加属性参数 (颜色、线型等)来表示图形称图形的参数表示;枚举出图形中所有的点称图形的点阵 表示,简称为图像(数字图像) 2. 什么是计算机图形学计算机图形学有哪些研究内容? 3. 计算机图形学有哪些应用领域? 4. 计算机图形学有哪些相关学科分支?它们的相互关系是怎样的? 5. 图形系统的软件系统由哪些软件组成?举例说明。 6. 了解计算机图形系统的硬件。 7. 什么是显示器的分辨率、纵横比、刷新率? 8. 什么是像素、分辨率、颜色数?分辨率、颜色数与显存的关系? 分辨率M(N、颜色个数K与显存大小V的关系: 例:分辨率为1024像素/行(768行/帧,每像素24位(bit)颜色(224种颜色)的显示 器,所需的显存为:1024(768(24位(bit)=1024(768(24/8=2359296字节(byte)。 或:每像素16777216种颜色(24位真彩色),1024(768的分辨率,所需显存为:102 4(768(log216777216位显存=2359296字节显存。 9. 什么是图元的生成?分别列举两种直线和圆扫描转换算法。 10. OpenGL由核心库GL(Graphics Library)和实用函数库GLU(Graphics Library Utilities)两个库组成。 11. 区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种子点的颜色扩 展到区域内的其它点。 区域可分为 向连通区域和 向连通区域。区域填充算法有 填充算法和 填充算法。 12. 字符生成有哪两种方式? 点阵式(bitmap fonts点阵字——raster光栅方法):采用逐位映射的方式得到字符的点阵和编码——字模位 点阵。 笔画式(outline fonts笔画字——stroke方法):将字符笔画分解为线段,以线段端点坐标为字符字模的编 码。 13. 图形信息包含图形的 和 。 14. 什么是图形变换?图形变换只改变图形的 不改变图形的 。图形变换包括 和 ( )。 15. 熟练掌握二维图形的齐次坐标表示、平移、比例、旋转、对称变换以及复合变换的方 法和原则。 16. 图形的几何变换包括 、 、 、 、 ;图形连续作一次以上的几何变换称 变换。 17. 试写出图示多边形绕点A(xo,yo)旋转的变换矩阵。要求写出求解过程及结果。 18. 试写出针对固定参考点、任意方向的比例变换矩阵。 19. 试写出对任意直线y=mx+b的对称变换矩阵。 20. 什么是窗口?什么是视区?什么是观察变换? 21. 简述二维观察变换的流程。 22. 试述窗口到视区的变换步骤,并推出变换矩阵。 23. 已知w1=10,w2=20,w3=40,w4=80, v1=80,v2=110,v3=10,v4=130, 窗口中一点P(15,60),求视区中的映射点P'? 24. 在观察变换前必须确定图形的哪部分在窗口内,那些部分在窗口外,这个选择处理过 程称为 。 25. 使用Open GL的变换函数,若程序中先后调用的几个变换函数所定义的矩阵及顺序为L, M, N,其作用顺序为: 。 26. 试列举你所知的直线和多边形裁剪算法。 27. 简述Cohen-Sutherland(代码)线段裁剪算法。 28. 窗口和多边形如下图,应用Sutherland- Hodgman算法(逐边裁剪算法),对多边形进行裁剪。请以左、上、右、下的顺序列出 窗口各边裁剪多边形后所得的多边形顶点表。 29. 任何满足欧拉公式的形体称为 形体。 30. 超二次曲面通过将额外的参数插入 曲面方程而形成。 31. 在曲线、曲面的表示上,参数方程有何优点? 32. 要变换参数曲线曲面可以直接变换它的 ,而对于非参数形式则必须变换 。 33. 欧几里得曲线是 物体,沿三维曲线路径的位置可用 参数描述。 34. 规格化参变量 t [0, 1] 使得曲线曲面的 容易确定。 35. 什么是插值?什么是逼近?什么是拟合? 36. 给定一组有序的数据点 Pi ,i =0, 1, …, n,称为控制点,构造一条曲线顺序通过每个控制点,称为对这组控制点进行 ,所构造的曲线称为 。 37. 构造一条曲线使之在某种意义下最接近给定的数据点,而不要求通过其中任何一个点 ,称为对这些数据点进行 ,所构造的曲线为 曲线。 38. 拟合(Fitting)是 和 的统称。 39. 对于一组有序的型值点,确定一种参数分割,称之对这组型值点 。确定某个单参数矢函数,即确定参数曲线方程,称为曲线的 。 40. 参数域中所有节点构成的序列称为 矢量。 41. 什么是参数化?什么是参数区间的规格化? 42. 什么是参数连续性? 二条曲线P

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泠兰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值