1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Blenderで2つのオブジェクトの頂点の差分を調べる

Last updated at Posted at 2022-05-08

概要

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()

参考:BlenderでPythonを実行する方法

bpy.ops.mesh.select_all(action="DESELECT")せずに、下記だけでもできそうですが、うまくいきませんでした。

        vert.select = vtx not in st

すべて非選択にしてからオブジェクトモードに戻らないと反映されないようです。

以上

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?