Comments
Description
Transcript
メッシュ生成用STLファイルの自前での作成方法について
事例報告 メッシュ生成用STL ファイルの 自前での作成方法について 一関高専・若嶋振一郎([email protected]) ※ 「自前で」とありますが、サーフェスをメッシュ分割するアルゴリズム(Delaunay分割など)に ついては含んでいません。STLの記述についてのお話です。 2015/11/14 第6回OpenCAE初歩情報交換会@北東北 1 OpenFOAMにおけるメッシュ生成方法 まずはともあれ“blockMesh”コマンドを使いこなそう! 1. • 最近multi gradingを搭載したので使いやすくなりました • 派生として“extBlockMesh”・・・メッシュスムージング+Objファイルへのプロジェク ション機能 市販・フリーメッシャーから出力もしくはネイティブフォーマットを変換 2. • • • • : ICEM CFD Pointwise/gridgen Netgen enGrid 3. フリー3D-CAD(アカデミック)>STL出力>sHM/cfMesh • STLファイルの品質が重要 2015/11/14 第6回OpenCAE初歩情報交換会@北東北 2 STLファイルとは? STL=“Stereolithography ” 三次元形状を小さな三角形の集合体(ポリゴン)として表現 • 色やトポロジーデータなどは表現不可 • カーブ形状などの表現不可(微小三角形平面で近似) → 曲面(曲率半径大)では十分な解像度の三角形を出力する • データ構造が簡単で3Dプリンタ用データなどによく用いられる ASCII形式・・・・可読性あり、データ量多、読み込み遅 Binary形式・・・可読性なし、データ量少、読み込み早 たいていの3D-CAD・CGには出力機能あり OpenFOAMではsHMやcfMeshのメッシュ生成用データとして利用 2015/11/14 第6回OpenCAE初歩情報交換会@北東北 3 STLファイルの例 1つの物体はsolidと呼ばれる 1個1個の三角形パッチは Facetと呼ばれる 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 3Dモデル 2015/11/14 STL形式出力 第6回OpenCAE初歩情報交換会@北東北 STLファイルの中身(ASCII) 4 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 2015/11/14 solid ブロック名 三角形(facet)の単位法線ベクトル(表) 三角形(facet)を形成する3つの点の座標 ※ 右ねじ回りに指定 ※ 法線ベクトルや座標はe表記法(例:1.000000e+01 )で表記 ※ 改行コードはCR+LFが無難? (nx ny nz) (v2x v2y v2z) (v1x v1y v1z) (v0x v0y v0z) 第6回OpenCAE初歩情報交換会@北東北 5 STLファイルの基本構造(BINARY形式) ヘッダー部(任意文字列) facetの数 facetの数分だけのデータを繰り返す - facetの単位法線ベクトル3成分 - 節点1の座標3成分 - 節点2の座標3成分 - 節点3の座標3成分 - 2byte分の追加データ(通常は0埋め) この部分に色情報を埋め込んだ color STL 形式というものもある。 参考:http://www.fabbers.com/tech/STL_Format 2015/11/14 第6回OpenCAE初歩情報交換会@北東北 6 CFD(OpenFOAM)用に用いるSTLファイルの注意点 単位系 STLファイルで用いる数値は単位系が記述されていないので、[mm]なのか[m]なの か[inch]なのか、間違いやすいため注意が必要です 三角形ポリゴンで囲まれた空間の表面・裏面の統一 三角形パッチの節点の並び方(右ねじ)と、法線の指定の仕方に矛盾があると、 メッシュ生成ができないことがあります(反転ポリゴン) 三角形ポリゴン同士の干渉・不整合・低品質 あるポリゴンが他のポリゴンとクロスしている場合(ポリゴンの交差) あるポリゴンの節点が他のポリゴンの節点と同じ値を持つ場合(ポリゴンの重複) ポリゴンによって空間が閉じられていない場合(ポリゴンの欠落) ポリゴン座標データに同じものが入っている(点ポリゴン、線ポリゴン) 微小・鋭角三角形 3D-CAD/modeler ソフトで再作成 (ヒーリングツール) 2015/11/14 目視での確認・修正は非常に困難 (とくに複雑形状になればなるほど) 第6回OpenCAE初歩情報交換会@北東北 修正ツールを利用 7 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 , ………. AppendixにMeshLabを用いた例を追記していますので、ご参照ください。 2015/11/14 第6回OpenCAE初歩情報交換会@北東北 8 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 facetのNormal Vectorを 別に計算する必要があるため そのあたりも追記して改造した サンプルを公開します (@勉強会HP?) 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" 2015/11/14 第6回OpenCAE初歩情報交換会@北東北 9 (cont.) class ASCIISTLWriter: def add_face(self, face): """ Export 3D objects build of 3 or 4 vertices as ASCII """ Add one face with 3 or 4 vertices. """ STL file. if len(face) == 4: 入出力ストリームの初期化 """ face1, face2 = self._split(face) (ファイルストリーム) def __init__(self, stream): self._write(face1) facet追加 self.fp = stream self._write(face2) self._write_header() elif len(face) == 3: self._write(face) ヘッダー出力(solid名は決め打ち) def _write_header(self): else: self.fp.write("solid python¥n") raise ValueError('only 3 or 4 vertices for each face') STLファイル終了 def close(self): self.fp.write("endsolid python¥n") Facetデータ出力 def _write(self, face): self.fp.write(ASCII_FACET.format(face=face)) def add_faces(self, faces): """ Add many faces. """ for face in faces: self.add_face(face) Facet複数追加 def _split(self, face): 四角形を三角形に分割 p1, p2, p3, p4 = face return (p1, p2, p3), (p3, p4, p1) 2015/11/14 第6回OpenCAE初歩情報交換会@北東北 10 (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() STLファイル終了 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 Facetデータ出力 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)) 2015/11/14 第6回OpenCAE初歩情報交換会@北東北 11 Appendix: MeshLabによるSTLデータ修正 • 公開3D STLデータの例 Honda NSX Consept( http://www.honda-3d.com/ ) • nsx_concept_LOW.stl SolidWorksでは読み込めますが(パッと見OK),これをそのままsHMに使うとエラーになります。 2015/11/14 第6回OpenCAE初歩情報交換会@北東北 12 Close Holes • Filters → Remeshing,simpl・・・ → Close Holes • 欠落したfaceを再構成 欠損したface 修正後 修正前 2015/11/14 faceの修正 第6回OpenCAE初歩情報交換会@北東北 13 Mesh reduction • Filters → Remeshing,simpl・・・ → QuadricEdgeCollapseDecimation • Target number of facesを修正(もしくはpercentage of reduction) • Preserve boundary of the meshにチェックをいれる オリジナル: 約21万faces 2015/11/14 修正後: 10万faces 第6回OpenCAE初歩情報交換会@北東北 14 Mesh subdivision • Filters → Remeshing,simpl・・・ → Subdivision Surfaces: midpoint • Face edgeの中点を使ってメッシュを細分化 Iteration 3回後 2015/11/14 第6回OpenCAE初歩情報交換会@北東北 15 Mesh smoothing • Filters → Smoothing,Fairing・・・ → Laplacian smooth (surface preserving) • ラプラス方程式を用いたメッシュスムージング Iteration 10回後 2015/11/14 第6回OpenCAE初歩情報交換会@北東北 16 そのほかの修正コマンド 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 2015/11/14 第6回OpenCAE初歩情報交換会@北東北 17 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”となり,しばしばエラーになります. From http://www.cs.mtu.edu/~shene/COURSES/cs3621/SLIDES/Mesh.pdf 2015/11/14 第6回OpenCAE初歩情報交換会@北東北 18 参考文献/URL − http://www-bl20.spring8.or.jp/~sp8ct/tmp/stl.pdf − http://www.fabbers.com/tech/STL_Format − http://www.hiramine.com/programming/3dmodelfileformat/stlfileformat.html − https://ja.wikipedia.org/wiki/Standard_Triangulated_Language 次回は、STLファイルを使ってsHMもしくはcfMeshによるメッシュ生成や 境界生成(autoPatchコマンドなど)のまとめについてお話しする予定です。 2015/11/14 第6回OpenCAE初歩情報交換会@北東北 19