如何将顶点数据保存为STL文件?

2023-05-16

stl 文件是在计算机图形应用系统中,用于表示三角形网格的一种文件格式。 它的文件格式非常简单, 应用很广泛。STL是最多快速模型系统所应用的标准文件类型。STL是用三角网格来表现3D CAD模型。
STL只能用来表示封闭的面或者体,stl文件有两种:一种是ASCII明码格式,另一种是二进制格式。注:文字描述部分,大部分应用了百度百科。
一、STL文件的格式
(1)ASCII明码格式
ASCII码格式的STL文件逐行给出三角面片的几何信息,每一行以1个或2个关键字开头。 在STL文件中的三角面片的信息单元 facet 是一个带矢量方向的三角面片,STL三维模型就是由一系列这样的三角面片构成。 整个STL文件的首行给出了文件路径及文件名。 在一个 STL文件中,每一个facet由7 行数据组成, facet normal 是三角面片指向实体外部的法矢量坐标, outer loop 说明随后的3行数据分别是三角面片的3个顶点坐标,3顶点沿指向实体外部的法矢量方向逆时针排列。ASCII格式的STL 文件结构如下:
//中括号里面的是要填充的内容
solid   [filename]     //文件名,可以是任何字符
facet   normal  [i j k] //面的法线,i、j、k为三个分量,各分量之间用空格隔开,不能用逗号隔开
outor   loop
vertex  [x y z] //三角面片的第一个点,x、y、z三个坐标之间要用空格隔开
vertex  [x y z] //三角面片的第二个点
vertex  [x y z] //三角面片的第三个点
endloop
endfacet //完成一个三角面片的定义
、、、、 //其他facet
endsolid [filename] //完成一个stl文件的定义
示例:
在电脑上新建一个txt文件,然后编辑。编辑完了之后保存,并将文件后缀名改为stl,即可完成一个创建了一个stl文件。如下图,利用文本编辑器将一个四面体的几何数据保存到文件中。
文件做好之后,使用window系统自带的Print 3D 或者View 3D软件进行打开测试,显示结果如下:
以上一个例子是手动创建一个stl文件,用来保存总共四个顶点的四面体。如果有大量的数据,这样做肯定是不行的。为此,根据stl文件的定义,用C语言编写了生成
stl文件的代码。代码仍然是保存一个简单的四面体数据。代码如下:
#include<stdio.h>
#include<string.h>

char head[128];//文件头

//法线
struct Normal
{
	float i;
	float j;
	float k;
};

//点
struct Point
{
	float x;
	float y;
	float z;
};

//面
struct Face
{
	Normal normal;
	Point p1;
	Point p2;
	Point p3;
};

int main()
{
	char partName[64];

	printf("请输入部件的名称:\n");
	gets_s(partName);

	//下面三条代码生成一个文件头
	strcpy(head, "solid ");
	strcat(head, partName);

	//四面体的四个面
	Face face[4];

	face[0].normal = { 0,1,0 };
	face[0].p1 = { 0,0,0 };
	face[0].p2 = { 0,0,-100 };
	face[0].p3 = { 100,0,0 };

	face[1].normal = { -1,0,0 };
	face[1].p1 = { 0,0,0 };
	face[1].p2 = { 0,100,0 };
	face[1].p3 = { 0,0,-100 };

	face[2].normal = { 0,0,1 };
	face[2].p1 = { 0,0,0 };
	face[2].p2 = { 100,0,0 };
	face[2].p3 = { 0,100,0 };

	face[3].normal = { 1,1,-1 };
	face[3].p1 = { 0,100,0 };
	face[3].p2 = { 100,0,0 };
	face[3].p3 = { 0,0,-100 };

	FILE *fp;

	fp = fopen("part.stl", "w");

	if (fp != NULL)
	{
		fprintf(fp, "%s\n", head);//先写入文件头

		//循环写入法线、顶点等数据
		for (int i = 0;i < 4;i++)
		{
			fprintf(fp, "%s %f %f %f\n", "facet normal", face[i].normal.i, face[i].normal.j, face[i].normal.k);
			fprintf(fp, "%s\n", "outor loop");
			fprintf(fp, "%s %f %f %f\n", "vertex ", face[i].p1.x, face[i].p1.y, face[i].p1.z);
			fprintf(fp, "%s %f %f %f\n", "vertex ", face[i].p2.x, face[i].p2.y, face[i].p2.z);
			fprintf(fp, "%s %f %f %f\n", "vertex ", face[i].p3.x, face[i].p3.y, face[i].p3.z);
			fprintf(fp, "%s\n", "endloop");
			fprintf(fp, "%s\n", "endfacet");
		}

		fprintf(fp, "%s %s\n", "endsolid", partName);//写入文件尾
		printf("成功生成stl文件");

	}
	
	return 0;
}

