はじめてのL-System

#L-Systemさわってみたいけれど…
##ぜんぜんわからん
L-System SOPを使えば再帰的な形状が作成できるらしいが、どうやって使ったらいいかわからない人向けに、「Ruleの基本」「L-System SOPの主要な機能」の解説を行う記事です。
筆者も、初心者です。とりあえずこれだけ知っていればかけなくはないという内容です。

#基本のルール
##すすむ、まがる、もどる
最初に、Ruleタブ内、Premiseに以下のように記述してみましょう。

```
FFF[+F][-F]
```


##各種記号の意味
```
F
```

前に1進む

```
+
```

右に曲がる

```
-
```

左に曲がる

```
[]
```

このカッコに記述されている処理を行ったら、カッコの手前まで一旦戻る

つまり、***FFF[+F][-F]***というルールは下記画像のような形状を作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434798/d66ecf98-bfad-7114-8f72-7cd6ad6dcc24.png)


#L-Systemでかいてみよう
「線を描く」ことができるようになりました。
次は書き換え、枝分かれについて確認しましょう、
##書き換え
書き換えとは、簡単に言うと「任意の文字に任意の処理を代入する」ことです。
例えば、下記のような設定をしてみます。

```
Premise : A
RuleA : A =F+F
```

Generation=0のとき、ビューポートには何もあらわれません。このとき、ビュー上にはAがあるだけで、Fによって線は書き出されません。
Generation=1のとき、Aの中が代入されて、F+Fが描かれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434798/25773974-2811-a4b4-06c4-4ecae2652725.png)

しかし、このままだとGeneration2にしても形状は変わりません。これは、2回目の代入を行うための文字がないためです。

何度も同じ形を繰り返したいときは以下のように記述します。

```
Premise : A
RuleA : A =F+FA
```

これで、Generation2以降もビューにAが生成され、次のGenerationでA=F+FAが代入されることで、同じ形を複数回作ることができます。

なお、以下のように代入する文字を増やすこともできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434798/2c01c1a9-ab2d-366c-bc18-3a1486507dfe.png)

このとき、Bへ代入された文字を実行するには、もう一度Generationを増やす必要があります。

##3D空間への枝分かれ
これまでの作業はすべて同一平面上で行われていました。
作成される形状に角度を加えて3D空間へ枝分かれして広がるようにしてみます。

```
&
```
ピッチアップ（上向きに回転します）

```
^
```
ピッチダウン（下向きに回転します）

```
\\
```
時計回りに回る

```
//
```
反時計回りに回る

ここで、L-Systemノード作成時に最初に入っているルールを見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434798/3ab01b76-c1ba-491f-be2f-f84bf85dc1e5.png)

これは以下のような意味を表しています。
Premiseは、3すすんで、A
Aは、スケールしてから、Bの処理をして始点にもどってくる。反時計周りをして、Bの処理をして始点にもどってくる。反時計周りをして、Bの処理をする。
Bは、ピッチアップして、３進んで、Aの処理をする

こうしてみると、L-Systemの形状を分解して理解することができるようになっていることに気が付くはずです。

ここで初めて出てきた記号は以下のような意味を表しています。

```
!
```
現在のGenerationで作成している線の長さを乗算します。
スケールの値にはValuesタブ内のStep Size Scaleが使用されます。

```
"
```
現在のGenerationで作成しているTubeの厚みを乗算します。
スケールの値にはTubeタブ内のThickness Scaleが使用されます。

…ん？Tubeってなんだ？

#ジオメトリにしてみよう
##Tube
Tubeとは、L-systemで作成した形状をジオメトリ化するために使う機能の一つです。
Geometryタブ内、TypeからTubeを選択すると、プリミティブが作成されます。
同時に、Tubeタブ内のパラメータが有効になります。
Rule内に文字をかいてコマンドを設定したとき、Tube系のデフォルト値はここのタブ内から使用されます。

##リファレンスによるジオメトリ作成
この設定ですと、Angle、Scale、Thicknessはパラメータ内のデフォルトの値しかとることができません。Fなどのコマンドは、()を使って引数を明示化することによって、デフォルト値以外の値を使うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434798/789f2c41-fbed-50be-b9ed-3dc08d18b58a.png)

画像は、以下のようにルールを設定したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434798/3a5a48c3-a7c9-1cbc-a0d8-4c6500944937.png)


この方法をとることによって、それぞれ3股に分かれている枝の部分の太さや長さを調節できました。

#もっと知りたいなら…
##公式ドキュメント
https://www.sidefx.com/ja/docs/houdini/nodes/sop/lsystem.html

今回の記事をかいたのは、CG Forgeのチュートリアルをやってみたことがきっかけだったのですが、後から見直してみるとかなり充実した内容だったことがわかりました。
（実際使ってるのをみて、その意味を調べてからでないと、こういうヘルプを使いこなすことって難しいですよね…なので、何かしらのチュートリアルを見て一つ何かを作ってからドキュメントに再度目を通すのがおすすめです。）

##CG Forge
https://www.cgforge.com/
有料のチュートリアルですが、私はここで学びました。
一歩進んだ内容も学ぶことができます。

##L-Systemのアイデア
http://nomoreretake.net/2016/12/15/shoudini_l-system_intro/
L-Systemノードの機能が簡潔にまとまっており、たくさんの作例をみることができます。


今回の記事は「とりあえずRuleの基本を理解して記述できるようになる」が目標なのでここで終わっていますが、ほかにもグループ化やジオメトリ配置などのコマンドもあります。
こちらは、何かしらを制作してもう少し理解が深まったら復習がてら記事にしたいなと思っています。

ここまで読んでいただき、ありがとうございました！