1、先看效果图

图一是笔者使用solidworks随手画的,并没有特殊含义,只是特意拉伸几个形态各异的孔,以凸显截取模型层面的效果,长方体整体的尺寸是600600400;
图二是程序运行的效果图,C++控制台程序,模型处理使用的是cgal库,画图用的是openGL,截取的高度是z=200的位置。(csdn图片的大小安排不如之前那么方便了,布局莫名奇妙~)

2、整体思路
1)solidworks画出三维模型,然后另存为stl文件,stl文件是用三角形面片表示的三维网格,文件存储的是点和三角形面片信息,有ASCII和binary两种存储格式,其中ASCII格式可以用记事本打开,binary用记事本打开则会乱码,这里使用ASCII格式保存,这些都可以在solidworks中设置,不过,现在主流的三位模型软件都可以生成stl文件,如UG之类的(不得不说笔者更喜欢UG呀,但是也就那样吧,用电脑画图没意思,还是手画比较惬意~);

2)写一段python脚本,将stl转换成off文件,off文件同样是三维模型的存储文本文件,不过相对stl而言,off不再局限于三角形面片,四边形五边形都可以,因为cgal的mesh模型可以直接导入off文件,所以就把stl转为off,两种文件的转换,笔者懒得自己写了,就用了另一个博主的脚本,将stl转换成off,链接在此:“https://blog.csdn.net/renjiangui/article/details/76250736”,感谢这位博主哥,不过有一点小问题,让我焦头烂额了个把小时,因为生成的off文件一经代码input,计算机就会呼呼作响,怎么也载入不了模型,当时就觉得好奇怪,一个简单的长方体模型不至于这么久吧,于是用记事本打开off文件,找啊找啊,还是找到了原因,原来这段脚本生成的off文件,第二个参数面片数,赫然写着32.0,我当时心里真的是超级无语了,面片数怎么可能是浮点数呢?改成整数当然就OK啦,后面想学cgal库的童鞋可要注意啦,这个点非常坑~~~~~~(估计也没人看,因为cgal库使用的人确实不多,而且对初学者而言,可以说是相当不友好了,虽然笔者也是初学者,哈哈);
3)有了数据,然后是写代码,应用cgal库进行模型的切割,获得轮廓;
4)使用openGL将轮廓画出来,确实挺简单的哈。

3、程序代码

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/Polygon_mesh_slicer.h>//以上是本文用到的cgal头文件
#include<GL/glut.h>//openGL头文件
#include <fstream>
#include<cmath>
#include< utility>typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_3 Point;
typedef K::Segment_3 segment;
typedef std::vector<Point> My_Polyline;
typedef CGAL::Surface_mesh<K::Point_3> Mesh;
//cgal库里面定义了很多内核,每个内核代表特定的场景,相应的场景有相应的模型
//CGAL::Exact_predicates_inexact_constructions_kernel,这个内核代表使用笛卡尔坐标系,以及
//对应的齐次坐标系,然后是定义这样的坐标系下的模型,如三维点Point_3,三维线段Segment_3,
//My_Polyline、Mesh分别表示三维轮廓以及三维网格void display() {
glClear(GL_COLOR_BUFFER_BIT);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glColor3f(0, 1, 0);for (auto K : temp_Polylines) {glBegin(GL_POLYGON);for (int i = 0; i < K.size(); ++i) {glVertex2d(K[i].x(), K[i].y());}glEnd();glFinish();}//openGL画图时用的回调函数,这里只是简单地画出轮廓;int main(int argc, char* argv[]) {const char* filename = "3.off";std::ifstream input(filename);Mesh mesh;if (!input || !(input >> mesh) || mesh.is_empty()|| !CGAL::is_triangle_mesh(mesh)) {std::cerr << "Not a valid input file." << std::endl;return 1;}//载入off模型CGAL::Polygon_mesh_slicer<Mesh, K> slicer(mesh);slicer(K::Plane_3(0, 0,1, -200), std::back_inserter(temp_Polylines));//直接定义slicer进行模型界面获取,没错,就是//这么简单,一段代码实现切平面(平面定义是ax+by+cz+d=0,所以本例的切平面就是z=200)截取模型,轮廓//点的数据全部存储在temp_Polylines中,接下来就简单地用openGL将这条轮廓画出来吧。//一些初始化操作glutInit(&argc, argv);   //初始化GLUTglutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(300, 300);glutInitWindowSize(800,800);glutCreateWindow("RT");glClearColor(0.0, 0.0, 0.0, 0);glClear(GL_COLOR_BUFFER_BIT);glPointSize(1);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluOrtho2D(-100, 700,-100, 700);
glutDisplayFunc(&display);//初始化操作到这里都是定义窗口的属性,这里调用回调函数,进行轮廓的绘画glutMainLoop();    //持续显示,当窗口改变会重新绘制图形system("pause");return 0;}

4 结语
中间隔了差不多五个月没有在CSDN上写博客了,虽然本想继续写数值分析的博客的,但是无奈数值分析期末考试考得太差了,所以,哈哈,虽然学得认真,但考试真的不能强求啊,安慰安慰自己;
中间做过目标检测的课程设计,虚拟机安装过Linux,学习数据结构和算法等等都可以写博客,但是觉得这些东西大家都写的很好,我也没必要再多费笔墨,所以就暂时隔了这么久没有在这上面写过东西了,这次是因为课题研究的关系,用到了cgal库,觉得很有意思,于是就写了这么一小段博客,其实,我还是觉得,这些文字更多是写给自己看的吧!

