# CG期末项目报告
## Introduction
一个控制人物走迷宫的游戏。
## maze 生成
迷宫的一个 cell 由中心通路和四面墙组成,呈十字状。
采用 Prim 算法,把 cell 看成顶点,生成迷宫的通路就是生成树。
cell 的状态有3种,状态为1的 cell 是树的顶点,状态为2的 cell 是非树顶点中树顶点的周围顶点,也就是可以考虑加入树的顶点,状态为0的 cell 是剩余顶点。打通的意思就是将顶点连入树中。
一个 cell 有5个属性:cell 的状态,四面墙是否被打破。
未加入过 list 的 cell 状态为0,从 list 中删除的 cell 状态为1,在 list 中的 cell 的状态为2。
将一个 cell 加入 list。当 list 不为空,从 list 中随机选一个cell,删除,考虑周围状态为1的 cell 的方向,随机选一个方向打通,将它周围所有状态为0的 cell 加入 list。
为了好看,将墙扩展为8面,也就是说,一个 cell 是一个3乘3的矩阵,通路在中心。
为了渲染,我们需要记录通路的位置于 maze_map,记为 true。迷宫固定入口和出口,需要将对应的墙打通。
## maze 的渲染
用立方体来渲染每一面墙,为了让通路更加宽敞,墙的大小可以调整,主要有三种,记录在 cubeScales。
判断每个 cell 的9个格子,maze_map 是 false 的就需要渲染一面墙,将墙的位置记录在 cubePositions。每面墙的位置在 cell 中相对固定,主要就是求 cell 的位置。
渲染时,根据 maze_map 的值,在相应位置,渲染相应大小的墙。最后还会渲染一个地板。
## 人物和 maze 的碰撞
给人物加一个立方体包围盒,在移动人物时,要防止包围盒和墙发生碰撞。
由于人物不会发生上下翻转,只会在平面上平移和旋转,只需要考虑立方体的底面不会和墙的底面发生碰撞即可。也就是说,我们只需要考虑两个矩形的碰撞即可。
两个矩形发生碰撞,当且仅当两个矩形的边发生了碰撞。所以需要考虑两个线段发生碰撞。
线段(a1,a2),(b1,b2)相交,等价于a1,a2在(b1,b2)两侧且b1,b2在(a1,a2)两侧。
a1,a2在(b1,b2)两侧,等价于$((b1,a1)\times(b1,b2))*((b1,a2)\times(b1,b2))<0$
b1,b2在(a1,a2)两侧,等价于$((a1,b1)\times(a1,a2))*((a1,b2)\times(a1,a2))<0$
由于迷宫位于同一高度,只需要考虑 $x-z$ 平面,根据二维向量叉乘,$a\times b=(a_z*b_x-a_x*b_z)\overline{e}$
$(b1a1_z*b1b2_x-b1a1_x*b1b2_z)*(b1a2_z*b1b2_x-b1a2_x*b1b2_z)<0$
$(a1b1_z*a1a2_x-a1b1_x*a1a2_z)*(a1b2_z*a1a2_x-a1b2_x*a1a2_z)<0$
现在考虑人物和 maze 的碰撞,由于我们知道人物的位置,所以不需要考虑人物与所有墙的碰撞。
通过人物的位置可以定位人物在迷宫的哪一个 cell,然后我们考虑以这个 cell 为中心的9个 cell 的墙是否与人物发生碰撞即可。
## BGM
使用mciSendString来控制音乐的播放
## 天空盒背景
参考:opengl立方体贴图部分
天空盒是一个覆盖场景四周的长方体,但它的各个面上贴有表示天空的纹理图片,即四周的4面纹理的边与顶面纹理的边相连,同时四面纹理前后相连。
本项目采用了如下的天空盒模型,以right,left,top,bottom,front,back的顺序为盒子添加纹理。
![image](code/textures/skybox/all.jpg)
## 光照
环境光Ambient:
定义:是由光源发出经环境多次散射而无法确定其入射方向的光,即似乎来自所有方向。其特征是入射方向和出射方向均为任意方向。
项目用途:本项目通过添加环境光的方式来增强场景的亮度,使得场景具备一部分的初始亮度。
漫反射Diffuse:
定义:来自特定方向,它垂直于物体时比倾斜时更明亮。一旦它照射到物体上,则在各个方向上均匀地发散出去,效果为无论视点在哪里它都一样亮,其特征是入射方向唯一、出射方向为任意方。
项目用途:漫反射使物体上与光线方向越接近的片段能从光源处获得更多的亮度,因此能够使得添加光源后达到逼真的效果。
镜面光Specular:
定义:来自特定方向并沿另一方向反射出去,一个平行激光束在高质量的镜面上产生100%的镜面反射,其特征是入射方向和出射方向均唯一
项目用途:会在光源打到物体身上时达到一个高光的效果。
## 光源
平行光源:
平行光源只有光照方向,没有光源位置,且在传播过程中默认没有衰减。项目中通过添加平行光源来模拟太阳光照的效果。
点光源:
点光源既有光照方向,又有光源位置,且在传播过程汇总存在光照强度随距离衰减的现象。项目中在迷宫上方制作了一个白色正方体充当光源,并且该正方体随时间增长而进行圆周运动,起到移动光源的作用,并对场景的渲染产生了更好的效果。
## 阴影
两次渲染:分别从光源和视口角度渲染场景。
- 第一次渲染:把相机放到光源位置渲染场景,然后存储渲染的深度信息到一张纹理上,即深度贴图。
- 第二次渲染:从观察者的角度来渲染场景,在这次渲染时才渲染阴影,这次的渲染过程本质就是纹理贴图,只不过这个纹理是阴影图,贴图的方式根据我们设置的深度纹理过滤方式处理。生成阴影的过程是这样的:对于每个片元的深度信息和第一次从灯光角度渲染的深度信息比较,如果当前深度值大于第一次渲染的深度值,则肯定有物体在当前片元和灯光之间,那么当前片元在阴影区;否则,当前片元不在阴影区。
解决阴影失真问题:阴影贴图受限于分辨率,在距离光源比较远的情况下,多个片段可能从深度贴图的同一个值中去采样,因此放大阴影会看到明显的线条形式。此时使用一个阴影偏移量bias可以解决该问题,即简单的对表面的深度应用一个偏移量,这样片段就不会被错误地认为在表面之下了。
解决锯齿边问题:因为深度贴图有一个固定的分辨率,多个片段对应于一个纹理像素。结果就是多个片段会从深度贴图的同一个深度值进行采样,这几个片段便得到的是同一个阴影,这就会产生锯齿边。通过实现PCF即从纹理像素四周对深度贴图采样,然后把结果平均起来可以达到平滑锯齿边,得到柔和阴影的效果。
## 摄像机
第三人称摄像机,设计成camera类。摄像机需要包括观察坐标系(view space)的三个基向量,摄像机在世界中的位置,摄像机运动参数。除此之外,还需要记录摄像机观察的目标的位置,以及与目标的距离。
在游戏中,玩家的视角是固定在角色身上,所以在人物移动的过程中,摄像机也会跟着移动。另外,摄像机也可以绕着人物转,由于这个游戏只是走迷宫,因此摄像机的视角只会绕y轴转,也就是只会在水平面内转动。
## 模型和网格
使用Assimp库导入模型,加载为scene模型,遍历节点(node)树,通过索引访问mesh数组,可以获取全部顶点的所有信息,包括顶点坐标,法向量,颜色和纹理贴图等。
使用opengl自带的glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)可以以线框模式渲染模型,这种模式下可以看清模型的网格。
## 界面跳转
将整个程序设计成一个有限状态机,包括5个状态,“开始游戏”,“游戏说明”,“查看网格”,“游戏中”和“游戏结束”。
通过点击屏幕特定区域或者游戏中完成特定事件,比如走出迷宫,就会触发状态转换,不同状态下会渲染不同场景,由此实现界面跳转。
## 人机交互
处理四种人机交互
没有合适的资源?快使用搜索试试~ 我知道了~
c语言期末大作业控制人物走迷宫的游戏+源代码+文档说明
共69个文件
txt:17个
jpg:16个
png:14个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 5 下载量 41 浏览量
2023-11-06
19:23:21
上传
评论 1
收藏 74.87MB ZIP 举报
温馨提示
<项目介绍> c语言期末大作业控制人物走迷宫的游戏 该资源内项目源码是个人的课程设计作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到94.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 -------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
资源推荐
资源详情
资源评论
收起资源包目录
CG-finnal-master.zip (69个子文件)
CG-finnal-master
demo
demo.mp4 7.19MB
release
使用说明.txt 66B
.gitignore 6B
README.md 10KB
code
render.h 21KB
glad.c 59KB
textures
2.jpg 125KB
skybox
front.jpg 462KB
top.jpg 338KB
back.jpg 723KB
right.jpg 525KB
all.jpg 33KB
63.jpg 1.08MB
bottom.jpg 274KB
left.jpg 588KB
63.jpg 191KB
147fq.jpg 130KB
61.jpg 13.34MB
3.jpg 89KB
assimp-vc142-mtd.dll 13.53MB
music
Hello.mp3 11.28MB
model.h 17KB
shaderfile
material_vs.txt 850B
freetype_vs.txt 227B
light_vs.txt 195B
material_fs.txt 7KB
debug_quad_fs.txt 619B
debug_quad_vs.txt 196B
minimaze_fs.txt 239B
shadowmap_fs.txt 85B
freetype_fs.txt 234B
model_loading_vs.txt 332B
minimaze_vs.txt 195B
model_loading_fs.txt 279B
skybox_vs.txt 240B
light_fs.txt 116B
skybox_fs.txt 151B
shadowmap_vs.txt 184B
maze.h 1KB
camera.h 3KB
game.exe 2.37MB
main.cpp 18KB
stb_image.h 273KB
text.cpp 10KB
model
Ayaka model
Texture
body9.png 931KB
body11.png 931KB
脸.jpg 167KB
mc3.png 33KB
nina.psd 5.11MB
头发.jpg 163KB
面.png 16.02MB
衣服.jpg 428KB
hair.png 485KB
表情.png 133KB
face.png 277KB
发.png 567KB
eye.png 94KB
toon.png 1KB
肌.png 140KB
face1.png 728KB
body.png 929KB
服.png 2.23MB
Ayaka model.pmx 1.21MB
82-island
Files
fbx file
island.fbx 11.53MB
blend file
island.blend 54.29MB
maze.cpp 17KB
shader.h 8KB
text.h 3KB
mesh.h 5KB
共 69 条
- 1
资源评论
- 浮生半日闲8232024-07-16资源有很好的参考价值,总算找到了自己需要的资源啦。
- 2401_881915472024-11-26感谢大佬分享的资源,对我启发很大,给了我新的灵感。
- 逢考必过。。2023-12-09资源内容详尽,对我有使用价值,谢谢资源主的分享。
- 2301_802459942023-12-16发现一个超赞的资源,赶紧学习起来,大家一起进步,支持!
- 2301_772062592023-11-20果断支持这个资源,资源解决了当前遇到的问题,给了新的灵感,感谢分享~
机智的程序员zero
- 粉丝: 2420
- 资源: 4923
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Kotlin语言的Android开发工具类集合源码
- 零延迟 DirectX 11 扩展实用程序.zip
- 基于Java的语音识别系统设计源码
- 基于Java和HTML的yang_home766个人主页设计源码
- 基于Java与前端技术的全国实时疫情信息网站设计源码
- 基于鸿蒙系统的HarmonyHttpClient设计源码,纯Java实现类似OkHttp的HttpNet框架与优雅的Retrofit注解解析
- 基于HTML和JavaScript的廖振宇图书馆前端设计源码
- 基于Java的Android开发工具集合源码
- 通过 DirectX 12 Hook (kiero) 实现通用 ImGui.zip
- 基于Java开发的YY网盘个人网盘设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功