参考までに、全部をCOFFEEノード内部で処理する方法についてサンプル804fで説明します。これはCINEMA 4D R8でXPressoが導入されるまで、私たちがCOFFEEタグの中で普通にやっていたことです。
XPressoの構成は確かに簡単になります。
また、直接COFFEEタグの中に書き込むこともできます。もはやポートやワイアを作る必要は全くありません(サンプル804g)。
図804-12
しかし、COFFEEはずいぶん複雑になります。
図804-13
var doc= GetActiveDocument();
var o1= doc->GetFirstObject();
var t1= o1->GetFirstTag(); t1= t1->GetNext(); t1= t1->GetNext();
var m0m= t1->GetMaterial();
var pos= o1->GetPosition();
var m1= doc->GetFirstMaterial(); var m1m= m1->GetMarker();
var m2= m1->GetNext(); var m2m= m2->GetMarker();
var m3= m2->GetNext(); var m3m= m3->GetMarker();
switch(int(pos.y/100))
{
case 0:m0m= m1m; break;
case 1:m0m= m2m; break;
case 2:m0m= m3m; break;
}
t1->SetMaterial(m0m);
ここで、1行目は現在のシーンファイルを取得しています(COFFEEタグの場合は自動的に取得されます)。
3行目は、立方体オブジェクトを取得しています。ここでは、「オブジェクトマネージャの一番上にあるオブジェクト」として取得していますが、オブジェクトが増えた場合は名前や階層にしたがってオブジェクトを検索するプログラムを追加する必要があります(COFFEEタグの場合は自動的に取得されます)。
5行目は、テクスチャタグを取得しています。ここでは「一番左にあるタグ、の右にあるタグ、の右にあるタグ」として取得していますが、タグが増えた場合は名前や順番にしたがってタグを検索するプログラムを追加する必要があります。
6行目は、テクスチャタグにリンクされているマテリアルのマーカーを取得しています。
7行目は、立方体の位置ベクトルを取得しています。
9行目は、マテリアルマネージャの一番左(上)にあるマテリアルを取得し、さらにそのマーカーを取得しています。
10行目は、一つ右(下)にあるマテリアルと、そのマーカーを取得しています。
11行目は、さらに一つ右(下)にあるマテリアル、とそのマーカーを取得しています。
13から18行目までは、変数名は変ってますが、ステップ4で説明したswitch文と全く同じです。ちなみに、13行目の「pos.y」は、「posベクトルのy成分」という意味です。
20行目は、switch文の中で選択されたマテリアルのマーカーを、テクスチャタグに設定しています。
ずいぶん面倒ですね。私もこのようなプログラムを書いたのは数年ぶりです。なぜなら、XPressoが導入されて以降、オブジェクトを取得するのにCOFFEEを使うことはほとんどなくなったからです。ここまでのステップを振り返ってみると、XPressoとCOFFEEの得手不得手がよくわかります。
1. XPressoは、オブジェクトやマテリアルを取得するのは得意だが、ループや条件分岐を処理するのが苦手。
2. COFFEEは、ループや条件分岐を処理するのは得意だが、オブジェクトやマテリアルを取得するのが苦手。
つまり、XPressoとCOFFEEをうまく組み合わせて使うのが一番いいのです。今回の実験の中ではステップ4がそれに相当します。
前の章ヘ 次の章ヘ
|