[Cinema 4D] ノードマテリアルのパラメータをユーザーデータで調整したい
先日,RedshiftのノードマテリアルのパラメータをXPressoで制御したいことがあり試したところ,作り方で少し迷ってしまったのでメモがてら書き残しておきます.XPresso関連なので初心者向けの内容ではないです.あしからず...
1. ノードマテリアルのパラメータをXPressoで制御したい
実のところ作り始める前は簡単だろうと思っていたのですが,作り始めると少し壁にぶつかってしまいました.そういえばノードパラメータってどうやってXPressoノードとして作るわけ?というところです.
今回使用しているノードマテリアルはRedshiftマテリアル(ノードスペースを使う方)となりますが,基本的にはCinema 4Dのノードスペースでも同じです.
内容としてはユーザーデータからノードマテリアルのオパシティをコントロールしてみようと思います.
2. 方法1: ドライバー,レシーバ設定機能を使う
最初に試した方法はこちらです.簡単ではありますが使い勝手がよくないので最終的には使っていません.ただ,仕組みを理解する分には良いかと思います.
作成したユーザーデータのパラメータを右クリックし,コンテキストメニューの「XPressp」→「ドライバを設定」します.
マテリアルノードの「Opacity」を右クリックし,コンテキストメニューから「XPresso」→「絶対レシーバを設定」します.
すると,XPressoタグ付きのExpressionという名前のヌルオブジェクトが生成されます.XPressoの中身はユーザーデータからレンジマップを通してOpacityへワイヤが自動的に接続されています.このレンジマップの範囲は絶対レシーバか相対レシーバで変わりますが,この詳細は割愛します.
さて,これでユーザーデータからRedshiftのノードパラメータに値を渡すことが出来るようになりました.簡単でしたが,でも意外とこの方法も気が付きにくいと思います.
しかもこの方法は難点があり,ドライバーとレシーバを作成するたびに新しいヌルとXPressoタグが作成されてしまいますし,まとめるのも面倒になってきます.そこで,このXPressoの中身を手動で作る方法を考えてみます.
2. 方法2: 手動でXPressoノードを作成する
まずノードの種類を特定するために,先ほど作成されたXPressoのノードタイプを見てみると,これは「オブジェクト」ノードになっていて,「Material」を参照していることが確認できます.
あぁなるほど,マテリアルをここで参照すればいいのか,と思いますがこれはちょっと落とし穴があって,ここにあるマテリアルはノードマテリアル内にある「Material」ノードを指していて,マテリアルオブジェクトではありません.
試しに参照先をマテリアルオブジェクト(マテリアルマネージャにある方)にしてみると,ポートが未定義になってしまいます.使用できるポートもCinema 4D標準マテリアルのチャンネルに変わってしまいました.よって,ノードパラメータにデータを渡したり取り出すにはノードオブジェクトを設定する必要があるということです.
それではノードオブジェクトをここにドラッグ&ドロップすればいいんだな,と思い実行してみるも,ノードが移動するばかりでドラッグ&ドロップできないようです.また,パラメータそのものをXPressoエディタへドラッグ&ドロップすることもできません.どうすればよいのでしょうか.実はここで一番はまってしまった訳ですが.結論から言うとノードを選択したときに表示される小さなアイコンまたは,ポートに接続したときに表示されているのが,ドラッグ&ドロップできるノードオブジェクトのようです.
例えば,マテリアルを選択し,「Inputs」タブを見ると最終出力にあたる「Output」ノードの「Surface」に接続されていることが確認できます.この「Material」こそがノードオブジェクトであり,これをXPressoエディタにドラッグ&ドロップすると良いということが分かりました.
他にも設定したいノードを選択し,ノードアイコンをドラッグ&ドロップしてもOKです.
なるほど,ノードオブジェクトは,インプットされたノードから,またはノード自身のアイコンから取得できるわけですね.仕組みさえわかれば簡単なことですが,インターフェイス上なかなか分かりにくいような気がしました.
とはいえオブジェクトノードとノードオブジェクトの仕組み,これさえ分かってしまえばノードパラメータをユーザーデータでコントロールすることは簡単です.
3. インプットポートをユーザーデータでコントロールしてみる
では次のようにインプットポートを作成した場合,それをユーザーデータで調整する場合はどうすればよいのでしょうか.もう説明不要かと思いますが...
先ほど例から分かる通り,インプットされたノードオブジェクトから辿ることができるので,この場合はレイヤノードのマスクを見てみると,「Root」というのがあり,これがインプットポートを持つノードオブジェクトになります.実際にこの「Root」の文字をXPressoエディタ上にドラッグ&ドロップするとインプットポートで作成した「Opacity_Value」というポートを見つけることができます.
または,インプットポートを選択し,属性マネージャで表示されたノードアイコンをドラッグ&ドロップしてもOKです.
さて,久しぶりの投稿はややテクニカルな内容になってしまいましたが,ノードマテリアルのパラメータをXPressoで制御したいケースをご紹介しました.XPressoで制御できるようになると作業効率はもちろん上がりますし,他のパラメータと連動させるなど,複雑なアニメーションも作成できるようになりますので,上手く活用していきたいものです.