本项目基于win10平台使用Visiual Studio 2019工具进行编译,代码编写使用了glfw和glad库,由于glfw库可能存在环境配置问题,因此在运行项目前,请确保环境已经配置成功。
如存在环境配置问题,请参考LearnOpenGL。
本项目采用glfw和glad库进行编写,并且借助了poly2tri
库对多边形网格进行三角化,其中DataStructure.h
中定义了半边数据结构和其他辅助数据结构,operation.h
中定义了欧拉操作的实现方式,main.cpp
文件作为程序入口文件,定义了创建模式的创建过程、读取模式文件的读取过程以及openGL的初始化和显示模块。
程序提供了两种模式,通过键盘输入1或2选择运行:
创建模式
此模式通过键入1进入,在此模式下程序将从OperationInput.txt
文件中进行操作数据的读取,并且使用欧拉操作从零开始创建一个实体,创建完毕后,程序会将实体的各种数据,例如顶点、环、面信息默认输出至Output.brp
文件中,此文件可直接被读取模式
读取运行。
OperationInput.txt
文件的注释如下:
//这是一组默认给出的操作数据
4 //初始顶点个数为4,考虑到后续的扫成操作,请按成面后的法向与扫成方向同向(锐角)的顺序给出,否则初始体的面法向将反向
4 0 0
12 0 0
12 8 0
4 8 0
8 //扫成距离
0 0 1 //扫成方向
3 //创建3个内环
4 //内环1的顶点数,内环可任意环顺序给出
5 1 0
5 2 0
6 2 0
6 1 0
4 //扫成距离
0 0 -1 //扫成方向
4 //内环2的顶点数,内环可任意环顺序给出
7 1 0
8 1 0
8 2 0
7 2 0
8
0 0 1
4 //内环3的顶点数,内环可任意环顺序给出
9 1 8
9 2 8
10 2 8
10 1 8
4
0 0 -1
为了避免孤立内环,每次创建内环都默认跟随一个扫成操作,内环创建会自动识别与其在同一平面的所在面,但无法保证在定义的平面边界内。除此之外,若扫成操作后内环面与对面重合将会自行形成通孔,但为方便此程序并未考虑到内环扫成超限的问题,因此有效性请操作时自行保证。
请勿设置扫成距离为0或者扫成方向为零向量,这将导致程序运行异常!
读取模式
此操作通过键入2进入,读取模式默认将从breps.brp
文件中读取实体数据,并且进行显示。读取的文件可以来自于创建模式输出的Output.brp
文件。
以上述操作输出的Output.brp
为例,文件注释如下:
BRP //标识符,请保留
32 24 20 1 //分别代表顶点个数、环个数、面个数以及实体个数
4 0 0 //32个顶点数据,按编号顺序给出,编号从0开始
12 0 0
12 8 0
4 8 0
4 8 8
4 0 8
12 0 8
12 8 8
5 1 0
5 2 0
6 2 0
6 1 0
6 1 -4
5 1 -4
5 2 -4
6 2 -4
7 1 0
8 1 0
8 2 0
7 2 0
7 1 8
7 2 8
8 2 8
8 1 8
9 1 8
9 2 8
10 2 8
10 1 8
9 1 4
10 1 4
10 2 4
9 2 4
4 27 24 25 26 //24个环数据,环按编号顺序给出,编号从0开始
4 15 12 13 14 //第一个值表示环的顶点个数,后续给出顶点索引值
4 5 4 3 0
4 6 5 0 1
4 7 6 1 2
4 4 7 2 3
4 19 16 17 18
4 8 11 10 9
4 13 12 11 8
4 14 13 8 9
4 15 14 9 10
4 12 15 10 11
4 2 1 0 3
4 23 20 21 22
4 21 20 16 19
4 22 21 19 18
4 23 22 18 17
4 20 23 17 16
4 6 7 4 5
4 31 28 29 30
4 29 28 24 27
4 30 29 27 26
4 31 30 26 25
4 28 31 25 24
12 2 7 6 0 //20个面数据,面按编号顺序给出,编号从0开始
18 2 13 0 0 //第一个值表示外环索引,第二个值表示内环个数,然后按顺序给出环索引,最后一个值为体号
2 0 0
3 0 0
4 0 0
5 0 0
1 0 0
8 0 0
9 0 0
10 0 0
11 0 0
14 0 0
15 0 0
16 0 0
17 0 0
19 0 0
20 0 0
21 0 0
22 0 0
23 0 0
尽管在文件中采取了体号的概念,但是在程序编写时并未考虑到一次性创建多个实体的情况,因此将始终为0值。
若程序运行正常,将自动跳出OpenGL窗口,进入到显示模式。本程序中定义了多个功能按键操控窗口的显示,按键定义如下:
按键 | 作用 |
---|---|
w |
镜头前进 |
s |
镜头后退 |
a |
镜头左移 |
d |
镜头右移 |
tab |
开启/关闭背面剔除功能 |
1 |
实体显示模式 |
2 |
网格化显示模式 |
3 |
B-Rep显示模式 |
除此之外,窗口会自动捕捉鼠标,依据鼠标移动来设定镜头朝向。默认的显示模式是实体显示模式,显示模式可以通过字母上方的数字键来进行切换。
实体显示模式
采用了Phong光照模型对实体进行了简单的渲染,但是并没有实现阴影投射的功能,因此在效果上可能存在不足。
网格化显示模式
将绘制的三角网格绘制出来,在此模式下可以利用tab
键进行背面剔除功能的关闭和开启,通过查看面的剔除情况可以有效判断面的朝向。
在使用
tab
键进行背面剔除功能的开启或关闭时,显示效果在网格化模式中才可展现。
B-rep显示模式
绘制出B-rep模式中面的外环和内环表示,其中外环使用明亮的橘色进行绘制,而内环则采用蓝色进行绘制。
关于代码如有疑惑请直接查看注释或发送邮件至[email protected]。