# 计算机图形学 期末大作业报告
**综述**
本报告是 2020-2021 学年第一学期,计算机图形学课程(SE344)期末大作业报告。报告共分为三个部分,第一部分说明整个程序的结构设计,第二部分按照作业评分标准详细说明各个功能具体的实现方式,第三个部分说明其他程序相关的内容(包括操作说明和编程环境说明)。
## 一、程序结构设计
### 项目目录结构说明
代码目录图
![](https://www.writebug.com/myres/static/uploads/2021/11/10/0d565dfc9bdaf10073041ec281f87e62.writebug)
各个文件(夹)存放的内容如下
- ./env:运行环境,里面存放了编译完成的 X64-Release 版本可执行文件
(包括提交版和演示版,两者的区别将在 3.2.2 小节中详细介绍)和运行需要的文件(X64-Release 版本的动态链接库,模型文件,材质文件,着色器程序源文件)
- ./include:存放了 glfw、glad、assimp、glm 等工具库的头文件
- ./lib:存放静态链接库
- ./src:存放源代码
- 其他:VS2019 工程文件,Git 相关文件
## 二、模块化程序结构说明
### 简述
- 为了能够更好地使用 OpenGL 并复用已有代码,我模仿 Unity 的风格将整个工程进行模块化搭建。
- 文件目录(./code/src 目录下)
![](https://www.writebug.com/myres/static/uploads/2021/11/10/a933ac7a7e939a9840e2ae3f5f9f4882.writebug)
- 一共有组件(component)、材质(metarial)、模型(model)、物体(object)四个模块,各个模块的源文件位于文件夹中,除此之外./public 文件夹中存放了一些渲染引擎封装文件和场景生成的代码,./util 文件夹中存放了一些自定义的工具。
### 各个模块之间的组织结构
组织结构如图所示
![](https://www.writebug.com/myres/static/uploads/2021/11/10/aad47431180b59490990f12a523b8368.writebug)
### 物体
(object)
实现物体抽象和组织
- 使用树状结构组织物体,物体的各个操作将从根物体开始逐个调用至叶子节点;
- 每一个物体都可以拥有若干组件实现相应的功能;
- 每一个物体都拥有自身的着色器,多个物体可以共用同一个着色器 d) 物体可以持有实例化的模型模块用于模型加载;
- 物体的 start()初始化物体,可能向着色器传输顶点数据和 uniform 数据或控制组件向着色器传送顶点数据和 uniform 数据;
- 物体的 update()先调用自身所有组件的更新,再调用子物体的更新;
- 物体的 render()向着色器传送顶点数据和 uniform 数据或控制组件向着色器传送顶点数据和 uniform 数据;
- 在渲染循环前,物体的 start()将被调用,在渲染循环中,物体先完成 update(),再完成 render();
- 与 Unity 相似,物体树上的子物体的 Transform 组件会受到父物体Transform 组件的影响(Transform 组件控制了物体的位置、旋转欧拉角和缩放比例)
### 组件
(component)
实现物品的各个功能
- 每个组件将被挂载在物体上,实现相应的功能,一个物体不能挂载多个同类型组件,但是可以挂载多个不同类型的组件;
- 组件的 start()将在渲染循环前调用,实现组件初始化;
- 组件的 update()函数将每帧被调用,实现组件数据更新;
- 组件的 render()函数将在每帧被调用,将顶点数据和 uniform 数据传输至着色器,并执行绘图操作,实现相关的渲染功能,在所有组件完成 update()之后,再进行组件 render();
- 不同物体上的组件彼此调用:将被调用者挂载的物体作为调用者组件的初始化参数传输至调用者,由调用者通过物体获取被调用者示例进行调用;
### 材质
(metarial)
实现着色器控制器、着色器封装和纹理封装
- 着色器控制器:控制所有的着色器,并实现 uniform buffer 在各个着色器中的共享,使用手动生成的 metadata(./env/shader/controller 目录下)用于着色器控制器的初始化,着色器控制器的 metadata 中将存储 i. 着色器 metadata 的路径;
ii. uniform buffer 以及绑定点;
iii.uniform block 以及绑定点;
纹理控制器在运行时将被实例化为全局单例,控制所有着色器。
- 着色器:封装 OpenGL 对着色器的各个操作,包括传送 uniform 数据、传送纹理数据、着色器源文件的编译和链接。使用手动生成的 metadata (./code/env/shader/**目录下)用于着色器的初始化,着色器控制器的 metadata 中将存储
i.顶点着色器、几何着色器、片段着色器源文件路径;
ii. layout 数据;
iii.着色器中自定义的结构体; iv. uniform 块的内容;
- 纹理:封装 OpenGL 对纹理的各个操作,包括纹理的加载、纹理的配置、纹理的绑定。
### 模型
(model)
实现模型加载和模型渲染
- 实现方式:使用开源库 Assimp 将模型加载为若干网络面片,保存位置、法向量、纹理坐标等内容用于模型渲染。
### 渲染引擎封装文件
(./code/src/public/engine 目录下)
- 封装了鼠标输入(鼠标位置、鼠标相对与上一帧移动的距离、鼠标滚轮输入、鼠标左右按键输入)、渲染屏幕大小(长度、宽度、屏幕的实例)和渲染时间(当前时间、帧间隔)。
### 场景生成代码
(./code/src/public/scene 目录下)
- 该代码将根据需要生成物体树(实际上生成了不同的根物体),构建出需要的场景,并实现场景之间的切换,本次大作业中的场景通过函数makeWorkPieceScene()(line102 in scene.cpp)生成。
### 自定义工具
(./code/src/util 目录下)
- 开源的 stb_image 图片加载工具;
- 工件轮廓约束工具(包括 Bezier 曲线约束);
## 三、大作业程序实例结构
### 结构图
如图所示
![](https://www.writebug.com/myres/static/uploads/2021/11/10/4443affdf63833ab007f46428f88a25a.writebug)
### 各个物体(object)实现的功能如下
- 根物体(root):组织物体树、刷新颜色缓存
- 相机(camera):实现相机功能
- 点光源(point_light):为场景提供点光源 d) 背景(background):为场景提供坐标轴背景
- 刀具(cutter):刀具模型位置控制
- 模型(model):刀具模型的渲染
- 粒子系统(particle_system):实现切削时产生的粒子效果
- 工件(work_piece):圆柱体工件模型的建模及渲染
- 管理员(manager):UI 界面控制和其他各个组件的控制 j)
### UI 界面(canvas)
实现 UI 界面三、各个功能具体的实现方式
圆柱状材料的几何建模及显示、刀具模型显示、背景显示、材料旋转动画
#### 圆柱状材料几何建模
(./code/src/component/work_piece 目录下)
- 使用微元法,将圆柱体切片,每一片都是一个小圆台,按照切片逐个记录各个切片点的半径即可得到每一个小圆台的上下半径,小圆台的高度是切片的宽度。
- 示意图
![](https://www.writebug.com/myres/static/uploads/2021/11/10/480d8ec1abfe5c267fca4d79c95d0d2b.writebug)
- 在实际实现过程中,蓝色部分的宽度为 0(即两个圆台之间彼此紧密贴合),黑色部分的宽度为切片单元的宽度。
- 当对工件进行切削时,直接修改切削位置记录的圆台半径信息即可。
- 允许用户通过 UI 界面调整材料的材质、半径和长度,详细信息位于 4.1.3。
- 备注:在后文中,圆台的上下表面指圆台的圆面,圆台的侧面指圆台的非圆面。
#### 圆柱状材料的显示
(顶点数据的构建位于./code/src/component/work_piece 和着色器代码位于./code/env/shader/work_piece)
将整个圆柱状的工件材料拆分成多个小圆�
没有合适的资源?快使用搜索试试~ 我知道了~
基于C++实现切割模拟【100013159】
共875个文件
hpp:243个
h:227个
inl:142个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 187 浏览量
2023-08-11
12:40:46
上传
评论
收藏 23.12MB ZIP 举报
温馨提示
本作业是 2020-2021 学年第一学期,计算机图形学课程(SE344)期末大作业。作业共分为三个部分,第一部分说明整个程序的结构设计,第二部分按照作业评分标准详细说明各个功能具体的实现方式,第三个部分说明其他程序相关的内容(包括操作说明和编程环境说明)
资源推荐
资源详情
资源评论
收起资源包目录
基于C++实现切割模拟【100013159】 (875个子文件)
VS2019_demo.aps 1KB
CMakeDetermineCompilerABI_CXX.bin 48KB
CMakeDetermineCompilerABI_C.bin 48KB
CMakeDetermineCompilerABI_CXX.bin 48KB
CMakeDetermineCompilerABI_C.bin 48KB
glad.c 59KB
CMakeCCompilerId.c 20KB
CMakeCCompilerId.c 20KB
main.c 31B
main.c 31B
cmake.check_cache 85B
cmake.check_cache 85B
CMakeCXXCompiler.cmake 5KB
CMakeCXXCompiler.cmake 5KB
CMakeCCompiler.cmake 2KB
CMakeCCompiler.cmake 2KB
cmake_install.cmake 1KB
cmake_install.cmake 1KB
CMakeSystem.cmake 380B
CMakeSystem.cmake 380B
CMakeRCCompiler.cmake 270B
CMakeRCCompiler.cmake 270B
CMakeCXXCompilerId.cpp 20KB
CMakeCXXCompilerId.cpp 20KB
scene.cpp 18KB
CanvasObject.cpp 15KB
BezierPanel.cpp 14KB
ShaderProgram.cpp 14KB
WorkPiece.cpp 12KB
Cube.cpp 9KB
glm.cpp 8KB
UIManager.cpp 7KB
WorkManager.cpp 7KB
Model.cpp 7KB
Camera.cpp 6KB
ParticleSystem.cpp 5KB
Text.cpp 5KB
CoordinateSystemLines.cpp 5KB
Mesh.cpp 4KB
AutoColor.cpp 4KB
Object.cpp 4KB
PointLightObject.cpp 4KB
Transform.cpp 3KB
Constrain.cpp 3KB
Label.cpp 3KB
Component.cpp 3KB
main.cpp 2KB
Slider.cpp 2KB
ShaderController.cpp 2KB
Texture.cpp 2KB
ModelObject.cpp 2KB
CameraObject.cpp 2KB
AutoRotation.cpp 1KB
Button.cpp 1KB
ObjectWithShader.cpp 787B
AutoConfiguration.cpp 548B
AmbientLight.cpp 458B
SpecularLight.cpp 456B
DiffuseLight.cpp 359B
EmptyObject.cpp 244B
stb_image.cpp 58B
assimp-vc142-mt.dll 6.32MB
freetype.dll 849KB
glfw3.dll 221KB
zlib.dll 84KB
IrrXML.dll 52KB
.editorconfig 175B
演示版.exe 296KB
提交版.exe 296KB
VS2019_demo.exe 296KB
CMakeCCompilerId.exe 93KB
CMakeCXXCompilerId.exe 93KB
CMakeCCompilerId.exe 93KB
CMakeCXXCompilerId.exe 93KB
VS2019_demo.vcxproj.filters 15KB
work_piece.fs 2KB
model.fs 1KB
model.fs 1KB
light_box.fs 478B
font.fs 237B
label.fs 237B
model.fs 236B
point_light.fs 160B
bezier_panel.fs 158B
particle_system.fs 113B
coordinate_system_lines.fs 111B
box.fs 108B
canvas.fs 104B
.gitignore 4B
work_piece.gs 5KB
particle_system.gs 512B
stb_image.h 258KB
glfw3.h 209KB
freetype.h 161KB
glad.h 106KB
ttnameid.h 57KB
material.h 54KB
tttypes.h 52KB
ftdriver.h 46KB
psaux.h 42KB
共 875 条
- 1
- 2
- 3
- 4
- 5
- 6
- 9
资源评论
神仙别闹
- 粉丝: 2712
- 资源: 7668
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- AutoHotKey 2.0中文帮助文件
- 基于Docker-compose的Elasticsearch集群每个节点均是独立docker-compose配置而成源码.zip
- 目标检测-零售食品LOGO检测数据集-40000张图-+对应VOC-COCO-YOLO三种格式标签+数据集划分脚本
- 目标检测-零售食品LOGO检测数据集-30000张图-+对应VOC-COCO-YOLO三种格式标签+数据集划分脚本
- 目标检测-零售食品LOGO检测数据集-20000张图-+对应VOC-COCO-YOLO三种格式标签+数据集划分脚本
- 目标检测-零售食品LOGO检测数据集-10000张图-+对应VOC-COCO-YOLO三种格式标签+数据集划分脚本
- 基于GUI+MYSQL+JAVA图书管理系统文档说明+源码(高分大作业项目).zip
- 基于Qt使用C++实现图书管理系统源码+数据库(95分以上).zip
- 基于GUI+MYSQL+JAVA票务管理系统文档介绍+源码+数据库(高分大作业).zip
- Java项目-购物网站系统(java+Servlet+JSP+Mysql)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功