stl格式-3D三角形

news2024/11/25 21:23:15

文章目录

  • 什么是stl文件?
  • 格式首选
  • stl的语法
    • 1.这是一个stl格式的文件:(ASCII码)
    • 2.下面先举个例子(难度略微提示)
      • 补充:关于\<\<我试了一下:这个法线你随便写好像也没问题\>>
    • 3.来个立方体
    • 4.最后再写一个由三个直角形组成的立方体(直棱锥)
    • 5.amend 修正(右手定则,法线向外)

什么是stl文件?

首先说一下,这个stl不是cpp中的stl库.

指的是以.stl结尾的文件(S T ereo L ithography)

STL(Standard Tessellation Language):STL是一种用于表示三角网格的一种文件格式,它将模型表示为一系列连接的三角形。STL文件通常分为两种类型:ASCII二进制。ASCII STL文件使用文本表示,包含逐个定义三角面片的数据,而二进制STL文件则使用二进制编码,更紧凑且通常更常用。STL文件广泛用于3D打印和计算机辅助设计(CAD)等领域。

格式首选

STL 文件格式的 ASCII 版本是用纯 ASCII 编写的。但是,由于文件格式较大,因此没有选择该文件格式作为使用的首选格式。(但是二进制无法编写,我们使用ASCII码来编写)

以下从文件大小,读写速度,数据精度,文件解析效率四个方面来解释二进制格式的优势:

  1. 文件大小:二进制格式的STL文件通常比ASCII格式更小,因为二进制格式使用固定长度的数据表示,而ASCII格式使用可变长度的文本表示。这意味着二进制格式可以更有效地存储模型的几何数据,减少存储和传输的开销。
  2. 读写速度:由于二进制格式的数据是以二进制编码存储的,相比于ASCII格式,读取和写入二进制STL文件的速度更快。二进制数据可以直接按字节进行读写,无需进行解析和转换操作,因此在处理大型模型或需要频繁读写的场景下,二进制格式能提供更高的效率。
  3. 数据精度:二进制格式的STL文件可以提供更高的数据精度。由于ASCII格式使用文本表示数字,存在精度损失和舍入误差的问题。而二进制格式使用固定大小的浮点数表示,可以保持更高的精度,并减少舍入误差。
  4. 文件解析效率:由于二进制格式的STL文件直接存储了几何数据的二进制表示,解析器可以更快速地读取和处理文件。相比之下,解析ASCII格式的STL文件需要进行文本解析和字符串处理,可能会更耗时。

stl的语法

1.这是一个stl格式的文件:(ASCII码)

solid name
    facet normal ni nj nk
        outer loop
            vertex v1x v1y v1z
            vertex v2x v2y v2z
            vertex v3x v3y v3z
        endloop
    endfacet
endsolid name
聪明的小伙伴应该意识到了:
ni nj nk
与
v1x v1y v1z
v2x v2y v2z
v3x v3y v3z
就是我们要填入的参数
{
ni nj nk代表法线的方向
v1x v1y v1z是顶点1的坐标,
然后是顶点2,顶点3的坐标

然后法线(高一知识终于用到了,然后考研也考)的方向可以通过计算三个顶点的叉乘得到.[这是一种方法(还有就是,如果你不会求法线也不要怕,后面写的很详细)]

或者是你已经有了一个具体的模型,然后你可以使用Blender软件来获取相关数据[这是第二种方法,在这篇文章,咱们仅仅只谈方法一,因为方法二是使用轮子,现在咱们来沉下心来造轮子!]
}

然后name想填啥就填啥,只要保证solid name与endsolid name保持一致就OK了!!!

2.下面先举个例子(难度略微提示)

(其实难度也不是很高,难度在于:网上还没有中文资料,大多数都是英文的,然后即使翻译过来,如果不是专业的翻译人员,翻译过来的意思也不是那么通俗易懂)

现在假设有一个平面三角形,顶点坐标为:
顶点一:(0,0,0)
顶点二:(1,0,0)
顶点三:(0,1,0)
(这个也很简单,大家可以在纸上画一下)
然后我们就要填入数据了!

