自己交差しているポリゴンメッシュ形状を検索する(スクリプト)

DXFやFBXなど他社のソフトウェアで作成したデータをShade3Dへインポートした場合など、
入出力の設定や形状の編集状態により、面や稜線がねじれた形状が作成され、この現象は、自己交差と呼ばれます。

・自己交差実例

自己交差した形状は、正しくレンダリングされることはなく、Shade3Dに限らず、意図しない問題が
発生する場合があるため、必要に応じて手動で修正する必要があります。

その場合は、形状を個別に確認するにも時間を要し現実的ではございません。
以下のスクリプトを実行することで、自己交差する面が含まれるポリゴンメッシュ形状を一括して選択することができます。
また、スクリプトを実行するとブラウザ上で、該当形状を複数選択されますのでその状態で、右クリックして表示された
メニューより「マーカー色」を指定して内容を確認するか、削除を指定して一括削除することもできます。

使用方法:
1・「#Shade Script」から「main()」までを選択し「コピー」してください。
2・表示メニューよりスクリプトを選択してください。
3・スクリプトウィンドウが表示されますので、フィールド上にマウスカーソルを
合わせ「貼り付け」を行なってください。
4・スクリプトウィンドウ内にスクリプトが貼り付けられたのち「実行」ボタンを
クリックしてください。
これにより、ブラウザウィンドウのマテリアルパートより、どこの形状にも
参照されていないマスターマテリアルが複数選択されます。


#Shade Script
# @title \ja ▲自己交差オブジェクトの選択 \endja
# @description \ja 全てのポリゴンメッシュの中から、自己交差のあるポリゴンメッシュ形状を選択します。 \endja

def choose_self_intersecting_poligonmesh (choose_set, PoligonMesh): #ポリゴンメッシュが自己交差していれば、choose_setに格納する
 PoligonMesh.select_self_intersecting_faces()
 if len(PoligonMesh.active_face_indices) > 0 :
  choose_set.add(PoligonMesh)
   
def choose_poligon_mesh_shapes (choose_set, shape): #形状がポリゴンメッシュならば、choose_setに格納する
 #探索不要なパートを、探索から除外する
 if shape.type == 2:#パート
  if shape.part_type == 1: return#自由曲面パート
  elif  shape.part_type == 100: return#マスターサーフェスパート
  elif  shape.part_type == 101: return#リンク
  elif  shape.part_type == 102: return#マスターイメージパート
 if shape.type == 7 : #ポリゴンメッシュ
  choose_set.add(shape)
 if shape.has_son: #子形状を持つならば、子形状もポリゴンメッシュか判別する
  son = shape.son
  while son.has_bro:
   son = son.bro
   choose_poligon_mesh_shapes (choose_set, son )
def main():
 print("■■自己交差オブジェクトの選択")
 choose_set = set([])
 #ポリゴンメッシュを抽出
 r_part = xshade.scene().shape #ルートパート
 choose_poligon_mesh_shapes(choose_set, r_part)
 choose_shapes = list(choose_set )

 if len(choose_shapes) == 0 :
  print("■ポリゴンメッシュはありませんでした。")
  return
 #ポリゴンメッシュから自己交差しているものを抽出
 choose_set = set([]);
 for shape in choose_shapes :
  choose_self_intersecting_poligonmesh(choose_set, shape)
 choose_shapes = list(choose_set )
 if len(choose_shapes) == 0 :
  print("■自己交差しているポリゴンメッシュはありませんでした。")
  return
 #自己交差しているポリゴンメッシュを選択
 xshade.scene().active_shapes = choose_shapes
 print("■" + str(len(choose_shapes)) +"個のポリゴンメッシュに自己交差がありました")
 
main()
この記事のタイトルとURLをコピーする
Translate »