« C4D Plugin「CamMapCalib」修正… | トップページ | C4D プラグインとダイアログとリソース »

C4D オブジェクトに適用したマテリアルをXPressoで入れ替えるには… どうするの…?

複数のマテリアルA、B、C、を用意し、任意のタイミングでオブジェクトに適用したテクスチャタグのマテリアルをXPressoを使って変更したいのだ…

複数の数値を条件によって切り替えるには、「条件分岐」ノードを使うわけだけど…
マテリアルも対応してるんだっけ…?

Materialchange_03

なるほど、マテリアルにも対応しているんですね…
仕組みは理解していても、未だに知らない事が多いXPresso…

問題は「条件分岐」ノードの「スイッチ」に入れる数値だね…
入力項目が2個なら、ブール値「FALSE:0」「TURE:1」を入力すると切り替えが可能だから、「比較」ノード等を使って条件を設定できますが…
3項目、4、5項目とある場合は、どうやって「スイッチ」に入力する整数を生成すればいいのだろう…?

例えば、比較対照の「x」値に対して、範囲を設定し「比較」ノードで…

「x < a」 ⇒0
「x >= a」 and 「x < b」 ⇒ 1
「x >= b」 and 「x < c」 ⇒ 2
「x >= c」 and 「x < d」 ⇒ 3
  :
  :

「比較」ノードが大量に必要になりそうで、回路の見かけが複雑になりそうだし…

試す前から、あぁ~だの、こぉ~だの、考えずに取り合えず始めてみよう。

今回は任意の座標と、オブジェクトの座標を比較して、マテリアルを入れ替える事にします。

Materialchange_02

次の様な構成からスタートします。

Materialchange_04

球体からの距離でマテリアルO、A、B、Cを立方体に適用します。
距離の区切りは150.0、400.0、700.0で、
0.0~150.0が、マテリアルO
150.0~400.0が、マテリアルA
400.0~700.0が、マテリアルB
700.0~が、マテリアルC

簡単に組める部分、距離とテクスチャタグのマテリアルの変更部分は、こんな具合だろう…

「ChanegeMaterial_01.ZIP」

Materialchange_05

距離と150.0、400.0、700.0を比較し、0、1、2、3を生成し「条件分岐」のスイッチに入力するだけ…

C.O.F.F.E.E.風で書くと…

if(距離 < 150.0)スイッチ = 0;
if(距離 >= 150.0 || 距離 < 400.0)スイッチ = 1;
if(距離 >= 400.0 || 距離 < 700.0)スイッチ = 2;
if(距離 >= 700.0)スイッチ = 3;

C.O.F.F.E.E.ノードを使うと、あっと言う間にできそうですね…

C.O.F.F.E.E.ノードなら、記事はこれで終わりそうですが…

では、一般的なノードを使うと、どうなるのでしょう…
考えると難しそうです…

距離の比較から…

Materialchange_06

「比較」ノードを2個使って以上と未満を判別します。
150.0未満の比較はありませんが、どれにも当てはまらなければ、150.0未満という事になります。

2つの「比較」ノード、以上と未満のブール値を「ブール演算」ノードで「AND」演算します。
これで、指定した範囲内ならTRUEを、範囲外ならFALSEを取得できます。

Materialchange_07

複雑になりそうな… いやな予感がしますが…

2つの「ブール演算」ノードの結果と、700.0を比較した「比較」ノード(以上)の結果をそれぞれ、C.O.F.F.E.E.のif()のようにTRUEの値だと任意の数値を…
FALSEの場合は0になるようにします。
では「条件分岐」を使います。

Materialchange_08_3

「条件分岐」のスイッチにブール値を入力すると、「TRUE:1」の場合は下の「入力」が、「FALSE:0」の場合は上の「入力」が出力されます。

これで、距離が区切られた範囲毎で0、1、2、3を取得する事ができますが…
この3つの「条件分岐」ノードの出力をどのように1つにまとめて、マテリアル用の「条件分岐」のスイッチに入力するのか…

