Cinema 4D R23のシーンノードで背面法のトゥーンラインの再現
Cinema 4D R23で、オブジェクトをノードベースで生成するシーンノードという機能が追加されたので、背面法と呼ばれる方法でトゥーンラインを生成する方法を紹介します。
背面法
3Dモデリングの輪郭線を出す方法はいろいろありますが、元のオブジェクトより一回り大きいオブジェクトを用意して法線を反転して陰面消去する背面法と呼ばれています。
今回はこの方法をプロシージャルで再現します。
プロシージャルで実現すること
作成の前にノードで実現することを書き出します。こうしておけば作業がより明確になります。
オブジェクトを複製する
オブジェクトを太らせる
オブジェクトの表面は透明なマテリアルを割り当て
オブジェクトの裏面にはラインカラーを割り当て
複製したオブジェクトを元のオブジェクトの動きに追従させる
できれば、アセットとして使えるようにする
出来上がりのイメージはこんな感じです。ラインを生成したいオブジェクトを割り当てて、ラインの太さを調整できるようになっています。
オブジェクトを複製する
オブジェクトを複製するために<レガシーオブジェクトインポート>ノードを作成します。このノードは、従来のオブジェクトマネージャに表示されるオブジェクトをシーンノードに取り込み、オブジェクトの情報を取得したり、別オブジェクトとして生成します。
最終的には<ジオメトリOp>を使ってシーンに生成しますが、この段階では、<レガシーオブジェクトインポート>ノードを作成して、オブジェクト欄にラインを生成したいオブジェクトを割り当て、「パラメータ更新」ボタンを押します。
パラメータ更新ボタンを押すと、オブジェクトの情報を出力ポートが表示されます。
なお、複数のオブジェクトで構成されたオブジェクトを割り当てたい場合は、すべてのオブジェクトを<一体化オブジェクト>でまとめて、一体化オブジェクトを割り当てます。こうしないとオブジェクト全体のジオメトリが取得できないからです。ですので、ヌルオブジェクトでグループ化したものは、ヌルの情報しか取得できません。
注意:シーンノードではオブジェクトマネージャに表示されているオブジェクトを直接操作や変形させることはできません。これはシーンノードが処理がオブジェクトマネージャでの処理の後に行われるためです。ですので、シーンノードで生成したものの情報をXPressoで取得するといったことはできません。将来もできるようにはならないとのことです。これはMaxonが、新しいオブジェクト管理に移行予定で、XPressoもシーンノードに置き換わる予定と発表しています。
オブジェクトを太らせる
シーンノードにモデルを読み込んだので、これをアウトラインとして表示させるために太らせます。太らせるには、頂点を法線方向に向かってオフセットできる<頂点>ノードを使います。
<レガシーオブジェクト インポート>ノードのジオメトリと<頂点>ノードのジオメトリを接続します。法線方向オフセットの値は、とりあえず1cmを入れておきます。この値で、トゥーンのラインの太さがコントロールできます。
<頂点>ノードは、入力されたジオメトリの頂点情報を加工して、分布データとして書き出すだけなので、これを元のジオメトリに変更後の情報を代入する必要があります。代入は、<ジオメトリプロパティ代入>ノードを使います。
<レガシーオブジェクト インポート>ノードのジオメトリを出力して、加工前のジオメトリ情報として<ジオメトリプロパティ代入>ノードに入力します。そして、法線方向に移動した頂点情報を<頂点>ノードの分布データとして出力したものを<ジオメトリプロパティ代入>ノードのくり返しに接続します。これで、オブジェクトが太くなったジオメトリデータができあがりました。
この状態で生成されたオブジェクトして、シーンに追加されていないのでビューポートには表示されていません。ビューポートに表示させるためにノードスペースの右上のシーンと言う部分に接続する必要があります。
ジオメトリのままでは接続できないので、<ジオメトリOp>ノードに接続してからシーンに接続します。
これでシーンに、オブジェクトが表示されたはずです。<頂点>ノードの法線方向オフセットの値を変更するとジオメトリの太さが変わるはずです。
マテリアルの割り当て
次はマテリアルを割り当てます。割り当てるためのマテリアルを作成します。マテリアルは、ノードマテリアルである必要はありません。標準マテリアルで問題ありません。反射のない真っ黒なマテリアルと屈折率が1の完全に透明なマテリアルを作成してください。
シーンノードのオブジェクトにマテリアルを割り当てるには、<マテリアルOp>を使います。今回、オブジェクトの法線の表面と裏面それぞれに異なるマテリアルを割り当てるので、2つのノードを使います。
透明なマテリアルは、貼る面を表だけにします。ラインマテリアルは、貼る面を裏だけにします。<マテリアルOp>ノードは、<ジオメトリOp>ノードとシーンとの間に挿入します。
これで一応ビューポート上で、トゥーンラインが実現できたと思います。ただオブジェクトを動かしてみると、ラインが追従しません。
これは、<レガシーオブジェクト インポート>ノードのジオメトリ情報のみを使っているため、オブジェクトが原点に生成されているためです。
元のオブジェクトの動きに追従させる
元のオブジェクトの座標をシーンノードで作ったオブジェクトに伝えるために<マトリクスOp>ノードを使います。<レガシーオブジェクト インポート>ノードからグローバルマトリクスを出力して、<マトリクスOp>に接続します。<マトリクスOp>のOp出力を<ジオメトリOp>のOp入力に接続すれば、参照しているオブジェクトの位置が反映されます。
アセットとして使いやすくする
これで完成としてもいいのですが、別のオブジェクトやシーンで使おうとするとオブジェクトの割り当てやラインの太さの調整が面倒なので、もう少し汎用的にします。
すべてのノードを選択して、ノードをグループ化します。
ノードがグループ化されたら、フォルダのアイコンをクリックします。
これでグループ化したノードが確認できます。また、ノードスペースの左右にOp入力とOp出力が表示されます。これは、グループの入出力になります。
割り当てるオブジェクトとラインの太さを外部から操作できるように、それぞれのポートを左の黒い帯の部分にドラッグして、ポートをプロパゲートを選びます。
左上のシーンノードをクリックして、グループ階層から抜けます。
これで、割り当てるオブジェクトとラインの太さだけ見えるようになったので使いやすくなりました。
後は、基本タブでグループの名前を変えればよりわかりやすくなります。
グループを選択して、アセットメニューからアセットを変換を選べばアセットとして登録されるのですが、一つ問題があります。Cinema 4Dはベース言語が英語のため、日本語UIでアセット化するとアセット名が正しく表示されません。ですので、アセット化する場合は、英語UIに切り替えてからアセット化して、アセット名やパラメータ名を英語で設定します。
それから日本語UIに切り替えてからアセットのリソース編集で日本語リソースを追加することで正常に登録できるようになります。
なお、このアセットの場合、マテリアルを使っているので、予めマテリアルもプロパゲートで割当できるようにしたほうが良いかもしれません。
この記事が気に入ったらサポートをしてみませんか?