インスタンスを保持(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)