首先,计算就是计算法线的方向.法线的方向可以通过计算任意两条边的叉积得到.
我们计算顶点2和顶点1以及顶点3与顶点1的向量:
向量a = (1,0,0)-(0,0,0) = (1,0,0) = (a₁,a₂,a₃)
向量b = (0,1,0)-(0,0,0) = (0,1,0) = (b₁,b₂,b₃)

法线的方向就直接axb得到:

ni nj nk = axb = (0,0,1)

然后,至于为啥 (1,0,0) X X X (0,1,0) = (0,0,1)?

根据叉积的计算公式为:23 32, 31 13,12 21
a × b a × b a×b = ( a 2 b 3 a₂b₃ a2b3- a 3 b 2 a₃b₂ a3b2, a 3 b 1 a₃b₁ a3b1 - a 1 b 3 a₁b₃ a1b3, a 1 b 2 a₁b₂ a1b2 - a 2 b 1 a₂b₁ a2b1)

=(0x0-0x1, 0x0-1x0, 1x1-0x0)

=(0, 0 ,1)

(然后,再强调一下,叉积和矩阵相乘是两回事!!!)

至于三维的叉积公式怎么记?可以看下图:记住23 31 自然就记住了全部了

在这里插入图片描述

因此,法线就是(0,0,1)
所以,我们完成的stl文件格式如下:

solid test
	facet normal 0 0 1         //我试了一下:这个法线你随便写好像也没问题
	outer loop
	vertx 0 0 0
	vertx 1 0 0
	vertx 0 1 0
	endloop
	endfacet
endsolid test

补充:关于<<我试了一下:这个法线你随便写好像也没问题>>

法线你随便写,确实还是可以正常显示stl的3d图像的,但是颜色好像变深或者变浅了

这就是涉及到法线的作用了:

STL文件中的法线向量是用于确定三角面片的朝向和光照效果的。法线向量指示了面片的表面方向,使软件能够确定如何着色和渲染模型

当你随意更改法线向量时,STL文件仍然可以显示出来,但视觉效果可能会发生变化。由于法线向量的改变,渲染引擎可能会根据新的法线方向重新计算面片的光照效果,导致颜色变深或变浅。

然而,这种方式并不代表结果是正确的或符合实际形状的。正确的法线方向对于准确显示和渲染三维模型非常重要。如果法线方向错误或不一致,可能会导致不自然的阴影、光照效果不良或渲染问题。

因此,为了正确呈现和渲染模型,请确保为每个面片定义正确的法线方向,并确保它们与实际表面法线方向相匹配。这样可以确保模型在渲染时获得更准确的外观和光照效果。

3.来个立方体

其实一组这个,就代表一个立方体

facet normal ni nj nk
    outer loop
        vertex v1x v1y v1z
        vertex v2x v2y v2z
        vertex v3x v3y v3z
    endloop
endfacet


然后一个正方形需要两组,所以就是十二组
solid test
  facet normal 0 0 1
    outer loop
      vertex 0 0 0
      vertex 1 0 0
      vertex 0 1 0
    endloop
  endfacet
  facet normal 0 0 1
    outer loop
      vertex 1 1 0
      vertex 0 1 0
      vertex 1 0 0
    endloop
  endfacet
  facet normal 0 0 -1
    outer loop
      vertex 0 0 1
      vertex 0 1 1
      vertex 1 0 1
    endloop
  endfacet
  facet normal 0 0 -1
    outer loop
      vertex 1 1 1
      vertex 1 0 1
      vertex 0 1 1
    endloop
  endfacet
  facet normal 0 1 0
    outer loop
      vertex 0 1 0
      vertex 1 1 1
      vertex 0 1 1
    endloop
  endfacet
  facet normal 0 1 0
    outer loop
      vertex 1 1 0
      vertex 0 1 0
      vertex 1 1 1
    endloop
  endfacet
  facet normal 0 -1 0
    outer loop
      vertex 0 0 0
      vertex 0 0 1
      vertex 1 0 0
    endloop
  endfacet
  facet normal 0 -1 0
    outer loop
      vertex 1 0 1
      vertex 1 0 0
      vertex 0 0 1
    endloop
  endfacet
  facet normal 1 0 0
    outer loop
      vertex 1 0 0
      vertex 1 1 1
      vertex 1 0 1
    endloop
  endfacet
  facet normal 1 0 0
    outer loop
      vertex 1 1 0
      vertex 1 0 0
      vertex 1 1 1
    endloop
  endfacet
  facet normal -1 0 0
    outer loop
      vertex 0 0 0
      vertex 0 1 0
      vertex 0 0 1
    endloop
  endfacet
  facet normal -1 0 0
    outer loop
      vertex 0 1 1
      vertex 0 0 1
      vertex 0 1 0
    endloop
  endfacet
