スポンサーリンク

Blender pythonで全て三角形と考えてmeshの三角形を取得する

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)

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: