5
5

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 3 years have passed since last update.

BlenderAdvent Calendar 2019

Day 9

Blender2.81以降で、Shapekeyを持ったオブジェクトのModifierを適応したオブジェクトを得る方法

Last updated at Posted at 2019-12-10

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

雑文ご拝見ありがとうございました。

5
5
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
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?