endsolid test

在这里插入图片描述

4.最后再写一个由三个直角形组成的立方体(直棱锥)

solid Cylinder
  facet normal 0.0 1.0 0.0
    outer loop
      vertex 0.0 0.0 0.0
      vertex 0.0 0.0 1.0
      vertex 1.0 0.0 0.0
    endloop
  endfacet  

  facet normal 0.0 0.0 1.0
    outer loop
      vertex 0.0 0.0 0.0
      vertex 1.0 0.0 0.0
      vertex 0.0 1.0 0.0
    endloop
  endfacet

  facet normal 0.0 0.0 1.0
    outer loop
      vertex 0.0 0.0 0.0
      vertex 0.0 1.0 0.0
      vertex 0.0 0.0 1.0
    endloop
  endfacet

  facet normal 1.0 0.0 0.0
    outer loop
      vertex 0.0 0.0 1.0
      vertex 1.0 0.0 0.0
      vertex 0.0 1.0 0.0
    endloop
  endfacet
  
endsolid Cylinder

在这里插入图片描述

5.amend 修正(右手定则,法线向外)

每组中的三个vertex,要按逆时针排放,按照逆时针排放三个顶点组成的三角形的法向量朝外的,所以这个三个vertex的顺序有说法.

(相反,你不按逆时针排放,则法向量方向朝向里面)

vertex 0.0 1.0 0.0
vertex 0.0 0.0 0.0
vertex 0.0 0.0 1.0

然后就是: f a c e t facet facet n o r m a l normal normal 0.0 0.0 0.0 − 1.0 -1.0 1.0 0.0 0.0 0.0表示法向量,但是 s t l 格式 stl格式 stl格式似乎并没有采用这个法向量的方向,正如这个例子,不管你写成(0.0 -1.0 0.0)还是(0.0 1.0 0.0),效果都是不变的,法向量方向的确定权:取决于vertex三兄弟的顺序!

solid Cylinder
  facet normal 0.0 -1.0 0.0
    outer loop
      vertex 0.0 0.0 1.0
      vertex 0.0 0.0 0.0
      
      vertex 1.0 0.0 0.0
    endloop
  endfacet  

  facet normal 0.0 0.0 -1.0
    outer loop
      vertex 1.0 0.0 0.0
      vertex 0.0 0.0 0.0  
      vertex 0.0 1.0 0.0
    endloop
  endfacet

  facet normal 	-1.0 0.0 0.0
    outer loop
      vertex 0.0 1.0 0.0
      vertex 0.0 0.0 0.0
      vertex 0.0 0.0 1.0
    endloop
  endfacet

    facet normal -1.0 -1.0 -1.0
    outer loop
      vertex 0.0 0.0 1.0
      vertex 1.0 0.0 0.0
      vertex 0.0 1.0 0.0
    endloop
  endfacet
  
endsolid Cylinder
solid Cylinder
  facet normal 0.0 -1.0 0.0
    outer loop
      vertex 0.0 0.0 1.0
      vertex 0.0 0.0 0.0
      
      vertex 1.0 0.0 0.0
    endloop
  endfacet  

  facet normal 0.0 0.0 -1.0
    outer loop
      vertex 1.0 0.0 0.0
      vertex 0.0 0.0 0.0  
      vertex 0.0 1.0 0.0
    endloop
  endfacet

  facet normal 	-1.0 0.0 0.0
    outer loop
      vertex 0.0 1.0 0.0
      vertex 0.0 0.0 0.0
      vertex 0.0 0.0 1.0
    endloop
  endfacet

    facet normal -1.0 -1.0 -1.0
    outer loop
      vertex 0.0 0.0 1.0
      vertex 1.0 0.0 0.0
      vertex 0.0 1.0 0.0
    endloop
  endfacet
  
