スポンサーリンク

Blenderのply Exportの重複頂点

当然だが、File → Export → Stanford(.ply)でply出力できる。

しかしその時、出力されたPLYファイルを見ると、頂点が重複している。

重複頂点を削除するオプションがどうも見つからなかったので、別の方法を考える。最も確実な方法は、おそらくMeshLab等の有名どころを使って重複頂点削除コマンドを実行すること。

MeshLabで重複削除

MeshLab → [Filters] → [Cleaning and Repairing] → [Remove Duplicate Vertices]

Blender Pythonで出力プログラムを書く

あるいは、plyは比較的わかりやすいフォーマットなので出力プログラムを自力で書いてもいいかもしれない。

import bpy

msh = bpy.context.active_object

fname = 'C:/test/' + msh.name + '.ply'

with open(fname, 'w') as myf:

    print( "ply" ,file=myf )
    print( "format ascii 1.0" ,file=myf )
    print( "element vertex",len(msh.data.vertices) ,file=myf )
    print( "property float x" ,file=myf )
    print( "property float y" ,file=myf )
    print( "property float z" ,file=myf )
    print( "property float nx" ,file=myf )
    print( "property float ny" ,file=myf )
    print( "property float nz" ,file=myf )
    print( "element face",len(msh.data.polygons) ,file=myf )
    print( "property list uchar int vertex_index" ,file=myf )
    print( "end_header" ,file=myf )
    for vt in msh.data.vertices:
        print(vt.co[0],vt.co[1],vt.co[2], " " ,end="",file=myf ) #頂点座標出力
        print(vt.normal[0],vt.normal[1],vt.normal[2],file=myf ) #頂点法線出力

    for f in msh.data.polygons:
        print( len(f.vertices) ," ", end="",file=myf ) #各面の頂点数出力
        for v in f.vertices:
            print( v ," ", end="" ,file=myf ) #各面を構成する頂点の頂点番号を出力
        print( "" ,file=myf )

処理結果

MeshLabで頂点数の確認をする。Verticesが減っているのがわかる

そのまま出力
Pythonスクリプトで出力

注意

以下のように、結果がやや異なる。頂点数の違いは重複と見なす距離の差だと思う(想像)。四角形以上のNgonの扱いも異なっている面法線の再計算の有無あたりかとも思うが不明。

Pythonスクリプトで出力
MeshLabでClean

コメントを残す

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

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


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