はじめに
以前ドキュメントを読んだがよく理解できなかった。
ちゃんと理解すればかなり使えそうなのでいま一度見る
参照元
いくつか試してまとめてみる
Xに進むだけ
<rulesmax_depth="1"> <rulename="entry"> <call rule="movex" /> </rule> <rulename="movex" max_depth="{x_count}"> <instanceshape="a"/> <calltx="{step}" rule="movex"/> </rule> </rules>
- max_depth を 3
- step (一度に移動する幅) を 2.3
フローのイメージだとこうなっている模様
X と Y に進む
<rulesmax_depth="1"> <rulename="entry"> <call rule="movex" /> <call rule="movey" /> </rule> <rulename="movex" max_depth="{x_count}"> <instanceshape="a"/> <calltx="{step}" rule="movex"/> </rule> <rulename="movey" max_depth="{y_count}"> <instanceshape="a"/> <callty="{step}" rule="movey"/> </rule> </rules>
- movex の max_depth を 3
- movey の max_depth を 4
- step (一度に移動する幅) を 2.3
- movex が終わってから、改めて center(0,0,0)からmoveyを行っている事がわかる
Y に進む2
<rules max_depth="1"> <rule name="entry"> <call rz="90" rule="movex" /> </rule> <rule name="movex" max_depth="{x_count}"> <instance shape="a"/> <call tx="{step}" rule="movex"/> </rule> </rules>
- movex の max_depth を 7
- step (一度に移動する幅) を 2.3
- y方向に動いているが、entryで一度z軸を90度回転し、movex を呼び出している。
- tx (xへの移動)が向いている方向に前後する事を表し、tyは左右。tzが上下への移動をする模様
X に進んだ後にその場からYに進む
<rulesmax_depth="1"> <rulename="entry"> <call rule="movex" /> </rule> <rulename="movex" max_depth="{x_count}" successor="movey"> <instanceshape="a"/> <calltx="{step}" rule="movex"/> </rule> <rulename="movey" max_depth="{y_count}"> <instanceshape="a"/> <callty="{step}" rule="movey"/> </rule> </rules>
- x と y に進むの movex に successor(後続関数)を指定し、movexの終了時にmoveを呼び出すように設定
X に進んだ後にその場で回転してXに進む
<rules max_depth="1"> <rule name="entry"> <call rule="move" /> </rule> <rule name="r"><call transforms="rz 90" rule="move"/></rule> <rule name="move" max_depth="{depth}" successor="r"> <instance shape="a"/> <call tx="{step}" rule="move"/> </rule> </rules>
- moveではdepthに渡している3回の前進が終われば r を呼び出す
- r は rz90して再度 moveを呼び出す
- ノードパラメータのmax mats = 5 に到達するまでの間実行される
- ということで方法転換はできるものの進む回数は同じ数で固定される
※このフローはあまり正しくない
中央から4方向への回転
<rulesmax_depth="5"> <rulename="entry"> <calltransforms="rz 90" count="4" rule="movex" /> </rule> <rulename="movex"> <instanceshape="a"/> <calltx="{step}" rule="movex"/> </rule> </rules>
- 90度毎に回転してmax_Depthの5だけ再帰的に movex を実行するセットをcount分(4回)行う
ジグザグに進む
<rulesmax_depth="100"> <rulename="entry"> <call rule="movex" /> </rule> <rulename="movex" max_depth="{x_count}"> <instanceshape="a"/> <instancetx="{step}" rz="90" shape="a" /> <calltx="{step}" rz="90" rule="movex2" /> </rule> <rulename="movex2" max_depth="100"> <calltx="{step}" rz="-90" rule="movex" /> </rule> </rules>
- movex 一行目 現在の位置で a をインスタンス化
- tx {step} rz 90 行った後に a をインスタンス化
- 初期位置0,0,0 から tx {step} rz 90 へ動いた状態で movex2 に移行
- movex2 では tx {step}分進み rz-90とすることで (1, 0, 0) から (1, 1, 0)へ移動し x方面に向き直している
- その後 movexへ移行
- max_depthに到達するまで繰り返し
最後に
entryに状態が引き継げればいいのに。
冗長に書けば自由に配置できそうだけど合理的にやるには状態が引き継げないと厳しそうだ。
しかし基本的な動きはこれで網羅出来たように思うので良かった。