リグ付きのメッシュをリンクで読み込む方法
リンクで読み込んだデータを変更するにはライブラリオーバーライドを使う。バージョン 2.79 以前の Blender ではプロキシ化を使う。
バージョン 3.0 でプロキシ化は削除された。代わりにライブラリオーバーライドを使う。
バージョン 2.81 以降はライブラリオーバーライドを使う。
バージョン 2.80 以前はプロキシ化(Ctrl + Alt + P)を使う。
この記事では読み込むデータを素材データ、読み込まれたデータを利用データと表記する。
目次
ライブラリオーバーライドを使う
バージョン 2.81 からはライブラリオーバーライドがプロキシ化を置き換える。プロキシ化と違って、ライブラリオーバーライドは利用側で修正していない限り、素材データの変更箇所が自動的に適用される。
プロキシとの違い
- 同じ素材データから複数の独立したオーバーライドを作成できる
- 素材データを破壊せずにモディフィアやコントレイントを追加できる
- プロキシでは変更できなかったデータを変更でき、マテリアルやテクスチャなどのプロパティを選択して変更できる
- オーバーライドが再帰的に適用される(オーバーライドされたデータを、さらにリンクしてオーバーライドできる)
ライブラリオーバーライドの作成
リンクで読み込んだデータをオーバーライドする方法は4種類ある。
シングルデータブロックオーバーライド
- アウトライナで、右クリック > ライブラリオーバーライド > 作成 > 選択
- アウトライナで、右クリック > IDデータ > ライブラリオーバーライドを追加
- プロパティパネルのオブジェクトタブのリンクアイコンを Shift + クリック
3.「ライブラリオーバーライドを作成」オペレーター
ビューポートで、オブジェクト > 関係 > ライブラリオーバーライドを作成。この方法はコレクション内のすべてのオブジェクトのライブラリオーバーライドを作成できる。
このオペレーターを正しく動作させるためには、コレクションの構造に制限がある。自動的にオーバーライドされるコレクションはルート直下のコレクションに限られる。コレクション内コレクションがある場合は手動でオーバーライドする必要がある。
オーバーライドの編集
オーバーライドしたオブジェクトは、エディットモードで行う編集以外の編集が自由にできる。ただしオブジェクトプロパティでもビューポート表示のように変更できないプロパティもある。
オーバーライドしたオブジェクトはメッシュデータを差し替えられる。これにより LOD が容易に実現できるようになった。
再同期(2.91)
素材データを更新した場合は、リロードを行う。
アウトライナで右クリック > ID データ > Resync Library Override Hierarchy
Resync Library Override Hierarchy Enforce(2.93)
Resync Library Override Hierarchy Enforce は古い .blend ファイルを強制的に変換する。いくつかの ID pointers properties のオーバーライドは失敗する可能性がある。
外部リンク
ライブラリオーバーライドの実装
オーバーライドは内部的には、素材データをコピーしたローカルデータブロックとしてデータを保持している。オーバーライドによる変更点は 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 ファイルに切り替え、ファイルを右クリックしてリロードを実行する。
そのほかのライブラリオーバーライドの機能
NLA トラックやストリップのライブラリオーバーライドを作成し、編集。
外部リンク
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 Library」でリロードできる。
複数のオブジェクトを読み込みそれぞれが別のポーズを取る場合
オブジェクトのローカル化が必要になる。オブジェクトを選択して、「ローカル化(L)> 選択したオブジェクトとデータ」を実行する。そのあとでアーマチュアモディフィアのアーマチュアを再設定する。データのリンクが切断されているので、リロードしてもソースオブジェクトの変更は反映されないことに注意する。