三维网格交集 Python

11

我刚开始使用面向有限元分析的 3D 网格,希望能建模材料中包含物(任何形状,但主要关注球体和椭球体)在立方状矩阵中的情况。这些包含物不应相互重合。

因此,我想使用一些 Python 包来绘制基本对象,查找它们的交集(如果存在)并导出几何图形(或对其进行网格化并导出)。在球体的情况下,我编写了自己的解决方案,但我认为将其扩展到除球体外的任何形状都将非常困难。

经过几天的寻找适当的库/模块,我无法确定该使用哪一个。

我想使用 Python 作为主要语言,因为它易于使用、开源并且我已经有一些了解。

因此查看了此链接:Good geometry library in python?

但:

  • SymPy。似乎仅适用于2D对象。
  • pyeuclid。看起来在其Google Code页面上已停止更新。
  • CGAL。它似乎是最先进的,但我无法确定它是否进行交集。
  • geometry-simple。也已停止更新,我认为它无法处理3D对象。
  • pythonocc。缺乏文档是一个重要问题。
  • Open mesh。看起来是一个不错的替代方案,但我无法确定它是否进行交集。
我可能缺少一些功能或库,对此我感到抱歉。 如果确实需要并且有用的话,我可以尝试使用 C++,因为根据这里这里这里所述,它似乎具有更多的几何库。 此外,我想要提到,我主要在 Windows 10 上工作,我的 Linux 经验很少,但我可以挑战自己。
总结我的问题:是否有任何好的 Python(如果可能)库可以找到 3D 对象之间的交集?我是否缺少应该知道的任何功能或库?非常感谢您给出任何指导意见!
非常感谢您的帮助!

1
我喜欢你精心设计的问题。但是恐怕,就目前而言,它不符合SO的主题要求 - Mr. T
嗨,@Mr.T太遗憾了...我会尝试重新编写它,可能更加注重软件。也许用gmsh。非常感谢! - Ger
3个回答

7
您可能想要查看我的代码库之一pygalmesh。它与CGAL接口,因此使用级集函数进行网格构建。所有域组合(交集、联合、差异)都已实现。

enter image description here


非常感谢您的回答,@Nico。这似乎是解决我的问题的很好的方法!问候 - Ger

2
有没有在Python中能够找到3D对象交集的好库(如果可能的话)?
一个不错的选择是使用开源库MeshLib,它是用C++编写的,但也有一个Python接口和可通过pip install下载的包。
使用MeshLib减去两个球体的代码示例(类似于其他答案):
import meshlib.mrmeshpy as mr

# create a mesh of default sphere with radius 1:
sparams = mr.SphereParams()
smallSphere = mr.makeSphere(sparams)

# create a large sphere with more points and triangles
sparams.numMeshVertices = 400
sparams.radius = 2
bigSphere = mr.makeSphere(sparams)

# shift smaller sphere from the origin on 2 units along Z axis:
transVector = mr.Vector3f()
transVector.z = 2
diffXf = mr.AffineXf3f.translation(transVector)
smallSphere.transform(diffXf)

# find the difference mesh between two spheres:
diff = mr.boolean( bigSphere, smallSphere, mr.BooleanOperation.DifferenceAB )

# save the result in file:
mr.saveMesh(diff.mesh, mr.Path("diffSpheres.stl"))

结果大致如下: 输入图像描述

0
我发帖是为了帮助完善解决方案列表。
一个非常pythonic的库是pymadcad(我是作者)。
它旨在操作和生成三角网格,以创建机械零件的3D模型,包括boolean operations。它可能适合您的应用程序,至少您正在寻找的操作应该在其中,因为您的网格应该代表物理对象。
一个简单的网格交叉示例:
from madcad import *

a = icosphere(vec3(0,0,0), 1)
b = icosphere(vec3(1,0,0), 0.8)
result = difference(a, b)

io.write(result, '/tmp/result.stl')
show([result])

你将会得到以下内容:

resulting mesh

当然,您也可以对导入的网格进行相同的操作。 对于您的应用程序来说,唯一的问题是pymadcad没有生成专用于有限元的三角剖分的功能,这意味着使用madcad操作可能会得到包含细长三角形的网格,这对于有限元来说并不理想。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接