blender のメッシュはNgonが可能なので、三角形だけカウントすると四角形以降がカウントされなかったりする。
mesh.calc_loop_triangles()関数を使えば、全て三角形として頂点を取り出すことができる。
注意点としてこれを呼び出したからと言ってモデルが三角形メッシュになるわけではないらしい。また三角形メッシュに変換した結果とこの結果が異なったりする。
import bpy
# @brief メッシュを構成する三角形を三頂点の組み合わせのリストで取得 # @param [in] obj オブジェクト def get_triangles(obj): ret = [] mesh = obj.data mesh.calc_loop_triangles() for tri in mesh.loop_triangles: ret.append([tri.vertices[0],tri.vertices[1],tri.vertices[2] ]) # [index0,index1,index2]のリスト return ret
# @brief 与えられたオブジェクトの重心を求める # @param [in] obj オブジェクト # @param [in] vid0 obj.data.verticesのindex # @param [in] vid1 obj.data.verticesのindex # @param [in] vid2 obj.data.verticesのindex # @return 三次元座標 <Vector ( x , y , z )> def calc_triangle_center(obj,vid0,vid1,vid2): mesh = obj.data tri_center = (mesh.vertices[vid0].co) +\ (mesh.vertices[vid1].co) +\ (mesh.vertices[vid2].co) tri_center /= 3.0 return tri_center
# @brief オブジェクトの全ての三角形の重心にsphereを配置する # @param [in] オブジェクト def disp_triangle_centers(obj): # 三角形をindex listで取得 PIDs = get_triangles(obj) for pid in PIDs: # 三角形の重心を算出 c = calc_triangle_center(obj, pid[0],pid[1],pid[2]) # 座標 c にsphereを配置 bpy.ops.mesh.primitive_uv_sphere_add( radius=0.05, segments=8, ring_count=8, enter_editmode=False, location=c )
# 使用例 myobj = bpy.context.active_object disp_triangle_centers(myobj)