2011/11/29

ICE : 配列とセットの違いを理解する

リアクション: 
ICEを構築していると、いろいろな壁にぶち当たります。
そんな、そびえ立つ大きな壁のひとつとして、配列とセットという概念があります。

配列とセットの違いは、ICEを攻略する上で、非常に重要な概念となるので、覚えておく必要があります。

PointCloud Grid 3x3
Get -> Primitive -> Point Cloud -> Grid
から、3x3のPoint Cloud Gridを作成して、以下のICE Treeを繋ぎます。

上の黄緑の流れは、2012から搭載された、Build Array from Setノードを使用しています。
内部的には、セットから配列へ変換するノードです。
結果、配列で表示されています。


対して、下の黄色の流れは、普通にPointPositionを表示しています。
こちらは、セットです。


それぞれをカスタムICEアトリビュートのself.a、self.bと、二つにデータを格納しています。


Show Valuesのポイント
データを確認したいときは、ノードの線を右クリックして、Show Valuesでのプロパティの設定を開いてOKボタンで確認します。
ですが、今回のポイントは、このプロパティの一番下の文章です。

Labelに#を入れると、IDで置換します。

となっていますので


#:

とLabelに入力したものが、上の図です。
黄緑配列の値は、こんな感じで表示。
[ ] の中の数字が増えていっています。

0[0]:-4, 0, -4
0[1]:-4, 0, 0
0[2]:-4, 0, 4
    .
    .
    .

一方黄色セットの表示は、

0: -4, 0, -4

1:-4, 0, 0
2:-4, 0, 4
    .
    .
    .

と、[ ]が無い状態ですが、一番左の数字が増えていっています。

この違いは、一体なんなのか。

これを理解するには、IDという存在がキーポイントとなります。IDというのは、オブジェクトのポイントなどの頂点番号の事です。

3x3のPoint Cloud Gridは、9個のポイントから成り立っています。その頂点番号は

0, 1, 2, 3, 4, 5, 6, 7, 8
右上のポイントを選択
といったように、0から始まる番号がポイントひとつひとつに割り振られています。

試しに右上のポイントをタグ選択して、Selectを見てみます。

6番が選択されています。丁度、黄色セットの表示では

6:4, 0, -4

となっており、6つ目の要素であること確認出来ます。
ポジションの値からも確認することが出来ますね。

つまり、セットとは、IDというオブジェクトの頂点番号とセットのデータということになります。

一方、配列のほうは、IDが0の場所に、9個のデータが一気に格納されています。

ここが決定的に違うところなのです。

詳しく見ていきましょう。

PointPositionへ接続
配列は挿せず、セットは挿せる
上のツリーから、Set Dataに Self.PointPositionを追加し、そこへ、配列のaというデータと、セットのbというデータが挿せるかどうか、試してみます。

IDを持たない配列aの場合、PointPositionへ接続しようとしても、拒否されてしまいます。
PointPositionは、IDを必要とするICEアトリビュートのようです。

変わって、セットbの場合は、ID情報があるので、素直に接続することが出来ます。


配列にIDを割り振りPointPositionへ接続
配列aのようなデータをPointPositionへ接続するには、IDを割り振るという作業が必要です。

Get Point IDSelect in Array ノードをこのように繋げば、PointPositionへ挿すことが出来ます。

このコンボは、非常に良く使うので、覚えておいて損は無いでしょう。

さらに、詳しく見ていきましょう。

違う大きさのCubeA、B
良くある問題で、このオブジェクトと同じ形状にしたいのになんで接続出来ないんだろう・・・?
ということが、たびたびあるかと思います。

違うオブジェクトからデータを持ってきたときに、接続出来ないことが良くあります。


これも実は、IDの問題なのです。


別のPointPositionのデータが繋がらない
Bの形状を、Aと同じにしたい。と考えた場合、BにICE Treeを作り、誰でも最初はこういう風に挿そうと思うものです。

今まで説明してきたセットのあり方を考えると接続出来るのでは?と不思議に思うのですが、実は、IDというものは、オブジェクトごとに固有に持っているもののようです。

この状態ですと、AのIDを持ったPointPositionのデータを、BのIDのPointPositionへ無理やり持ってきているようなものです。

ですので、考え方として、AのPointPositionを、一度IDを持たない配列データにし、BのIDを割り振り直し、BのPointPositionへ挿すという風にします。

Aのセットを配列にし、BのIDを割り振る
Build Array from Set で、配列データへ変換した後、Get Point ID と Select in Array ノードで、BオブジェクトのIDを割り振るといったことをすれば、挿せるようになります。




このように、配列とセットを理解するだけで、かなり出来ないことが出来るようになるはずです。

実を言う僕も、触り始めて半年くらい良く分かりませんでした・・・。
他人が繋いでいるのをなんとなく見ていて、「ああ、なるほど!こういう風にやればさせるのか!」と思っていたのですが、なんで?というのが、拭いきれませんでした。

完全に理解できたのは、Show Valuesで、Labelに#を入れて見た瞬間でした。

なるほどなぁ。こう違うんだ。
とね。

読んでくれてありがとう。


0 件のコメント: