下記のような壁をつくってみましょう。
まずは、Boxを作成し、Sizeを調整します。これが1つのブロックになります。
このときCentor(ボックスの中心の位置座標)が、原点にくるようにSizeX、SizeYを2で割った値にBoxの中心が配置されるようにします。
Boxを作成し、Copy Stamp(CopytoXという名前にします)で横にコピーする場合、BoxのScaleX(X側に並べるから)パラメーターを参照して、Xに移動してコピーするようにします。
次にY方向にvopy stamp(copytoYという名前にします)します。このときに、複製した分、上にずれてコピーしてほしいとします。
ch("../box1/sizey")*$CY
この$CYは現在生成されているコピーの番号を表すローカル変数です。 0から始まります。
BoxのScaleYで最初の高さを取得し、1段増えるごとにその取得された番号を乗算して、上にずらしていきます。
次にコピー番号が奇数の場合、横に半分ずれるようにして、ジグザグにブロックが重なっているようにします。
($CY%2)*ch("../box1/sizex")/2
$CYが番号なので、それを2で割ったあまりを取得します。%は割り算の余りを取得することができます。
これにより、偶数の余りは常に0、奇数の余りは常に1となります。
これにBoxのScaleXを半分にしたものをかければ、偶数の場合は、X移動0、奇数の場合は、X移動0.5となり、奇数の場合だけ半分ずれて上に複製されていきます。
次に、ずれた部分を埋める半分のブロックを作ります。
Box1をAltキーを押しながらドラッグして複製し、SizeはBox1と同じ大きさになるようにします。
各個別のパラメーターをCopy Paramterすれば、そのパラメーターだけを取得できますが、たとえばSizeという文字部分をCopy Paramter>Paster Relative Referenceすれば、まとめてExpressionを追加することができます。
その後、SizeXだけ半分になるように割り算(/2)を追加します。
そのBoxを新しいCopy Stampにつなげます。
まず、Copy3のNumber of Copyは、copytoYノードのNumber of Copyを参照します。
次にTransYにBoxのScaleYずつ移動するようにします。
このようにえY方向に移動しながら複製されます。
コピーで目指す形はこんな形です。
うーん、じゃあ、どのようにX軸への移動を作り出せばいいのか?
CopytoYまでで壁の全体のBboxは取得できています。なので、そのBboxの中心から180度ずつ回転して上にコピーしていけば、必要なところにボックスがはまります。
ということで、複製するボックスのコピーのPivotX(ローカルピボットポイントX)に、下記のエクスプレッションを入力します。
centroid("../copytoY",D_X)
centroidは頂点を囲むBboxの中心を取得するエクスプレッション関数です。1つの引数でSurfaceノードを指定し、2つ目の引数でX、Y、Zを指定します。
次にRotateYに180と入力します。
結果を確認すると狙ったとおりの結果を取得できました。
これを最初につくったメインの壁とMergeすると・・・
ジグザグしながら、けれども1枚の壁が完成しました。
これは、1つのBoxのSizeX,SizeYを参照しているので、Box1のサイズを変えるとブロック間がずれずに、1つのブロックのサイズを変更できますし・・・
X方向、Y方向へのコピー数も自由に変更できます。
ここまでで壁のモデルは完成しました。