Blenderでは様々な種類のデータを扱うことができ、多くのデータが共通の方法で管理されています。
この記事ではBlenderがどのようにデータを管理しているかを見ていきます。
Blenderのデータの概要
Blenderで制作を行う際には、オブジェクトデータ、メッシュデータや、マテリアル、テクスチャデータなどの多様なデータを扱います。
これらのデータを扱えるよう、Blenderは独自のデータ管理システムを導入しています。
今回の記事ではBlenderがどのような形でデータを管理しているかを見ていき、オブジェクトのリンク作成やインスタンス化について説明していきます。
最後に、リンクなどを使って作成したシーンをSTYLYにアップロードします。
※この記事で使用しているBlenderのバージョンは執筆時の最新版(3.2)となります。
ライブラリオーバライドは3.2からの機能です。このほか、以前のバージョンで共通している部分は多いですが、細かい部分で挙動が異なる場合があるのでご注意ください。
Blenderのデータの扱い
Blenderで使用されるデータに関連する用語
- データ(Data)- Blenderでは様々な種類のデータと呼ばれます。
- ユーザー(User)- データを参照しているオブジェクトです(例:マテリアルを使用するメッシュオブジェクトなど)。
- リンク(Link)- データとオブジェクトのつながりです。
- インスタンス(Instance)- 同じデータから派生し、作成されるオブジェクトです。元データへの変更が各インスタンスに反映されます。
Blenderにおいてのデータとは
Blenderでは内部データは一定の方式で管理されています。
以下は、マテリアルの画面ですが、基本的には全てのデータが同様の構成となっています。
上記のそれぞれの部分は以下の通りです。
- 名前(Name)- データの名称です。
- フェイクユーザー(Fake User) – データに対するユーザーが存在しない場合においてもデータを保存します。
- 新規(New)- 新しいデータを作成します。この例の場合は新しいマテリアルが作成されます。
- リンク切断(Unlink) – データのリンクを切断します。Shiftを押しながら押すことにより、ユーザーの数を0にし、既存のリンクを全て解除します。
2の「フェイクユーザー(Fake User)」ですが、これがなぜ重要なのかというと、リンクが解除されたデータのBlenderの扱いによるものとなります。
Blenderはリンクが切れたファイルをBLENDファイルから削除しようとします。
しかし、ユーザーがいないにも関わらず、特にスクリプトなどを使用したり、今後使用するデータとして置いておく場合にBLENDファイルの中にデータブロックとして保持しておきたい、という場合があります。
そういった場合にこのFake Userを押すことにより疑似的にBlenderに対してユーザーの存在を知らせます。
データに対して、複数のユーザーがいる場合は、以下のような数字が表示されます。
このオブジェクトはユーザー数が「4」となっているので、例えば、このデータを変更すると4つのユーザー全てにその変更が適用されます。
例えば家の壁で同じマテリアルを共有していて、南の壁だけ変更したいとします。
この場合は、その壁を選択し、数字のボタンを押します。
すると、数字が消え、マテリアルに「.001」がついた新しいマテリアルが作成されました。
「.001」がついたのは、Blenderでは、同じデータ形式に関して名前が重複できない、というルールがあるためです。
これにより、派生のマテリアルが作成され、このマテリアルへの変更は単一のオブジェクトにのみ適用されるようになりました。
これをシングルユーザーコピーを作成する、といいます。
これにより、元のマテリアルのユーザー数が4から3に減ったことが確認できます。
このデータの扱いの考え方は多くのデータで共通しており、例えば画像ファイルをテクスチャとして読み込んだ場合は以下のようなデータになります。
画像ファイルの場合はマテリアルなどに対してリンクすることができます。
単一の画像ファイルは複数のマテリアルに対して指定することで、共通したテクスチャファイルとして使用することができます。
データの種類によって使用できるボタンに違いがあり、例えば画像ファイルの場合は、そのファイルを参照するためのボタンが備わっています。
尚、画像ファイルのように汎用性が高いファイルについてはテクスチャ以外にもコンポジターの一要素として使用することができますが、この場合も同じ画像を新たなデータとして読み込む必要はなく、同じデータを参照することが可能です。
参照するデータを切り替えたい場合はアウトライナーについている各カテゴリのボタンを押します。
この時、名前の部分を押すと、アウトライナーやオブジェクトの選択が切り替わりますが、プロパティが切り替わりませんのでプロパティ上でデータの編集が必要な場合は確実にアイコンをクリックし、正しいプロパティが選択されていることを確認してください。
オブジェクトは階層的に例えば、オブジェクト(オブジェクトについては後述します)→メッシュ→マテリアルといったようにリンクされていますが、上位のデータがリンクされている場合、下位のデータは同位のデータとして共有されており、そのままでは下位のデータのシングルユーザーコピーを作成することはできません。
これを行いたい場合はまず上位のデータをシングルユーザー化する必要があります。
なぜこのようになっているかというと、リンクされているオブジェクトは必然的にリンク元のオブジェクトと同位であり、連動するため、リンクを外す、という行為が矛盾するためです。
尚、もちろんオブジェクト自体が違うオブジェクトから同じマテリアルをリンクしている場合がありますが、この場合は当然ながらユーザー数が表示されており、シングルユーザー化するとリンク元・リンク先オブジェクトで共有しているオブジェクトが独立してシングルユーザーコピーを保持します。
例えば以下のようにマテリアルを共有している二つのオブジェクトと、一つのリンクがあるとします。
この場合、「Object 1」のリンクはあくまでも「Object 1」に紐ついているため、「Material 1」のユーザー数は実際には3つのオブジェクトで共有されているように見えても、2となります。
この状態で、「Object 1」のリンクを切ると以下のようになります。
「Object 1」のリンクが解消されたので、ユーザー数は「Object 1」のみになり、リンクがない状態になります。
その代わりにMesh 1のユーザー数が「2」になりました。
次に「Object 1」から「Mesh 1」のリンクを解除してみます。
今度は「Mesh 1」のリンクが解消されたので、「Mesh 1」のユーザー数が減りました。
その代わりに「Material 1」のユーザー数が増えました。
従って、リンクがつながっている状態(上記初期状態)で「Mesh 2」からのリンクを解除した場合は下のような状態になります。
尚、リンクは双方向であり、後述のファイル間のリンクの場合を除き、優劣はありません。
例えば、データを他のオブジェクトにリンクした場合、最初に作成したデータを含め、任意のデータを他のデータに影響を与えることなく削除することができます。
データブロックを辿ることなしにシングルユーザー化処理をする方法も用意されており、「オブジェクト(Object)」→「関係(Relations)」→「シングルユーザー化(Make Single User)」のメニューが使用し、シングルユーザー化したい要素を選択することができます。
オブジェクトにおけるインスタンス
造形物などのオブジェクトに関しても同じようにリンクを行い、インスタンスとして扱うことができます。
この場合は[Alt]+[D]を使用します。
このようにインスタンスとして作成したオブジェクトは編集モードで加えた変更が反映されます。
このようにインスタンスの数がデータに反映されていることが分かります。
全てのメッシュデータはオブジェクトの下に入れ子になる形で配置されていますので、リンクをした場合は以下のように同じメッシュデータが異なったオブジェクトの下に表示されます。
オブジェクトが箱で、その中に何らかのデータが入っている、というイメージをするとわかりやすいかもしれません。
オブジェクトは箱ですので、この場合、箱を動かしてもその動きは他のオブジェクトには影響しません。
編集モードで動かした時点でその動きが反映されます。
編集モードの反映を防ぎたい場合はメッシュもシングルユーザー化してください。
尚、このようなインスタンス作成はメッシュデータのほかに、ライトやカメラなどでも行うことができます。
リンク・インスタンス作成の利点
データを複製するのと違い、リンク・インスタンス作成には以下のような利点があります。
- メモリ上で複数のオブジェクトデータを分けて管理する必要がないためメモリ消費を抑えることができる。
- 一つのオブジェクトの他のオブジェクトに適用することができるため、変更の点が省ける。
シーンを使い分ける
Blenderではシーンという概念があり、複数のシーンを作成することができます。
これを利用すると、例えば、一つのシーンで個別のモデリングを行い、モデリングしたデータをレイアウト用のシーンにリンクし、そのシーンでレイアウトする、というような作業を行うことが可能になります。
この手法の利点はモデルを編集したくなった場合にシーンを切り替え、シーンに配置した他のオブジェクトを考慮することなしに編集が可能になります。
まずは新しいシーンを作成してみます。
シーンを作成したい場合は上部のボタンを使用します。
こちらは次のような機能を持ちます。
- シーン切り替え
- シーン名(編集可能)
- 新規シーン作成
- シーン削除(一つしかシーンがない場合はこのようにグレーアウトされ、削除することができません。)
3の新規シーンを作成するボタンを押します。
すると次のようなメニューがポップアップします。
次のような選択肢があります。
- 新規(New) – 何も配置されていない、新しいシーンを作成します。
- 設定をコピー(Copy Settings) – 各種設定のみを引きついだ、何も配置されていない新しいシーンを作成します。
- リンクコピー(Linked Copy) – 現在のシーンのオブジェクトをリンクしたシーンを作成します。
- フルコピー(Full Copy) – 現在のシーンを複製した新しいシーンを作成します。
今回の場合は、「新規(New)」を選択します。
そして、何らかのオブジェクトを配置します。
今回はsample.pngという画像を読み込んだ平面を配置しました。
実際の作品制作で使用する場合は、この画面でモデリングを仕上げていく流れとなりますが、今回の例の場合はこのオブジェクトのみで、他のシーンにインスタンスを作成してみたいと思います。
オブジェクトを選択し、「オブジェクト(Object)」メニューより「データをリンク/転送(Link/Transfer Data)」→「シーンにオブジェクトをリンク(Link Objects to Scene)」を選択し、最初のシーンを選びます。
すると元のシーンに先ほど新しいシーンに配置したオブジェクトが表示されているのが見えると思います。
このままでは不都合が起こってしまいます、というのも、元のシーンでこのオブジェクトを動かしたりすると新しいシーンのオブジェクトにもその動きが伝わってしまいます。
この記事の先頭でオブジェクトのリンクを作成した際、オブジェクトに箱に見立て、箱はリンクの影響を受けずに動かすことができる点について説明しました。
これと同じ考え方がシーンを超えたリンクでも可能です。
アウトライナーからオブジェクトを選択すると次のようにユーザー数が2になっています。
この数字の部分を押し、シングルユーザー化します。
ユーザー数の表示が消え、sampleの名称が重複を防ぐため「sample.001」と変化しました。
そして、メッシュ情報を確認するとメッシュのユーザー数が「2」に変化しているのが確認できます。
この状態でオブジェクト自体に変更を加えても新しいシーンに配置したデータに影響は及びませんが、単純なインスタンスと同じように、編集モードにオブジェクトに編集を加えるとその変更は反映されます。
これを防ぐためには前述と同様に、メッシュをシングルユーザー化します。
外部データをライブラリとして参照する
BlenderのデータはBLENDファイルに格納されており、他のBLENDファイルから他のファイルのデータを参照することができます。
例えば、他のファイルのモデルデータや、マテリアルなどを個別に参照することができます。
例えば、一つのBLENDファイルでシーンの時と同様にsample.pngという画像を読み込んだ平面を作成し、保存したとします。
次に新規ファイルを作成し、そのファイルからファイル(File)→リンク…(Link…)を選択します。
するとファイルのリストが作成されるので、平面を作成したBLENDファイルを選択します。
今回の場合、これを「data1.blend」と呼称しています。
ファイルを開くと次のように階層になっています。
ここで表示されているのはファイルではなく、ファイル内のデータ種別を階層的にファイルのように表示している状態となります。
「Object」の中を見てみましょう。
オブジェクトがリストされており、その中にsampleオブジェクトがあるのが分かります。
これを選択してみます。
「リンク(Link)」ボタンを押すと、シーン内に同じようにオブジェクトが配置されるのが見えると思います。
リンクされているアイテムはこのようにリンクのアイコンが表示されます。
試しに、このオブジェクトを回転させてみます。
しかし、回転しないのが確認できます。
これは、リンクされたオブジェクトは編集できない、という制約があるためです。
Blenderはリンクとして引用している他のファイルを編集しない、という原則があり、リンクは単一方向であり、シーンの時と違い、シングルユーザー化することも許可されません。
そのため、このままではあまり便利ではありません。
ただし、方法は違いますが、オブジェクトを箱に見立てたように、違うレベルでのリンクをすることができます。
前述のリンクメニューよりファイルを開き、今度は「Mesh」を選択してみてください。
その中にはsampleメッシュが存在していることが分かります。
これをリンクすると先ほどと同じように見えますが、今度はオブジェクトにはリンクアイコンがついていないことがわかります。
この状態であればオブジェクトを動かすことができます。
編集モードに入ろうとすると、メッシュの編集になるため、不可能である表示が出てきます。
リンクされた場合は、元となるデータを編集するとリンク先でも反映されます。
完全に編集可能な複製が必要な場合は、リンク(Link…)の代わりに「アペンド(Append…)」メニューを使用してください。
ただし、この場合、元となるデータを編集しても反映されません。
ローカル化とライブラリオーバライド
上記の方法で、リンクされたオブジェクトの挙動を詳しく見てきましたが、こちらに関してはより手軽に行うことができます。
さらに柔軟にリンクしたオブジェクトを使用できる3.0新機能、ライブラリオーバーライドに関しても説明します。
ローカル化
「オブジェクト(Object)」→「関係(Relations)」→「ローカル化…(Make Local…)」のメニューを使用するとオブジェクトのローカル化することができます。
このメニューでは4種類のローカル化を選ぶことができ、それぞれ、上からオブジェクトのみのローカル化、オブジェクトとそれに関連したデータ、オブジェクトと、それに関連したデータとマテリアル、そして全て、どの程度の深度でローカル化を行うかを選ぶことができます。
ライブラリオーバライド
「ライブラリオーバーライド(Library Override)」は3.0で追加された機能です。
ライブラリオーバーライドローカル化に似ているのですが、通常はリンクのようにふるまいながら、元のデータが変更された場合に、ライブラリオーバーライドされたオブジェクトは変更がない要素のみ元データからの変更を適用します。
これは例えば、取り込んだオブジェクトを派生させたり、独自のアニメーションを加えたいしたい場合にその威力を発揮する機能です。
ライブラリオーバーライドは「オブジェクト(Object)」→「関係(Relations)」→「ライブラリオーバーライドを作成…(Make Library Override…)」で設定することができます。
ライブラリオーバーライドが設定されたオブジェクトは次のような表示なります。
ライブラリオーバーライドした場合にはデータが複製されたような挙動になります。
作成後は重複するシーン上のオブジェクトは削除しても作成されたライブラリオーバライドのオブジェクトは削除されませんが、ライブラリオーバライドオブジェクト同士の複製の状態は同期されるため、複数の種類の亜種を作成したい場合は必ず元のリンクオブジェクトから作成する必要があります。
そのため、元のオブジェクトは隠しておく、という形にし、削除はしない方がいいかもしれません。
ライブラリオーバーライドのオブジェクトの要素を編集したい場合はアウトライナーの項目を右クリックし、「ライブラリオーバーライド階層を作成(Make Library Override Hierarchy)」を選択するとそのオブジェクトまでの階層をシングルユーザー化し、編集できるようになります。
もう一つのオプション、「ライブラリオーバーライドを単一化(Make Library Override Single)」で、上の階層から順番に手動でシングルユーザー化することも可能です。
ただし、この機能は比較的新しいこともあるのか、状態がうまく保存されない場合も多く、後述のサンプルシーン作成の際にもローカル化を行いました。
今後のバージョンで修正、改善される可能性がありますが、変更するプロパティ情報によってはうまく保存されない場合もあることを留意してください。
データ情報をより詳しく見る方法
BLENDファイルに格納されているデータの内容を一覧したい場合には、アウトライナー(Outliner)の「Blenderファイル(Blender File)」に切り替えるとその内容を見ることができます。
この表示に切り替えるとBLENDファイル内に格納されている情報を一括して一覧することができます。
また、データAPI(Data API)表示を使用するとさらに詳しい表示を閲覧したり、編集することもできます。
こちらはBlenderがどのようにデータを認識しているかを見ることができる画面で、より高度な編集を行いたい場合に使用できます。
STYLY制作においての応用
リンクなどを使用して作成した手法はFBXに出力することでSTYLYにアップロードすることが可能です。
今回は次のようなシーンをアップロードしてみます。
まずは最初のシーンを全体的なレイアウト用に使用しますので名称を「Layout」と変更しました。
別のシーンを作成し、シーンに設置する木を作成したいと思います。
こちらはシーン名をTreeとし、木のモデルを作成しました。
シンプルな家のモデルも別のシーンで作成しました。
次に車のモデルを作成したいと思います。
こちらは別のファイルで行いました。
次にレイアウトシーンに道などのモデルを作成し、先ほど作成したオブジェクトを配置していきました。
リンクしたオブジェクトに対して、モディファイアを設定することも可能なので街路樹を配列(Array)モディファイアを使用して作成しました。
以下のような設定となります。
自動車や家は屋根やボディの色をシングルユーザー化し、色を変更しました。
STYLYにアップロードする方法
3DモデルをSTYLYにアップロードしてみましょう。
アカウント作成方法
STYLYにアップロードする方法
UnityからSTYLYにアップロードする方法
STYLYに関する質問、バグ報告、改善してほしい要望はSTYLY FORUMまで
https://jp.forum.styly.cc/support/discussions
これまで見てきたように、Blenderのリンク機能などを使うことにより、さらに効率のよいモデリングができたり、他の方が作成したモデルやその他のアセットなどを流用するのが楽になります。
複雑なコンセプトではありますが、うまく利用することで快適なモデリング環境を作ったり、モデルデータなどの再利用などが行いやすくなります。
Certified by:Shota Yoshizawa
Edited by:SASAnishiki