该程序生成了一个名为part.stl的文件。用记事本打开可以看到里面的文本:
二、STL的二进制格式
二进制STL文件用固定的字节数来给出三角面片的几何信息。 
文件起始的80个字节是文件头,用于存贮文件名; 
紧接着用 4 个字节的整数来描述模型的三角面片个数, 后面逐个给出每个三角面片的几何信息。每个三角面片占用固定的50个字节,依次是: 
3个4字节浮点数(角面片的法矢量) 
3个4字节浮点数(1个顶点的坐标) 
3个4字节浮点数(2个顶点的坐标) 
3个4字节浮点数(3个顶点的坐标)
  三角面片的最后2个字节用来描述三角面片的属性信息。 一个完整二进制STL文件的大小为三角形面片数乘以 50再加上84个字节。
  用C语言去定义二进制的STL文件如下:
char   fileName[80]; //文件名,固定为80个字节,可以是任何字符
int      faceNum; //三角片面的数目,固定4个字节
float  normal[3]; //法线,三个浮点型的数据,共12字节
float  vertex1[3]; //顶点一,共12字节
float  vertex2[3]; //顶点二,共12字节
float  vertex3[3]; //顶点三,共12字节
char  reserve[2]; //保留项,一般用不到,只是预留两字节的位置
、、、、、、、、、   //其他三角片面
一个stl文件至少具有一个三角片面,一个三角片面固定为50个字节,因此,一个stl文件至少具有84+50=134个字节。三角片面越多,文件越大。
下面是用C语言生成的二进制格式STL文件的例子:将一个四面体几何数据保存为二进制的stl。
#include<stdio.h>

//文件头,共84字节
struct Head
{
	char fileName[80];//零件名称
	int  faceNum;//面的数目
};

//点,三个float类型的,大小为12字节
struct Point
{
	float x;
	float y;
	float z;
};

//法线
struct Normal
{
	float i;
	float j;
	float k;
};

//三角面,由一个法线,三个点,和一个两字节的保留项,一共50字节
struct Face
{
	 Normal normal;
	 Point  p1;
	 Point  p2;
	 Point  p3;
	 char  info[2];//保留数据,可以不用管
};

int main()
{
	Head head;
	printf("请输入零件名:");
	gets_s(head.fileName);
	head.faceNum = 4;//三角面的数目为四
	Face face1,face2,face3,face4;//四个面

	face1.normal = { 0,1,0 };
	face1.p1 = { 0,0,0 };
	face1.p2 = { 0,0,-100 };
	face1.p3 = { 100,0,0 };

	face2.normal = { -1,0,0 };
	face2.p1 = { 0,0,0 };
	face2.p2 = { 0,100,0 };
	face2.p3 = { 0,0,-100 };

	face3.normal = { 0,0,1 };
	face3.p1 = { 0,0,0 };
	face3.p2 = { 100,0,0 };
	face3.p3 = { 0,100,0 };

	face4.normal = { 1,1,-1 };
	face4.p1 = { 0,100,0 };
	face4.p2 = { 100,0,0 };
	face4.p3 = { 0,0,-100 };

	FILE *fp;
	errno_t err;

	err = fopen_s(&fp, "myStl.stl", "wb");

	if (err == 0)
	{
		fwrite(&head,84, 1, fp);
		fwrite(&face1, 50, 1, fp);
		fwrite(&face2, 50, 1, fp);
		fwrite(&face3, 50, 1, fp);
		fwrite(&face4, 50, 1, fp);
		printf("生成文件成功!");
		fclose(fp);
	}
	else
	{
		printf("无法创建文件");
	}
	return 0;
}

