インスタンスを保持(Preserve Instances)せずに書き出されたFBXファイルをBlenderで読み込んでインスタンス(Meshデータブロックのリンク)を復元してみるテストです。

Meshの同一性の比較として、頂点数、エッジ数、フェース数とバウンディングボックスが一致しているかどうかを比べています。無理やりhashを取得して比較のほうが良いかもしれませんが。

以下、スクリプトのサンプルです。

import bpy
from pprint import pprint
def is_similar(obj_a, obj_b):
    results = []
    # compare componet count
    mesh_a = obj_a.to_mesh()
    mesh_b = obj_b.to_mesh()
    results.append(len(mesh_a.vertices) == len(mesh_b.vertices))
    results.append(len(mesh_a.edges) == len(mesh_b.edges))
    results.append(len(mesh_a.polygons) == len(mesh_b.polygons))
    # compare bounding box
    for p in range(len(obj_a.bound_box)):
        p_a = [c for c in obj_a.bound_box[p]]
        p_b = [c for c in obj_b.bound_box[p]]
        results.append(p_a == p_b)
    return all(results)
        
def sorting_similar_mesh(objects):
    results =[[objects.pop(0)]]
    
    for obj in objects:
        is_sim = False
        for r in results:
            if is_similar(obj, r[0]):
                r.append(obj)
                is_sim = True
        if not is_sim:
            results.append([obj])
            
    return results
def link_data_block(objects):
    if len(objects) <= 1:
        return
    origin = objects.pop(0)
    for obj in objects:
        obj.data = origin.data
if __name__ == "__main__":
    # get all objects has mesh data.
    mesh_objects = [obj for obj in bpy.data.objects if type(obj.data) == bpy.types.Mesh]
    # sort
    results = sorting_similar_mesh(mesh_objects)
    for r in results:
        link_data_block(r)
        

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です