広告
広告

リグ付きのメッシュをリンク・ライブラリオーバーライドで読み込む方法

カテゴリ:blender

バージョン 2.81 以降はライブラリオーバーライドを使う。

バージョン 2.80 以前はオブジェクトとアーマチュアとを読み込み、アーマチュアのみを選択して「オブジェクト > 関係 > プロキシ化(Ctrl + Alt + P)」する。

この記事では読み込むデータを素材データ、読み込まれたデータを利用データと表記する。

バージョン 2.81 でライブラリオーバーライドを使う

バージョン 2.81 からはライブラリオーバーライドがプロキシ化を置き換える。プロキシ化と違って、ライブラリオーバーライドは利用側で修正していない限り、素材データの変更箇所が自動的に適用される。

プロキシとの違い

  • 同じ素材データから複数の独立したオーバーライドを作成できる
  • 素材データを破壊せずにモディフィアやコントレイントを追加できる
  • プロキシでは変更できなかったデータを変更でき、マテリアルやテクスチャなどのプロパティを選択して変更できる
  • オーバーライドが再帰的に適用される(オーバーライドされたデータを、さらにリンクしてオーバーライドできる)

ライブラリオーバーライドの作成

リンクで読み込んだデータをオーバーライドする方法は3種類ある。

シングルデータブロックオーバーライド

  • アウトライナで、右クリック > IDデータ > ライブラリオーバーライドを追加
  • プロパティパネルのオブジェクトタブのリンクアイコンを Shift + クリック
  • make library override
    プロパティパネルでライブラリオーバーライドの作成

「ライブラリオーバーライドを作成」オペレーター

ビューポートで、オブジェクト > 関係 > ライブラリオーバーライドを作成。この方法はコレクション内のすべてのオブジェクトのライブラリオーバーライドを作成できる。

このオペレーターを正しく動作させるためには、コレクションの構造に制限がある。自動的にオーバーライドされるコレクションはルート直下のコレクションに限られる。コレクション内コレクションがある場合は手動でオーバーライドする必要がある。

オーバーライドの編集

オーバーライドしたオブジェクトは、エディットモードで行う編集以外の編集が自由にできる。ただしオブジェクトプロパティでもビューポート表示のように変更できないプロパティもある。

オーバーライドしたオブジェクトはメッシュデータを差し替えられる。これにより LOD が容易に実現できるようになった。

ライブラリオーバーライドの実装

オーバーライドは内部的には、素材データをコピーしたローカルデータブロックとしてデータを保持している。オーバーライドによる変更点は RNA パスを使って管理されている。

.blend ファイルに保存するときにローカルのオーバーライドと素材データとの差分を取り、その差分が .blend ファイルに保存される。

.blend ファイルをロードするさいには、まず素材データをコピーし、その後で差分を適用する。

そのため編集不可能なプロパティを変更する操作が差分に含まれる場合、リロードした際にその編集不可能なプロパティが変更されてしまう。

バージョン 2.81 の時点での既知制限

将来的にはより多くのプロパティがオーバーライド可能になる予定だ。現状はプロキシの置き換えと、ポージング/アニメーションのためのキャラクターのオーバーライドの作成を優先している。

ドライバーを使ってシェイプキーを操作する場合は利用側で再設定が必要になる。詳細は Library Override: Driven Shape Keys Don't Work (neither via custom properties nor transforms) を参照。

オーバーライドはローカルデータブロックを利用して実装されているので、ツールやオペレーターがオーバーライドできないプロパティを変更することがある。そのような変更点はリロードすると元に戻るので注意する必要がある。

差分の検出には時間がかかることがある。デフォルトでは保存時だけではなくアンドゥ時にも差分を取るので、重いシーンでは問題になることがある。現状では自動オーバーライド機能を無効にすることでこの問題に対処できる。オーバーライドしたオブジェクトを選択して、コンソールから bpy.context.active_object.override_library.auto_generate = False でアクティブオブジェクトの自動オーバーライドを無効にできる。アーマチュアにこれを適用するだけでも効果がある。

プロキシと同様に、素材データへのリンクが壊れている場合にアウトライナーからリロケートを実行してもうまくいかない。特にボーンシェイプはロストしがちだ。

ジオメトリオブジェクト(メッシュ)をオーバーライドすると、ジオメトリ自体はオーバーライド不可能でもそのデータはすべてローカルにコピーされる。

外部リンク

Blender 2.81: Library Overrides

バージョン 2.80 でリンクで追加したコレクション内のすべてのオブジェクトをプロキシ化する

リンクで追加したコレクションを選択して以下のスクリプトを実行する。

import bpy

active = bpy.context.active_object
depsgraph = bpy.context.evaluated_depsgraph_get()
for i in depsgraph.object_instances:
    if i.is_instance and hasattr(i.parent, 'name') and i.parent.name == active.name:
        bpy.ops.object.proxy_make(object=i.object.name)
        bpy.context.view_layer.objects.active.name = i.object.name + '_proxy'
        bpy.context.view_layer.objects.active = active

バージョン 2.79 以前

グループを使う場合

グループの使用は推奨しない。オブジェクトのエンプティを除去できないからだ。ただし実用上は問題ないので、それを気にしないならグループでリンクすることも可能だ。ただしローカル化ができないので、複数体読み込んで別々のポーズを取らせるといったことはできない。オブジェクトをプロキシ化するとできないこともないが、モディフィアがすべてリセットされる。

グループをプロキシ化するときは、「プロキシ化 > アーマチュア名」を実行する。

リロード

アウトライナの表示する情報のタイプを Blender ファイルにして、ファイルを右クリックして「再読み込み」を選択する。

reload
オブジェクトのリロード

一度この方法でリロードした後は、「スペース > Reload Library」でリロードできる。

複数のオブジェクトを読み込みそれぞれが別のポーズを取る場合

オブジェクトのローカル化が必要になる。オブジェクトを選択して、「ローカル化(L)> 選択したオブジェクトとデータ」を実行する。そのあとでアーマチュアモディフィアのアーマチュアを再設定する。データのリンクが切断されているので、リロードしてもソースオブジェクトの変更は反映されないことに注意する。

関連記事

Blender のリンクとアペンドの違い

Blender 2.81: Library Overrides

Blender 記事の目次


広告
広告