如何计算存储在STL文件中的对象的音量?

Dom*_*amu 4 cad volume

我有.stl(STL是由3D Systems创建的立体光刻CAD软件原生的文件格式)文件,我必须从中计算音量.我该怎么做呢?我正在使用下面的计算但是音量不等于其他软件计算的音量

float x1,y1,z1;
float x2,y2,z2;
float x3,y3,z3;
Run Code Online (Sandbox Code Playgroud)

以上是顶点.triangles只是一个数据结构,包含一个具有每个三角形顶点的对象.

totalVolume += currentVolume = 
(triangles[i].x1*triangles[i].y2*triangles[i].z3 - 
triangles[i].x1*triangles[i].y3*triangles[i].z2 -

triangles[i].x2*triangles[i].y1*triangles[i].z3 + 
triangles[i].x2*triangles[i].y3*triangles[i].z1 + 
triangles[i].x3*triangles[i].y1*triangles[i].z2 - 
triangles[i].x3*triangles[i].y2*triangles[i].z1) / 6;
Run Code Online (Sandbox Code Playgroud)

您是否还使用法向量进行计算?

Cod*_*key 6

多面体的体积在维基百科的多面体文章中讨论.任何有效的STL曲面细分必须精确地是一个多面体,其中每个面都是一个边,因此在那里讨论的公式成立.

假设顶点逆时针方向(向下看向外法线),则以下扩展成立: 根据三角形顶点进行扩展

等式1只是多面体的发散公式.p [i,j]是第i个三角形的第j个顶点(作为来自原点的矢量).

等式2通过使用两个三角形边的叉积(平行四边形)是三角形的法线向量,其大小是三角形面积的两倍的事实来扩展这一点.

顺便说一句,这就是为什么三角形法线不会出现在你的表达中,即使你的直觉说它应该以某种方式存在.它已经在汤里了!

等式3仅使用叉积的分布性质扩展等式2,并且向量交叉本身是零向量的事实.

从等式3得到的体积根据三角形的方向进行标记.我已将我的表述与您的代码保持一致,但您可能会得到否定结果.如果是这样,只需取绝对值即可.

现在用你的符号写出加数(除了我不打算重复三角形[i])我得到:

(-x3 y2 z1 + x2 y3 z1 + x3 y1 z2 - x1 y3 z2 - x2 y1 z3 + x1 y2 z3)/6.;
Run Code Online (Sandbox Code Playgroud)

这与您所写的完全匹配(订单除外)!

所以有几种可能性:

(1)也许您的STL文件存在缺陷,并且三角形并非都是一致的.您可以通过验证每个边缘在向前方向上被三角形使用一次,以及在相反方向上使用一次来检查这一点.By和"edge"是指一对顶点(p [r],p [s]),它们是同一个三角形的一部分.我正在改变符号并使用下标来指示文件中唯一索引的顶点,而不是顶点相对于面的索引,就像我上面的双索引表示法一样).

如果一个三角形在其定向边列表中有边(p [r],p [s]),那么其他三角形必须在其列表中有(p [s],p [r])(相同的顶点,反向顺序)定向边缘.

(2)曲面细分未结束.这与1的测试相同,只是如果只有一个三角形使用边缘,则无论方向如何都打开.

(3)我敢提一下吗?你确定你初始化了currentVolume吗?

(4)你得到了正确的答案,但是音量是负的,你会误以为方法是错误的.请参阅上面的评论.