繁体   English   中英

重新划分 3D 三角曲面以获得更好的网格质量

[英]Remeshing 3D triangulated surface for better mesh quaility

我正在使用行进立方体从体积中提取 2D 表面。 在这种情况下,一个 Gyroid。

import numpy as np
from numpy import sin, cos, pi
from skimage import measure
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def gyroid(x, y, z, t):
    return cos(x)*sin(y) + cos(y)*sin(z) + cos(z)*sin(x) - t

lattice_param = 1.0
strut_param = 0.0
resolution = 31j

x, y, z = pi*np.mgrid[-1:1:resolution, -1:1:resolution, -1:1:resolution] * lattice_param
vol = gyroid(x, y, z, strut_param)

verts, faces = measure.marching_cubes(vol, 0, spacing=(0.1, 0.1, 0.1)) # , normals, values

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], cmap='ocean', lw=1)

在此处输入图片说明

这一切正常,但网格质量在很多地方令人震惊。 我无法在网格上运行任何 FEA,因为许多元素/面的面积接近于零或高度扭曲。

在此处输入图片说明

有没有办法重新划分给定顶点并确保特定的元素面/面指标(例如纵横比)或强制行进立方体做这样的事情?

只要网格是一个公平的近似值,我就不会为移动顶点而烦恼。

一种选择是使用表面网格化包对行进立方体输出进行“重新网格化”。 从本质上讲,这意味着行进立方体三角剖分将作为要重新三角剖分的初始表面定义。

有许多技术可以用来做到这一点。 一些可能有用的选项(所有C++ / C实现):

  • JIGSAW :一种受限的正面德劳内算法^^,通常会构建非常高质量的表面德劳内三角剖分。 对于显示的对象类型,我希望它能够很好地工作。 在包含的演示(在MATLAB提供)中,有几个示例解决了行进立方体输出的重新划分网格。
  • CGAL :一种受限的delaunay 细化方法,也可以构建表面 Delaunay 三角剖分,但使用与JIGSAW略有不同的算法,还包括CVT类型的网格优化方案。
  • MMG :一组重新划分网格/优化策略(据我所知),可用于通过局部修改的迭代应用来转换(并因此改进)初始网格。

^^我是JIGSAW的作者,所以,这里基本上是无耻的宣传。

奇怪的三角形来自奇怪的数据,而不是来自用于三角测量的方法。

我可以说 Delaunay 三角剖分实现了最佳的三角形面积/三角形周长比(最佳理论比值是等边三角形)。 但是您不能将 if 用于您的网格,因为 Delaunay 三角剖分输出一个凸面网格。

你有一项紧迫的任务。 一些想法:

  • 在网格划分之前删除 cuasi-duplicated 点。 这将避免许多接近零面积的三角形。
  • 检测细三角形。 将它们细分为更“规则”的三角形。
  • 您可以创建一个密集的规则网格。 可以找到每个z遍历网格,直到找到包含网格中点的x,y坐标的三角形,然后对z进行插值。 如果您有一些额外的信息,例如 neigbours 或 hierachy,则可以比检查每个三角形更快地完成搜索。 对网格进行三角剖分非常简单。

使用也可以使用pygalmesh进行表面重新划分。 (这是一个易于使用的 CGAL 界面。)

import pygalmesh

# create verts, faces

meshio.write_points_cells("in.vtu", verts, [("triangle", faces)])

mesh = pygalmesh.remesh_surface(
    "in.vtu",
    edge_size=0.025,
    facet_angle=25,
    facet_size=0.1,
    facet_distance=0.001,
    verbose=False,
)
# mesh.points, mesh.cells

我建议使用带有平滑的 3d 自适应重新划分网格。 地理图编程库 ( http://alice.loria.fr/software/geogram/doc/html/index.html ) 提供了一个很好的实现。 请参阅: https : //twitter.com/brunolevy01/status/1132343120690122752?lang=en

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM