9日が空いていたので書きました。
#なんでもいいからワンクリックでさせてくれ
アドオンを御用意しました。
####ただし、いきなりいじると参照が弱いのか落ちるので、実行したら保存して開き直すことを推奨します。
適応したいメッシュオブジェクトを選択し、虚無を右クリックからAdd Modifier Applied Objectを実行するととなりに出来ます。
https://github.com/iCyP/Add_Modifier_Applied_Object_forBlender2_8 から
1. Clone or Download からZIP DOWNLOAD
2. zipをそのままaddon install
3. testingから有効にする
4. あとは実行するだけ
#説明
2.80以前からの変更概要:2.81からto_mesh()で得たメッシュは一時的なものとなり、直接オブジェクトの作成のソースにすることができなくなりました。
そのため、to_mesh()で得たメッシュをcopy.copy()で複製したものをオブジェクト作成のソースにする必要があります。
いいたかったことはそれだけ。
ではやる事(スクリプトベース)(上のアドオンにコメントをつけたようなものです)
ob_eval = base_obj.evaluated_get(bpy.context.view_layer.depsgraph)
#にて、現在ビューポートにあるメッシュの状態を持ったオブジェクトを入手します。
tmp_mesh = ob_eval.to_mesh().copy()
#to_mesh()でモディファイアがApplyされたメッシュを入手し、copy.copy()で複製します。
#これをシェイプキーを一個のみずつ値を1にして、すべてのシェイプキーのメッシュを得ます。
#得たメッシュを
meshs = [bpy.data.objects.new(s.name,s) for s in shapes[1:]]
for s in meshs:
context.collection.objects.link(s)
#のような形でシーンに紐づけます
#以下のコードで頂点グループをベースから適応後に転送します
for vg in base_obj.vertex_groups:
dup_obj.vertex_groups.new(name=vg.name)
#元のオブジェクトにある頂点グループの名前で、新しいオブジェクトに空の頂点グループを作る。
mod = dup_obj.modifiers.new(name="tmp", type="DATA_TRANSFER")
mod.object = base_obj
mod.use_vert_data = True
mod.data_types_verts = {'VGROUP_WEIGHTS'}
bpy.ops.object.modifier_apply(apply_as='DATA', modifier=mod.name)
#ここまででDATA_TRANSFERモディファイアで頂点グループを転送し、適応します。
#shapekey_transfer
#シェイプキー用メッシュをすべて選択し、適用後用オブジェクトをアクティブにしたのち、
#blenderの機能で一気にシェイプキーを転送します
dup_obj.shape_key_add(name="Basis")
bpy.ops.object.join_shapes()
#一時的に作成した、シェイプキー用メッシュオブジェクトとそのオブジェクトを削除します
for s in shape_objs:
bpy.data.objects.remove(s)
for shape in shapes[1:]:
bpy.data.meshes.remove(shape)
#マテリアルスロットにマテリアルが割り当てられていないので、もとのオブジェクトから割当ます。
for fmat, tmat in zip(base_obj.material_slots, dup_obj.material_slots):
tmat.material = fmat.material
雑文ご拝見ありがとうございました。