endsolid Cylinder

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1049527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

纯css html 真实水滴效果

惯例,不多说直接上图 秉承着开源精神,我们将这段代码无私地分享给大家&#xff0c;因为我们深信&#xff0c;信息的共享和互相学习是推动科技进步的关键。我们鼓励大家在使用这段代码的同时&#xff0c;也能够将其中的原理、思想和经验分享给更多的人。 这份代码是我们团队用心…

基于Linux系统聊天室增加数据库sqlite功能实现(08)

全部掌握后&#xff0c;开始进入本篇。 一. 调整目录结构 为了方便编译&#xff0c;现在我们将前面文章的代码结构做如下调整。 rootubuntu:/mnt/hgfs/code/chat# tree . . ├── chat_client │ ├── include │ ├── Makefile │ ├── obj │ │ └── …

面试总结之Spring篇

一、AOP 1、什么是AOP 1.1、概述 AOP&#xff08;Aspect-Oriented Programming&#xff09;&#xff1a;面向切面编程&#xff0c;即把一些业务逻辑中的相同代码抽取出来&#xff0c;让业务逻辑更加简练清爽 如果要CRUD写一堆业务&#xff0c;可如何实现业务代码前后进行打印…

自动化测试工具之Selenium IDE录制教程

一、下载Selenium IDE 下载传送带&#xff1a;Selenium IDE Open source record and playback test automation for the web 这里Darren洋以firefox火狐浏览器为例&#xff0c;将以上下载url直接在firefox浏览器中打开&#xff0c;点击对应下载按钮后&#xff0c;就会进入添加…

【网络协议】TCP

TCP协议全称为传输控制协议(Transmission Control Protocol).要理解TCP就要从他的特性开始说&#xff0c;这些特性各自之间或多或少各有联结&#xff0c;需要以宏观视角来看待。 目录&#xff1a; 1.TCP报文格式 因为报文解释过于繁琐&#xff0c;具体内容请看这篇文章TCP报文…

架构案例2022(四十二)

促销管理系统 某电子商务公司拟升级其会员与促销管理系统&#xff0c;向用户提供个性化服务&#xff0c;提高用户的粘性。在项目立项之初&#xff0c;公司领导层一致认为本次升级的主要目标是提升会员管理方式的灵活性&#xff0c;由于当前用户规模不大&#xff0c;业务也相对…

PDF文件超出上传大小?三分钟学会PDF压缩

PDF作为一种流行的文档格式&#xff0c;被广泛用于各种场合&#xff0c;然而有时候PDF文件的大小超出了上传限制&#xff0c;这时候我们就需要采取一些措施来减小PDF文件的大小&#xff0c;下面就给大家分享几个方法&#xff0c;一起来学习下吧~ 方法一&#xff1a;嗨格式压缩大…

windows WSL配置cuda,pytorch和jupyter notebook

机器配置 GPU: NVIDIA Quadro K2000 与 NVIDIA 驱动程序捆绑的CUDA版本 但按照维基百科的描述&#xff0c;我的GPU对应的compute capability3.0&#xff0c;允许安装的CUDA最高只支持10.2&#xff0c;如下所示。 为什么本地会显示11.4呢&#xff1f;对此&#xff0c;GPT是这…

R语言分析:如何轻松地把数据分为三、四、五等份?

有网友问了&#xff0c;我如何对连续型资料进行分组&#xff0c;常见的有按照中位数分组、四分位数分组&#xff0c;甚至分为5组。 这个问题其实很简单的了。 用两个函数&#xff0c;一个是quantile函数&#xff0c;另外一个是cut函数 1. quantile()函数的应用 该函数目的是获得…

白盒 SDK 加密 —— Go 语言中直调 C 动态库实现

文章目录 1.背景2.实现方式2.1.C 库 .so 文件生成2.2.C 库 .h 文件2.3.Goland 调用实现2.3.1 整体2.3.2 注释块部分2.3.3 逻辑实现部分 3.小结 1.背景 在重构的历史项目中&#xff0c;有一点是语言转换&#xff1a;从 PHP 转至 Goland &#xff0c;在压缩资源的同时&#xff0…