生成的文件名为mySTL.stl,用SolidWorks三维绘图软件打开效果如下:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将顶点数据保存为STL文件? 的相关文章

  • 上位机串口数据检验方式(一)——校验和

    最近还是在写上位机软件 xff0c 还是有一堆问题 xff0c 因为是第一次做这个东西 xff0c 有些东西只能到论坛上来查 xff0c 最近做到了数据通信 xff0c 刚开始没有想到数据协议这些东西 xff0c 现在涉及到了 xff0c
  • c#上位机开发(三)——串口通信上位机开发1

    今天主要做一个跟市面上差不多的稍微简单点的上位机软件 xff0c 效果如下图所示 1 功能概述 xff08 1 xff09 端口扫描 xff0c 主要是扫描出可用的端口用来连接 xff08 2 xff09 波特率的选择 xff0c 使用一个
  • 使用python执行外部命令subprocess

    1 使用python执行外部命令subprocess subprocess模块是Python自带的模块 xff0c 无须再另行安装 xff0c 它主要用来取代一些旧的模块或方法 xff0c 如os system os spawn os po
  • #Qt on android#使用Qt 获取GPS信号

    注意事项 xff1a 1 Qt版本一定要大于等于5 3 xff0c 因为低于5 3的版本对于android系统来说并不能成功获取gps信号 2 环境正确搭建 xff0c 一定要注意 xff01 构建 xff08 build xff09 的系
  • 2023年TI杯全国大学生电子设计竞赛通知正式发布

    关于组织2023年 全国大学生电子设计竞赛的通知 xff08 电组字 2023 01号 xff09 各赛区组织委员会 各有关高等学校 xff1a 全国大学生电子设计竞赛 xff08 以下简称全国竞赛 xff09 组委会在认真总结往届电子设计
  • HTTPClient调用https请求,通过基本认证用户名密码(Basic Auth)

    本文来源是Apache官网例子 xff1a httpcomponents client ClientAuthentication java at 4 5 x apache httpcomponents client GitHub 之前找过很
  • c中结构体数据对齐问题

    1 为什么需要数据对齐 提升CPU读取数据的效率 CPU每次都是从以4字节 xff08 32位CPU xff09 或是8字节 xff08 64位CPU xff09 的整数倍的内存地址中读进数据的 xff08 例如32位的只能0x000000
  • js打开新窗口的方法总结

    Window open 方法 完整代码 window span class token punctuation span span class token function open span span class token punctu
  • 一文详解堆栈(二)——内存堆与内存栈

    前言 xff1a 我们经常听见一个概念 xff0c 堆 xff08 heap xff09 和栈 xff08 stack xff09 xff0c 其实在数据结构中也有同样的这两个概念 xff0c 但是这和内存的堆栈是不一样的东西哦 xff0c
  • 《动手学ROS2》3.2ROS2工作空间介绍

    本系列教程作者 xff1a 小鱼 公众号 xff1a 鱼香ROS QQ交流群 xff1a 139707339 教学视频地址 xff1a 小鱼的B站 完整文档地址 xff1a 鱼香ROS官网 版权声明 xff1a 如非允许禁止转载与商业用途
  • Ubuntu18.04 realsenseD435i深度摄像头外参标定的问题

    Ubuntu18 04 realsenseD435i深度摄像头外参标定的问题 鱼香ROS介绍 xff1a 鱼香ROS是由机器人爱好者共同组成的社区 xff0c 欢迎一起参与机器人技术交流 进群加V xff1a fishros2048 文章信
  • STM-32:USART串口协议、串口外设—数据发送/数据发送+接收

    目录 一 串口通信1 1通信接口1 2串口通信1 2 1简介1 2 2硬件电路1 2 3串口参数及时序 二 STM32的USART外设2 1USART简介2 2USART框图 三 数据传输3 1数据帧3 2输入数据策略3 2 1起始位侦测3
  • 大疆M3508、M2006必备CAN总线知识与配置方法

    大疆M3508 M2006必备CAN总线知识与配置方法 文章目录 大疆M3508 M2006必备CAN总线知识与配置方法前言 xff1a 0x00 需要 额外的 CAN收发器 xff01 xff01 xff01 0x01 硬件层面分析为什么
  • 换个角度聊聊PID吧,很干。

    01 前言 大家好 xff0c 前面发了几篇关于PID的文章 xff1a 点击图片即可阅读 教你10分钟完成智能小车的PID调速 快速调试PID参数的3种方法 02 自动控制系统 在直流有刷电机的基础驱动中 xff0c 如果电机负载不变 x
  • linux发起http请求,GET、POST

    GET请求 curl 推荐 curl v 34 https test com login username 61 tyw amp password 61 123 34 curl 34 https test com 34 URL指向的是一个文
  • VSCode对C++的DEBUG调试配置

    C 43 43 vscode上的调试配置 1 调试配置2 修改编译模式 按照本 的流程可在vscode平台上实现像在windows系统下VS调试C 43 43 程序的效果 1 调试配置 当写好代码和 CMakeLists txt 之后 xf
  • VSCode的C/C++扩展功能

    VSCode的C C 43 43 扩展功能 1 在 Linux 上 使用 C 43 43 1 1 创建 Hello World1 2 探索 IntelliSense1 3 构造 helloworld cpp1 3 1 运行 build1 3
  • 从源码理解智能指针(二)—— shared_ptr、weak_ptr

    目录 计数器 Ref count Ref count del Ref count del alloc Ptr base Ptr base的成员变量 构造函数 赋值重载 获取引用计数 减少引用计数 Reset函数 Resetw函数 share
  • muduo源码学习(1):异步日志——日志消息的存储及输出

    目录 前言 日志存储的实现 日志输出的实现 总结 前言 muduo中的日志 xff0c 是诊断日志 用于将代码运行时的重要信息进行保存 xff0c 方便故障诊断和追踪 日志一般有两种 xff0c 一种是同步日志 xff0c 一种是异步日志
  • muduo源码学习(2):异步日志——异步日志的实现

    目录 什么是异步日志 异步日志的实现 前端与后端 前端与后端的交互 资源回收 后端与日志文件 滚动日志 自动flush缓冲区 开启异步日志功能 总结 在前文中分析了日志消息的存储和输出 xff0c 不过并没有涉及到异步日志 xff0c 下面

