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

时间:2011-06-29 09:26:29

标签: volume cad

我有.stl(STL is a file format native to the stereolithography CAD software created by 3D Systems)个文件,我必须从中计算出音量。我该怎么做呢?我正在使用下面的计算但是音量不等于其他软件计算的音量

float x1,y1,z1;
float x2,y2,z2;
float x3,y3,z3;

以上是顶点。 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;

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

2 个答案:

答案 0 :(得分:6)

维基百科的polyhedron文章讨论了多面体的体积。任何有效的STL曲面细分必须精确地是一个多面体,其中每个面都是一个边,所以在那里讨论的公式就可以了。

假设顶点逆时针方向(俯视向外法线),则以下扩展成立: Expanding in terms of the triangle vertices

等式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.;

这与你所写的完全一致(订单除外)!

所以有几种可能性:

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

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

(2)曲面细分未关闭。这与1的测试相同,只是如果只有一个三角形使用边缘,它会打开,无论方向如何。

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

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

答案 1 :(得分:1)

int与双重问题?

/ 6;也许应该是/ 6.0;