Skip to content

A Simple Computer Aid Design System. Realizing these Function:

Notifications You must be signed in to change notification settings

a617139596/SimpleCadSystem

Repository files navigation

项目环境

本项目基于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]

About

A Simple Computer Aid Design System. Realizing these Function:

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published