我有.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;
您是否还使用法线向量进行计算?
答案 0 :(得分:6)
维基百科的polyhedron文章讨论了多面体的体积。任何有效的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.;
这与你所写的完全一致(订单除外)!
所以有几种可能性:
(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;