BloomScheme Blog

株式会社ブルームスキーム公式ブログ

オブジェクトの頂点グループ範囲外のインデックスがアサインされている場合の対処方法

f:id:BloomScheme:20190216003615p:plain

 

問題

珍しいケースですが、各頂点にアサインされている頂点グループのインデックスが、オブジェクト自体が現在もっているグループ数より大きな値になっていることがあります。このような状態になっているとglTFエクスポートでエラーがでて失敗してしまいます。 
 
頂点にアサインされている頂点グループのインデックスはbpy.data.objects["Body"].data.vertices[0].groups[0].group
というような形で確認できるますが、groupsにはremove的なコマンドは存在しません。
調べても基本的に、bpy.ops.object.vertex_group_remove_from()で除去するしかなく、これには存在しない頂点グループを指定することはできません。
 

解決方法

強引なやり方ですが、各頂点にアサインされている頂点グループのインデックスを走査しインデックスの最大値を求め、その分のダミーグループを作成します。
ダミーグループをそれぞれアクティブにし、頂点から割り当てを除去すれば余分なインデックスを削除できます。ダミーグループは処理完了後除去します。
 

コード 

import bpy
obj = bpy.data.objects["Body"]
vertices = obj.data.vertices


def get_maxindex():
    group_indexes = []
    assigned_groups = []
    for vert in vertices:
        vert.groups.update()
        assigned_groups.append(len(vert.groups))
        for group in vert.groups:
            group_indexes.append(group.group)
    return max(group_indexes)
print("max:"+str(get_maxindex()))
max_index = get_maxindex()


vertex_groups = obj.vertex_groups
vertex_groups_length = len(vertex_groups)

delta = max_index - vertex_groups_length

dummy_name = "TMPDUMMYGROUP"

dummy_groups = []
for i in range(delta):
    dummy_groups.append(obj.vertex_groups.new(name=dummy_name))

for dummy_group in dummy_groups:
    index = obj.vertex_groups.find(dummy_group.name)
    obj.vertex_groups.active_index = index
    bpy.ops.object.vertex_group_remove_from(use_all_verts=True)

vgnames = obj.vertex_groups.keys()
for vgname in vgnames:
    if dummy_name in vgname:
        obj.vertex_groups.remove(obj.vertex_groups[vgname])

print("max:"+str(get_maxindex()))
print("end")