本日はBlender枠です。
筆者は今年度から3DCGを教える教員として働いているのですが、Blenderについて教える際に頂点の重複によって思わぬトラブルを起こす初心者の方が多いことを感じました。
発生原因としてはEキーで延伸を行う際に何度もEキーを押してしまっていることが考えられます。
これ自体はBlenderを長年使っている筆者自身もいまでもよく起こしてしまうミスです。
通常頂点のマージなどで重複頂点を解消しますが、慣れるまでは重複頂点が存在すること自体なかなか理解できません。
今回はこれを補助するための最初のステップとしてBlenderPythonで重複頂点を表示していきます。
〇コード
今回は次のようなコードを書きました。
import bpy
import bmesh
# アクティブなオブジェクトを取得
obj = bpy.context.active_object
# メッシュデータを取得
mesh = obj.data
# BMeshオブジェクトを作成
bm = bmesh.new()
# メッシュデータをBMeshに変換
bm.from_mesh(mesh)
# 重複頂点の数を初期化
duplicate_count = 0
# 全ての頂点に対して操作
for v in bm.verts:
# 同じ位置にある他の頂点を探す
duplicates = [v_other for v_other in bm.verts if v_other != v and v_other.co == v.co]
# 重複頂点の数を加算
duplicate_count += len(duplicates)
# 重複頂点の数を表示
print("重複頂点の数:", duplicate_count)
簡単に解説するとBlenderPythonではメッシュを編集する際にはBMeshオブジェクトを作成します。
BMeshオブジェクトはBlenderの内部メッシュ編集APIへのアクセスを提供するものであり、UV、頂点カラー、シェイプキーなどのメッシュ属性へのアクセスを提供し、この中にジオメトリの分離、分割、溶解などの操作が可能です。
BMeshオブジェクトの中に選択中のメッシュを代入し変換しています。
すべての頂点に対して座標が一致する頂点数を出力しています。
なおこの操作はオブジェクトモードで行う必要があります。
これによってコンソールウィンドウに頂点が重なっている数が表示されます。

ここでは2つの頂点が重なっていることを意味します。
本日は以上です。