友情提示:安装并编译cgal库有些复杂,需要耐心!安装openGL倒是很简单,加油哦~

(一)CGAL库应用:指定平面切割模型并用openGL显示该层面轮廓相关推荐

  1. python 读取stl文件_读取STL模型 并用opengl显示

    说起STL模型,相信使用过CAD三维软件的人都不陌生, STL = STL文件,一种3D模型文件格式STL(STereo Lithography的缩写) STL文件格式是由3D SYSTEMS 公司于 ...

  2. DL框架之Keras:深度学习框架Keras框架的简介、安装(Python库)、相关概念、Keras模型使用、使用方法之详细攻略

    DL框架之Keras:深度学习框架Keras框架的简介.安装(Python库).相关概念.Keras模型使用.使用方法之详细攻略 目录 Keras的简介 1.Keras的特点 2.Keras四大特性 ...

  3. 【Pytorch神经网络理论篇】 39 Transformers库中的BERTology系列模型

    同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深 ...

  4. Gensim库生成与导入W2V模型_CodingPark编程公园

    Gensim库生成与导入W2V模型 语料目录 gensim函数库Word2Vec配置参数 gensim.models.word2vec.Word2Vec(sentences=None,size=100 ...

  5. Golang高性能日志库zap + lumberjack 日志切割组件详解

    文章篇幅较长,可以先收藏防止迷路~ 目录 zap日志库 1. why zap? 2. 简单使用 3. 自定义logger例子 4. Gin项目使用zap 6. lumberjack 日志切割组件 za ...

  6. 3dmax脚本自动化切割模型的解决方案

    前言:3dmax的支持用ms脚本去做些自动化的操作. 1. 第一步采集要切割的区域点集,如下图(我是用Unity工程) 生成的点集数据: 2. 通过脚本,加载要切割的主模型 myMax = loadM ...

  7. (二) CGAL库应用:轮廓中轴骨架生成create_interior_straight_skeleton_2()及轮廓的偏置create_offset_polygons_2()

    1 先看效果图 这是轮廓中轴的计算,中轴代表的是轮廓的骨架,在人体姿态识别.图像处理中是最基本的元素. 这是轮廓往外偏置一定距离的图示. cgal中实现轮廓中轴骨架生成及进行轮廓的偏置的是create ...

  8. (三)CGAL库应用:仿射变换(点的旋转、平移、放大)

    因为某些时候需要点的坐标进行平移.旋转.缩放,cgal库也以kernel object的形式提供了仿射变换,就和点.线段.向量.矩形一样,仿射变换也是这样类似的几何kernel object,定义在头 ...

  9. 基于爬虫+人脸识别库实现指定人物自动采集

    基于爬虫+人脸识别库实现指定人物自动采集 项目目的,为后面基于GAN的换脸大法做准备 更新 无需多张照片只需要一张原照就可以了 前言 如今大数据时代下的深度学习发展的火热,但是总是发现找不到合适的自己 ...

  10. 记录一个数学知识:求向量在指定平面上的垂直向量

    目标: 求向量在指定平面上的垂直向量 数学方法: 在数学方法上,求一个垂直向量的方法: 例如:向量A=(x1,y1)与向量B=(x2,y2)垂直则有x1x2+y1y2=0,进而可以解出一系列答案. 由 ...

最新文章

  1. pythongetattribute_对Github上Python开源项目进行分析时遇到的一个AttributeError的解释及其解决方法。...
  2. Linux下常用服务的端口号超详细整理
  3. apache2.4.6支不支持jsp_Spring Boot中文参考指南(2.1.6)50、Kotlin 支持
  4. C/C++学习之路_八: 复合类型
  5. MySQL服务读取参数文件my.cnf的规律研究探索
  6. 解密SVM系列(二):SVM的理论基础(转载)
  7. 不得罪人 VS 不怕得罪人
  8. python中area是什么意思_Python案例 下面这个代码if item.area self.free_area:中item.area是在哪里定义的呢?...
  9. [译]直观理解信息论
  10. 安徽初二计算机考试试题,安徽省八年级信息技术会考题库
  11. python爬虫系列二:爬取糗百成人的妹子图片(requests+正则)
  12. win10任务栏透明_5 款 Windows 任务栏增强工具推荐
  13. 【指标异动】贡献度定量归因之法
  14. java average_Java IntStream average()用法及代码示例
  15. oracle 采购模块表信息,EBS采购(PO)模块常用表
  16. 新手小白如何购买阿里云服务器(2021新版详细图文教程)
  17. WebAssembly:2023年的5个预测
  18. CF919C Seat Arrangements
  19. Spring @Scheduled 使用详解
  20. JavaSE语法(3)——【逻辑控制:各种分支循环语句】

热门文章

  1. HP M1136打印机 Mac驱动程序分享
  2. SSM社区医院卫生所病人患者随访信息管理javaweb网站系统设计与实现
  3. java游戏繁体字名字_游戏繁体字名字
  4. 继电保护整定值计算软件_通用型继电保护整定计算软件的分析.pdf
  5. Petalinux移除module或app的方法
  6. 修改django后台管理员密码
  7. 各种hadoop原理图
  8. aspose-cad dwg转pdf dwg转png dwg转svg
  9. 解决Nvidia 显卡驱动安装失败的方法
  10. 怎样用计算机合并视频,电脑视频合并软件 , 怎样把多个视频合成为一个