条件分岐A 条件分岐B 条件分岐C
~150.0 0 0 0
150.0~400.0 1 0 0
400.0~700.0 0 2 0
700.0~ 0 0 3

これが距離の範囲に対する条件分岐の出力です。
この表を横に見ると、3つの条件分岐の内、最も大きいものが対応した範囲の番号となります。

まずは、「条件分岐A」と「条件分岐B」を比較し、大きい数値を取得します。
この比較された数値と「条件分岐C」を比較し、大きい数値を取得します。

Materialchange_09

「比較」ノードで「条件分岐A」 < 「条件分岐B」の条件が満たしていれば、TRUEを出力します。
これをスイッチにTRUEの時に「条件分岐B」の値を、FALSEの時には「条件分岐A」の値を後ろの「条件分岐」で出力させます。
同じように「条件分岐C」も連結します。

この最終の「条件分岐」をマテリアルの「条件分岐」のスイッチに繋いで完成です。

Materialchange_10

C.O.F.F.E.E.では簡潔な事でも、一般ノードで組み立てると複雑になってしまいます。

全貌は、このような具合です。

Materialchange_11

「ChanegeMaterial_02.ZIP」

全体的に見ると、複雑で分からないと言うわけでもないようですね。

本来なら、XGroupを効果的に使って、分かりやすく組むことができますね…

  • 以上~未満の範囲内だとTRUE、範囲外だとFALSE
  • TRUEだと任意値、FALSEだと0
  • 2つの数値を比較し、大きい値を返す

Materialchange_12

「ChanegeMaterial_03.ZIP」

ほんの少しだけ見やすくなりました。

C.O.F.F.E.E.を意識して、同じように組もうとすると複雑になりますが…
発想を変えると、単純になる事もあるかも…

「距離」 > 「任意の値」の比較した全ての結果のブール値を整数として集計します。
集計結果を「条件分岐」ノードのスイッチに入力すれば良いのだ…

Materialchange_01

「条件分岐」の出力は、オブジェクトに適用したテクスチャタグのマテリアルに入力します。

Materialchange_13

「ChanegeMaterial_04.ZIP」

XGroupを使っていませんが、一般的なノードでもシンプルになりました。
単純な回路なので、数が増えても耐えられそうです。

距離で比較しましたが、時間でも同じ事ができます。
キーフレームのように使うこともできそうです。

「時間」ノードの出力「時間」は、C.O.F.F.E.E.でのBaseTimeで…
C.O.F.F.E.E.では、BaseTimeを直接比較しても時間として比較できません。
そうですよね、BaseTimeはクラスですから…

「比較」ノードでは、時間を直接比較できます。

Materialchange_14

なるほどね…

Materialchange_15

「定数」ノードも時間が指定でき…

Materialchange_16

フレームが入力できるわけだ… 素晴らしい…

という事で、「時間」ノードから時間を比較するときは、出力「フレーム」を使わずに「時間」を直接使えるわけですね。

Materialchange_18

フレームで比較するが間違えと言うわけではなく…
時間の方が良いわけだ…

Materialchange_17

「定数」ノードに表示されている数値は「秒数」かぁ…

時間は計算できるんだっけ…?

Materialchange_19

「計算」ノードには「時間」が用意されていました。

そうなると、「時間」ノードの「フレーム」はどんなときに使うんだろうか…?

気が付くと、「XPressoでマテリアルの入れ替え」ではなく…
「C.O.F.F.E.E.ノードと一般ノードとの比較」のような、「時間」ノードのような記事になってしまった…

Materialchange_20_2

「ChanegeMaterial_05.ZIP」

時間と比較してマテリアルを入れ替えるには、こんな具合に…
このスイッチに、インタラクティブに数値を入力できれば、様々なイベントに反応したマテリアルの切り替えができそうな…

今回は、カットでマテリアルを切り替えましたが、ミックスした切り替わりは、どうすればいいんだろう…

|

« C4D Plugin「CamMapCalib」修正… | トップページ | C4D プラグインとダイアログとリソース »