本日はBlender枠です。
先日Blender/Mayaで重複頂点をマージしクリーンアップを行う処理を見ていきました。
今回はPythonでそもそも重複頂点のマージが必要であるかどうかを検知するコードを書いていきます。
〇環境
・Windows11PC
・Blender4.1
〇重複頂点の検出法とアプローチ
まずは重複頂点の定義を考えていきます。
重複頂点とは座標が重なっている頂点を指します。

ただし、全く同じ座標であること以外にも極同座標に関しても同じことが呼べます。
そのため閾値が必要となります。
まずは現在選択しているオブジェクトを検出し、その中から頂点データへアクセスする必要があります。
obj = bpy.context.active_object
if obj.type != 'MESH':
print("選択されたオブジェクトはメッシュではありません")
return
# オブジェクトの頂点座標を取得
mesh = obj.data
vertices = [v.co for v in mesh.vertices]
これに対して閾値をもとに近い座標のペアを出力します。
ここではからのリストを作成し、その中にデータを格納しています。
# 重複頂点を検出するためのリスト
duplicates = []
for i in range(len(vertices)):#頂点数実行
for j in range(i + 1, len(vertices)):
if (vertices[i] - vertices[j]).length < threshold:
duplicates.append((i, j))
ここで追加されたduplicatesの数が重複頂点数です。
これをログとしてコンソールに出力します。
if duplicates:
print(f"重複頂点が {len(duplicates)} 組見つかりました:")
for pair in duplicates:
print(f"頂点 {pair[0]} と {pair[1]} が重複しています")
else:
print("重複頂点は見つかりませんでした")

こちらを実行すると上記のように重複頂点数を検出できました。
本コード自体は単体では意味がありませんが、自動的にクリーンアップするためのツールなどのutilityツールの開発に役立ちそうです。
本日は以上です。
〇コード全文
import bpy
import math
from mathutils import Vector
def find_duplicate_vertices(obj, threshold=0.0001):
# オブジェクトがメッシュであることを確認
if obj.type != 'MESH':
print("選択されたオブジェクトはメッシュではありません")
return
# オブジェクトの頂点座標を取得
mesh = obj.data
vertices = [v.co for v in mesh.vertices]
# 重複頂点を検出するためのリスト
duplicates = []
# 頂点ペアを比較して閾値内で近い頂点を探す
for i in range(len(vertices)):
for j in range(i + 1, len(vertices)):
if (vertices[i] - vertices[j]).length < threshold:
duplicates.append((i, j))
# 結果を出力
if duplicates:
print(f"重複頂点が {len(duplicates)} 組見つかりました:")
for pair in duplicates:
print(f"頂点 {pair[0]} と {pair[1]} が重複しています")
else:
print("重複頂点は見つかりませんでした")
# 閾値を設定(例:0.0001メートル)
threshold_value = 0.0001
# 選択中のオブジェクトを取得
selected_obj = bpy.context.active_object
# 重複頂点の検出を実行
find_duplicate_vertices(selected_obj, threshold_value)