SpringMVC+统一表现层返回值+异常处理器

一、统一表现层返回值 根据我们不同的处理方法&#xff0c;返回的数据格式都会不同&#xff0c;例如添加只返回true|false&#xff0c;删除同理&#xff0c;而查询却返回数据。 Result类 为此我们封装一个result类来用于表现层的返回。 public class Result {//描述统一格式…

B. Sets and Union

题目&#xff1a; 样例&#xff1a; 输入 4 3 3 1 2 3 2 4 5 2 3 4 4 4 1 2 3 4 3 2 5 6 3 3 5 6 3 4 5 6 5 1 1 3 3 6 10 1 9 2 1 3 3 5 8 9 1 2 4 28输出 4 5 6 0 思路&#xff1a; 这里题目的意思是&#xff0c;要求合并尽可能多的集合&#xff0c;使它的集合大小最大&…

flink中不同序列化器性能对比

背景 flink有多种序列化方式&#xff0c;包括flink内置的以及fallback到kryo的&#xff0c;那么他们之间有多大的性能差距呢&#xff0c;本文就从https://flink.apache.org/2020/04/15/flink-serialization-tuning-vol.-1-choosing-your-serializer-if-you-can/这篇文章里摘录…

分类预测 | MATLAB实现PSO-CNN粒子群算法优化卷积神经网络数据分类预测

分类预测 | MATLAB实现PSO-CNN粒子群算法优化卷积神经网络数据分类预测 目录 分类预测 | MATLAB实现PSO-CNN粒子群算法优化卷积神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现PSO-CNN多特征分类预测&#xff0c;多特征输入模型&#xf…

【计算机视觉|人脸建模】PanoHead:360度几何感知的3D全头合成

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;PanoHead: Geometry-Aware 3D Full-Head Synthesis in 360 ∘ ^{\circ} ∘ 链接&#xff1a;[2303.13071] PanoHead: Geometry-Aware 3D Full-Head Synthesis in 360 ∘ ^{\circ} ∘ (arx…

JavaScript 函数柯里化

&#x1f3b6;什么是柯里化 柯里化&#xff08;Currying&#xff09;是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数&#xff0c;并且返回接受余下的参数且返回结果的新函数的技术。 &#x1f3a1;简单的函数柯里化的实现 // ------------- 原函数…

Mac电脑强大的字体管理 RightFont for Mac

RightFont for Mac软件特色 速度有多快&#xff1f;RightFont可以在0.9秒以内加载30,000个字体&#xff01; 自动从Google字体/ Adobe Typekit集合&#xff08;通过Adobe Creative Cloud客户端&#xff09;同步字体。 轻松切换组视图以折叠/展开字体系列。 通过简单的拖放导入…

怎么保护苹果手机移动应用程序ipa中文件安全?

目录 前言 1. 对敏感文件进行文件名称混淆 2. 更改文件的MD5值 3. 增加不可见水印处理 3. 对html&#xff0c;js&#xff0c;css等资源进行压缩 5. 删除可执行文件中的调试信息 前言 ios应用程序存储一些图片&#xff0c;资源&#xff0c;配置信息&#xff0c;甚至敏感数…

raw图片处理软件:DxO PhotoLab 6 mac中文版支持相机格式

DxO PhotoLab 6 mac是一款专业的RAW图片处理软件&#xff0c;适用于Mac操作系统。它具有先进的图像处理技术和直观易用的界面&#xff0c;可帮助用户轻松地将RAW格式的照片转换为高质量的JPEG或TIFF图像。 DxO PhotoLab 6支持多种相机品牌的RAW格式&#xff0c;包括佳能、尼康、…

多叉树+图实现简单业务流程

文章目录 场景整体架构流程业务界面技术细节小结 场景 这次遇到一个需求,大致就是任务组织成方案,方案组织成预案,预案可裁剪调整.预案关联事件等级配置,告警触发预案产生事件.然后任务执行是有先后的,也就是有流程概念. 整体架构流程 方案管理、预案管理构成任务流程的基础条…