概要
Blenderでメッシュが微妙に異なる2つのオブジェクトがあったときに、差分を選択状態にして可視化する方法を紹介します。
なお、シェイプキーがある場合は、先頭のシェイプキーを対象にします。
また、オブジェクトは、頂点数が異なっていても大丈夫です。
手順
頂点座標をイミュータブルにして積集合を作り、積集合に入ってない頂点を選択します。
import bpy
def main():
"""2つのオブジェクトの差分を選択"""
if len(bpy.context.selected_objects) != 2:
print("2つのオブジェクトを選択してください")
return
obj1, obj2 = bpy.context.selected_objects
bpy.ops.object.mode_set(mode="EDIT") # for deselect
bpy.ops.mesh.select_all(action="DESELECT")
bpy.ops.object.mode_set(mode="OBJECT") # for select
vtx1 = [vert.co.to_tuple(4) for vert in obj1.data.vertices]
vtx2 = [vert.co.to_tuple(4) for vert in obj2.data.vertices]
st = set(vtx1) & set(vtx2)
for vtx, vert in zip(vtx1, obj1.data.vertices):
vert.select = vtx not in st
for vtx, vert in zip(vtx2, obj2.data.vertices):
vert.select = vtx not in st
bpy.ops.object.mode_set(mode="EDIT")
if __name__ == "__main__":
main()
bpy.ops.mesh.select_all(action="DESELECT")
せずに、下記だけでもできそうですが、うまくいきませんでした。
vert.select = vtx not in st
すべて非選択にしてからオブジェクトモードに戻らないと反映されないようです。
以上