随机推荐

  • muduo异步日志——core dump后查找还未来得及写出的日志

    目录 前言 生成core文件 gdb调试Core文件 前言 通过异步日志的实现可以知道 xff0c 日志消息并不是生成后立刻就会写出 xff0c 而是先存放在前端缓冲区currentBuffer或者前端缓冲区队列buffers中 xff0c
  • C++知识积累:成员函数运算符重载与非成员函数运算符重载

    运算符重载 xff0c 是C 43 43 多态的表现形式之一 xff0c 可以通过对运算符进行重载来实现运算符特定的功能 运算符重载一般具有以下原则 xff1a xff08 1 xff09 不可重载不存在的运算符 xff0c 如重载 来表示
  • (二叉树)二叉树的最近公共祖先

    题目描述 给定一个二叉树 找到该树中两个指定节点的最近公共祖先 百度百科中最近公共祖先的定义为 xff1a 对于有根树 T 的两个结点 p q xff0c 最近公共祖先表示为一个结点 x xff0c 满足 x 是 p q 的祖先且 x 的深
  • 有符号数、无符号数理解

    大家都知道 xff0c 在C C 43 43 中 xff0c 对于w位编译器 xff0c 其有符号数表示的数值范围为 2 w 1 2 w 1 1 xff0c 无符号数表示的数值范围为0 2 w 1 xff0c 举个例子 xff0c 在16位
  • ​PCB的 “ 黑科技 ” ,应该是这个。

    大家好 xff0c 我是张巧龙 xff0c 前段时间炒的很火的折叠屏手机不知道大家还记得不 xff1f 折叠屏手机之所以这么具有 34 韧性 34 xff0c 全靠背后的柔性电路板 FlexiblePrintedCircuit xff0c
  • 指针数组、数组指针——用指针访问数组方法总结

    目录 1 数组元素的访问 2 通过指针访问数组 2 1 通过指针访问一维数组 2 2 通过指针访问二维数组 2 2 1 指向元素的指针 2 2 2 指向每一行的指针 xff08 指针数组方式 xff09 2 2 3 指向整个数组的指针 xf
  • C++知识积累:如何获取虚函数表以及虚函数地址

    如果一个类中存在虚函数的话 xff0c 那么编译器就会为这个类生成一个虚函数表 xff0c 这个虚函数表中按照个虚函数的声明顺序存放了各个虚函数的地址 xff0c 需要注意的是 xff0c 这个虚函数表并不存在于类中 xff0c 而对于这个
  • C++多线程:互斥锁

    目录 1 前言 2 互斥锁 2 1 互斥锁的特点 2 2 互斥锁的使用 2 2 std lock guard 3 死锁 3 1 死锁的含义 3 2 死锁的例子 3 3 死锁的解决方法 1 前言 比如说我们现在以一个list容器来模仿一个消息
  • Linux下MySQL中文显示问号乱码问题解决

    本文主要针对于Linux下MySQL插入中文数据显示问号的问题 网上一种普遍使用的方法是修改 etc my cnf文件 xff08 我的这个文件位于 etc mysql my cnf xff09 xff0c 修改步骤如下 xff1a 1 在
  • Linux下更改文件权限

    目录 查看文件权限 修改文件权限 查看文件权限 查看文件权限可以通过ls l命令查看 xff0c 如下所示 xff1a 如果只想查看某一个文件的权限 xff0c 可以使用grep xff0c 如下所示 xff1a 可以发现 xff0c 每一
  • 【蓝桥杯算法提高VIP-开灯游戏(两种超易理懂解法:暴力/位操作(切换位))(纯正C语言代码)】

    蓝桥杯算法提高VIP 开灯游戏 题目描述 有9盏灯与9个开关 xff0c 编号都是1 9 每个开关能控制若干盏灯 xff0c 按下一次会改变其控制的灯的状态 亮的变成不亮 xff0c 不亮变成亮的 具体如下 xff1a 第一个开关控制第二
  • C语言二叉查找树(图文详解)(超详细)

    二叉查找树 本人在第一次学习二叉树的时候 感觉很懵懵懂懂 勉强知道了二叉树的结构和查找方式 但要我自己去动手写的时候 可是难上加难 所以这里我用干货 43 实际例子的方式让你上手二叉树 这个例子几乎可以套用到所有链式结构问题 我们开始吧 文
  • STM32F4中断(Interrupt)详解

    STM32F4中断 Interrupt 详解 文章目录 STM32F4中断 Interrupt 详解一 中断是什么 二 STM32的中断体系2 1 STM32的中断分类2 2 STM32中断优先级2 2 1 抢占优先级2 2 2 响应优先级
  • 基于RK3399&ESP8285自动售货柜项目—ESP8266(8285)程序编写与烧录

    基于RK3399 amp ESP8285自动售货柜项目 ESP8266 8285 程序编写与烧录 本系列文章讲详细讲解该基于RK3399及ESP8285自动售货柜的完整实现方法 xff0c 从硬件连接到网络通信再到软件实现 xff0c 本产
  • Windows10安装OpenCV4.1.0+opencv_contrib

    Windows10安装OpenCV4 1 0 43 opencv contrib 文章目录 Windows10安装OpenCV4 1 0 43 opencv contrib一 Visual Studio 2015安装二 下载和安装OpenC
  • 用MATLAB来做智能小车的建模与仿真

    两种智能小车的构造简介 在市面上常见的两种智能小车都是基于轮式的 xff0c 在某宝上面卖的最多的 xff0c 各位在学生时代拿来应付课程设计和毕业设计用的各种小车分为两种 1 后轮驱动 xff0c 前轮阿克曼转向的 xff0c 通常后轴通
  • Qt编写网络调试助手(TCP客户端+TCP服务端+UDP服务端)

    Qt编写网络调试助手 xff08 TCP客户端 43 TCP服务端 43 UDP服务端 xff09 终极版开源 飞扬青云 博客园
  • RKNN-Toolkit模型转换并在Rockchip NPU推理并进行性能评估

    RKNN Toolkit转换Tensorflow模型至Rockchip NPU推理并进行性能评估 文章目录 RKNN Toolkit转换Tensorflow模型至Rockchip NPU推理并进行性能评估一 基本知识二 环境部署2 1环境准
  • Redis Stream终端间使用流消费者组通信

    redis stream终端间使用流消费者组通信 附redis消息队列和消费者相关命令表 消息队列的相关命令 xff1a XADD xff1a 添加消息到末尾 xff08 生产消息 xff09 XTRIM xff1a 对流进行修剪 xff0
  • 如何将顶点数据保存为STL文件?

    stl 文件是在计算机图形应用系统中 xff0c 用于表示三角形网格的一种文件格式 它的文件格式非常简单 xff0c 应用很广泛 STL是最多快速模型系统所应用的标准文件类型 STL是用三角网格来表现3D CAD模型 STL只能用来表示封闭