メッシュ生成用STL ファイルの
自前での作成方法について
一関高専・若嶋振一郎([email protected])
事例報告 ※ 「自前で」とありますが、サーフェスをメッシュ分割するアルゴリズム(Delaunay分割など)に ついては含んでいません。STLの記述についてのお話です。OpenFOAMにおけるメッシュ生成方法
1.
まずはともあれ“blockMesh”コマンドを使いこなそう!
• 最近multi gradingを搭載したので使いやすくなりました • 派生として“extBlockMesh”・・・メッシュスムージング+Objファイルへのプロジェク ション機能2.
市販・フリーメッシャーから出力もしくはネイティブフォーマットを変換
• ICEM CFD • Pointwise/gridgen • Netgen • enGrid :3. フリー3D-CAD(アカデミック)>STL出力>sHM/cfMesh
• STLファイルの品質が重要STLファイルとは?
STL=“Stereolithography ”
三次元形状を小さな三角形の集合体(ポリゴン)として表現
• 色やトポロジーデータなどは表現不可
• カーブ形状などの表現不可(微小三角形平面で近似)
→ 曲面(曲率半径大)では十分な解像度の三角形を出力する
• データ構造が簡単で3Dプリンタ用データなどによく用いられる
ASCII形式・・・・可読性あり、データ量多、読み込み遅
Binary形式・・・可読性なし、データ量少、読み込み早
たいていの3D-CAD・CGには出力機能あり
OpenFOAMではsHMやcfMeshのメッシュ生成用データとして利用
STLファイルの例
3Dモデル STL形式出力 STLファイルの中身(ASCII)
solid Part1
facet normal -5.000000e-001 8.660254e-001 0.000000e+000 outer loop
vertex 0.000000e+000 8.660254e+000 5.000000e+000 vertex 5.000000e+000 1.154701e+001 5.000000e+000 vertex 0.000000e+000 8.660254e+000 -1.734723e-015 endloop
endfacet :
facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 outer loop
vertex 1.000000e+001 2.886751e+000 0.000000e+000 vertex 5.000000e+000 1.154701e+001 0.000000e+000 vertex 1.000000e+001 8.660254e+000 0.000000e+000 endloop endfacet endsolid 1個1個の三角形パッチは Facetと呼ばれる 1つの物体はsolidと呼ばれる
STLファイルの基本構造(ASCII形式)
solid
NAME
facet normal
nx ny nz
outer loop
vertex v0x v0y v0z
vertex v1x v1y v1z
vertex v2x v2y v1z
endloop
endfacet
:
endsolid
solid ブロック名 三角形(facet)の単位法線ベクトル(表) 三角形(facet)を形成する3つの点の座標 ※ 右ねじ回りに指定 ※ 法線ベクトルや座標はe表記法(例:1.000000e+01 )で表記 ※ 改行コードはCR+LFが無難? (nx ny nz) (v0x v0y v0z) (v1x v1y v1z) (v2x v2y v2z)STLファイルの基本構造(BINARY形式)
参考:http://www.fabbers.com/tech/STL_Format ヘッダー部(任意文字列) facetの数 facetの数分だけのデータを繰り返す - facetの単位法線ベクトル3成分 - 節点1の座標3成分 - 節点2の座標3成分 - 節点3の座標3成分 - 2byte分の追加データ(通常は0埋め) この部分に色情報を埋め込んだ color STL 形式というものもある。CFD(OpenFOAM)用に用いるSTLファイルの注意点
単位系
STLファイルで用いる数値は単位系が記述されていないので、[mm]なのか[m]なの か[inch]なのか、間違いやすいため注意が必要です三角形ポリゴンで囲まれた空間の表面・裏面の統一
三角形パッチの節点の並び方(右ねじ)と、法線の指定の仕方に矛盾があると、 メッシュ生成ができないことがあります(反転ポリゴン)三角形ポリゴン同士の干渉・不整合・低品質
あるポリゴンが他のポリゴンとクロスしている場合(ポリゴンの交差) あるポリゴンの節点が他のポリゴンの節点と同じ値を持つ場合(ポリゴンの重複) ポリゴンによって空間が閉じられていない場合(ポリゴンの欠落) ポリゴン座標データに同じものが入っている(点ポリゴン、線ポリゴン) 微小・鋭角三角形 目視での確認・修正は非常に困難 (とくに複雑形状になればなるほど) 3D-CAD/modeler ソフトで再作成 (ヒーリングツール) 修正ツールを利用STLファイルの修正ツール
• MeshLab( http://meshlab.sourceforge.net/ )
• MeshMagic( http://www.nchsoftware.com/meshmagic3d/ )
• MiniMagics(http://www.vector.co.jp/soft/winnt/business/se453733.html)
・・・非OSSで要登録。エラーチェック機能のみ?
• netfabb basic(http://www.3ds.co.jp/netfabb/index.htm)
• OpenSTL(http://sourceforge.net/projects/openstl/)
・・・Viewer機能のみ?
など
※ 有償Softwareは高機能な分、高価(O(10~100)万円)
※ OpenFOAMにもSTL関係のUtility(surface mesh tools)が存在
→ http://cfd.direct/openfoam/user-guide/standard-utilities/
surfaceCheck, surfaceClean, surfaceMeshConvert , ……….
STLファイルの作成法(python)
• 構造が分かれば,ASCIIでファイルを作成を作成可能
• pythonでのSTL出力パッケージが多数存在
• pythonでの点列計算→STL出力→sHM/cfMesh→OpenFOAM solverの自動化 • https://github.com/telefab/ImageExtruder/blob/master/photomaton/stl_writer.py #!/usr/bin/env python # coding:utf-8# Purpose: Export 3D objects, build of faces with 3 or 4 vertices, as ASCII or Binary STL file. # License: MIT License
# http://code.activestate.com/recipes/578246/
import struct
ASCII_FACET = """facet normal 0 0 0 outer loop
vertex {face[0][0]:.4f} {face[0][1]:.4f} {face[0][2]:.4f} vertex {face[1][0]:.4f} {face[1][1]:.4f} {face[1][2]:.4f} vertex {face[2][0]:.4f} {face[2][1]:.4f} {face[2][2]:.4f} endloop endfacet """ BINARY_HEADER ="80sI" BINARY_FACET = "12fH" facetのNormal Vectorを 別に計算する必要があるため そのあたりも追記して改造した サンプルを公開します (@勉強会HP?)
(cont.)
class ASCIISTLWriter:
""" Export 3D objects build of 3 or 4 vertices as ASCII STL file.
"""
def __init__(self, stream):
self.fp = stream self._write_header() def _write_header(self): self.fp.write("solid python¥n") def close(self): self.fp.write("endsolid python¥n")
def _write(self, face):
self.fp.write(ASCII_FACET.format(face=face))
def _split(self, face):
p1, p2, p3, p4 = face
return (p1, p2, p3), (p3, p4, p1)
def add_face(self, face):
""" Add one face with 3 or 4 vertices. """ if len(face) == 4:
face1, face2 = self._split(face) self._write(face1)
self._write(face2) elif len(face) == 3:
self._write(face) else:
raise ValueError('only 3 or 4 vertices for each face')
def add_faces(self, faces):
""" Add many faces. """ for face in faces:
self.add_face(face) 入出力ストリームの初期化 (ファイルストリーム) ヘッダー出力(solid名は決め打ち) STLファイル終了 Facetデータ出力 四角形を三角形に分割 facet追加 Facet複数追加
(cont.)
class BinarySTLWriter(ASCIISTLWriter): """
Export 3D objects build of 3 or 4 vertices as binary STL file. """
def __init__(self, stream): self.counter = 0 super(Binary_STL_Writer, self).__init__(stream) def close(self): self._write_header() def _write_header(self): self.fp.seek(0)
self.fp.write(struct.pack(BINARY_HEADER, b'Python Binary STL Writer', self.counter))
def _write(self, face): self.counter += 1 data = [
0., 0., 0.,
face[0][0], face[0][1], face[0][2], face[1][0], face[1][1], face[1][2], face[2][0], face[2][1], face[2][2], 0 ] self.fp.write(struct.pack(BINARY_FACET, *data)) 入出力ストリームの初期化 (ファイルストリーム) ヘッダー出力 STLファイル終了 Facetデータ出力
Appendix: MeshLabによるSTLデータ修正
• 公開3D STLデータの例 Honda NSX Consept( http://www.honda-3d.com/ )
• nsx_concept_LOW.stl
Close Holes
• Filters → Remeshing,simpl・・・ → Close Holes
• 欠落したfaceを再構成
修正後
欠損したface
修正前
Mesh reduction
• Filters → Remeshing,simpl・・・ → QuadricEdgeCollapseDecimation
• Target number of facesを修正(もしくはpercentage of reduction)
• Preserve boundary of the meshにチェックをいれる
Mesh subdivision
• Filters → Remeshing,simpl・・・ → Subdivision Surfaces: midpoint
• Face edgeの中点を使ってメッシュを細分化
Mesh smoothing
• Filters → Smoothing,Fairing・・・ → Laplacian smooth (surface preserving)
• ラプラス方程式を用いたメッシュスムージング
そのほかの修正コマンド
Non manifoldなメッシュの除去
• Filters -> Cleaning and Repairing -> Remove Non Manifold Faces • Filters -> Cleaning and Repairing -> Remove Non Manifold Vertices 法線ベクトルの裏表の整列
• Filters->Normals, Curvatures and Orientation->Re-Orient All Faces Coherently メッシュの粗粒化(形状変更を伴うことが多い)
• Filters -> Rendering, simplification and reconstruction -> Quadric Edge Collapse Decimation
Manifold conditions
① Each edge is incident to only one or two faces
② The faces incident to a vertex form a closed or an open fan
このようなメッシュ(黄色)は”Non-Manifold mesh”となり,しばしばエラーになります.