【问题标题】:How do I calculate the volume of an object stored in STL files?如何计算存储在 STL 文件中的对象的体积?
【发布时间】:2011-09-24 23:51:08
【问题描述】:

我有 .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;

你还涉及法向量的计算吗?

【问题讨论】:

  • 什么是.stl-文件。 其他软件是什么? plizz 到底是什么?!
  • en.wikipedia.org/wiki/STL_%28file_format%29 Plizz=拜托。你能帮忙吗?
  • 解释一下.stl文件是什么,并告诉我们您使用的是什么软件。
  • STL 是 3D Systems 创建的立体光刻 CAD 软件的原生文件格式。
  • @pavium:这被标记为 CAD 问题。熟悉 CAD 的人应该熟悉 .stl 文件。

标签: volume cad


【解决方案1】:

多面体的体积在维基百科的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 文件存在缺陷,并且三角形的方向不一致。您可以通过验证每个边在正向和相反方向上一次被三角形使用来检查这一点。 “边”是指属于同一三角形的一对顶点 (p[r], p[s])。我正在更改符号并使用下标来指示文件中唯一索引的顶点,而不是像上面的双索引符号那样相对于面部的顶点索引)。

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

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

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

(4) 你得到了正确的答案,但音量是否定的,你被愚弄认为方法是错误的。请参阅上面的我的 cmets。

【讨论】:

  • 非常感谢 DeepYellow,现在我明白如何获取它了。另一个问题如果我想从 stl 文件中获取对象的长度、宽度和高度,将获得 X 的范围等于长度,Y坐标范围等于宽度,Z坐标范围等于高度。这里我用长度、宽度和高度来表示包含矩形立方体的尺寸。
  • 是的,查看 x、y 和 z 坐标的范围将为您提供镶嵌边界框的尺寸。
  • 如果你应用这个四面体体积的总和来得到一个答案;然后移动原点并重做总和你会得到不同的答案吗?如果是这样,您的多面体可能是开放的。
  • 等式 3 中的最后两项将消失,因为每个叉积必须与 p_i,1 正交。因此,当您的 p_i,1 与叉积的点积应该消失时。
【解决方案2】:

int vs double 问题?

/6;也许应该是/6.0;

【讨论】:

  • 您可能想对这个答案进行一些扩展。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 2010-10-16
相关资源
最近更新 更多