Turtle

Turtleタブとタブのパラメータは、プログラミング経験がある上級ユーザー向けです(これらのタブはLシステム全体を含みます)。とはいえ、プログラミング経験が少ないユーザーでも、心配することはありません。下記に変数の例をいくつか示します。

まず初めに、必ずモードTurtleに設定します。

Lシステムの簡単な紹介

下記のページで、L(indenmayer)システムを簡単に説明します。書籍やオンラインリソースには、このシステムの詳しい説明があります。(Przemyslaw PrusinkiewiczとAstrid LindenmayerによるPDFドキュメント「The Algorithmic Beauty of Plants(植物のアルゴリズムの美)」は、Cinema 4Dを使用して作成されました。このドキュメントはhttp://algorithmicbotany.org/papers#abopからダウンロードできます。)

Lシステムは、通常、植物の成長や同様の効果をシミュレーションするために使用されます。システムをMoGraphとともに使用し、MoSplineオブジェクトをスイープオブジェクトに置くことによって、壮大な成長シミュレーションを作成することができます。これにより、レンダリング可能なオブジェクト(スプラインはSketch and Toon または ヘアを使用して直接レンダリングが可能)を作成することができます。

簡単に説明すると、Lシステムとは、新しい枝がどこでどのように伸びるかを定義する、一連のコマンドを実行するものです。既存の枝を新しい枝に置き換えられる「セルフプロデュース」システムともいえます。

このシステムの基本原理はかなりシンプルで、「亀システム」と呼ばれるシステムに基づいています。簡単なコマンドで(バーチャルな)亀が送信され、このパスはスプラインで表現されます。

3 つの最も重要な コマンド は下記のとおりです。

シンプルなFは「1ステップ前進する(Go one step Forwards)」という意味です。MoSplineでは、このコマンドは「スプラインを(オブジェクトのZ方向に)1単位拡張する」という意味になります

+:右に回転させる

-:左に回転させる

前提フィールドにF++F++Fというシーケンスを入力した場合は、次のように解釈されます:「1ステップF前進、右に2回転、1ステップF前進、右に2回転、1ステップF前進」

各ステップの大きさと回転の角度は、デフォルト移動デフォルト角度からそれぞれタブで定義できます。または、下記で説明するように、括弧で囲って定義することもできます。デフォルト角度60°に設定されている場合は、下記の例のように正三角形が生成されます。

2つの異なるコマンドコード。左はF++F++F、右はF-F++F-F(それぞれデフォルト角度が60°)。

これにより、枝のような形状が作成できます。Lシステムの非常に興味深い機能は、個々の枝を他の枝と置き換えることができる統合置換システムです。これは再帰的に行うこともでき、簡単なコマンドコードで非常に複雑な枝作成が可能です。わかりにくい場合は、どのようなことが行われるか、下記の例からヒントが見つかるはずです。

現在、1回しか実行されていないシングルラインのコマンドコードのみが入力されています。次に、下記のコマンドコードをそれぞれのフィールドに入力してみます。

前提フィールド:F++F++F

置換規則フィールド:F = F-F++F-F

画像にあるように、置換規則の命令行は割り当て(以下「ルール」と呼びます)を含みます。ここではFに、前提の命令行に(内部で)挿入されるいくつかのシンボルが割り当てられています。

コマンドラインコードを全部書き上げた場合は、下記のようになります(前提の命令行にあるFを、置換規則の命令行にある「F」に続くコードで置き換えます)。

F-F++F-F++F-F++F-F++F-F++F-F

これは、下記の画像の左から2番目の形状を表しています。前提のコードの各Fがルールに置き換えられるので、各線形は複雑な線に置き換えられます。

それぞれの「F」が「F-F++F-F」コードに置き換えられると、形状が変化します。

また、この置換処理は無期限に繰り返すことができます(ただし、無期限といっても、スプラインが急激に複雑になり始めると、コンピュータは処理を中断する可能性が高いです)。この置換処理がどの程度繰り返されるかは、成長値で定義します。この値は、それぞれのFをルールコードに置き換えます。ちなみに、フラクタルも同様に機能します。

もちろん、必ずしも各Fが使用されなくても、プレースホルダーを使用することは可能です。結局のところ、これは成長の形成としては非現実的です。たとえば、長さの成長は、枝の端のみに発生するわけではありません。

このため、A、B、C、D(ただし、「F」は「1単位前進する」というデフォルトコマンドなので使用できません)などのような、プレースホルダー(亀コマンドでは表現されない文字)を使用することができます。

各フィールドに下記のようにタイプします。

前提FA

置換規則A=+F-FA

ルールはAで終了するので、増加する成長値により、結果として永遠に成長し続ける形成になります(デフォルト角度90°に設定)。

ヒント:このシンプルに見える置換規則で、数世代にわたる非常に複雑なジオメトリを作成することができます(下記参照)。シンボルが間違って使用されている場合は、コンピュータがクラッシュする場合もあります。そのため、実験するときは注意を払い、頻繁に保存を行ってください(シンプルなテキストエディタで作業する場合であってもです)。また、表示モードライン

に設定すると非常に役立ちます。

使用しているコードは、現時点では1つの連続した命令行で構成されています。ただし、Lシステムは、既存の線から分岐する新しい線という、リアルな枝が作成されて初めておもしろくなるのです。また、これは角括弧([ ])を使用して行うことができます。角括弧内のコマンドシーケンスは、別の枝として表示されます(新しい亀も作成されます)。枝が作成されると、亀は角括弧の前の開始ポイントに戻り、次の角括弧に続くコマンドシーケンスに移ります。

前提フィールドに下記のようにタイプします。

F[+F][-F[-F]F]F[+F][-F]

デフォルト角度30°である上記のコマンドコードの結果です。

前提フィールドにFを入力し、置換規則フィールドに上記のコード (F=F[+F][-F[-F]F]F[+F][-F] ) を入力すると、各Fが左の画像にある枝に置き換えられます。成長値を増加させると、各線形は新しい枝に絶え間なく置き換えられるので、枝が成長し続けます。詳細を見てみると、左の枝のパターンが右側の木で繰り返されていることがわかります(緑でハイライトされている部分)。

以上が、植物のように見える、複雑な枝分かれを作成する簡単な方法です。

一連の命令記号。 任意の文字(ここでは「A」など)をプレースホルダーとして使用できることに注意してください。右下にデフォルトの回転が90°に設定されていることがわかります。

ここまで、フラットな平面で全てを生成してきました。枝分かれは1つの平面のみで起きるわけではなく、あらゆる方向に起きるので、これを可能にするコマンドシンボルが存在します。

下記のようなコマンドシンボルがあります(程度の値は、コマンドシンボルの後にブラケットへ入れて追加することができます)。

&または^:亀の横軸の周りで回転させる

\または/ :亀の縦軸の周りで回転させる

前提フィールドに、下記のとおりタイプします。

F&F\ (90)^F+F

小さな仕様にはデフォルト角度の値が適用されるので、「/」の後の90°は必ずしも必要ではありません。

結果は上記で示されているスプラインです。亀は前進し(F)、その横軸の周りを直角に回転(&デフォルト角度90°に設定)、再び前進(F)。その縦軸の周りを90°回転し(\(90))、次にその横軸の周りを90°回転(「^」)さらに再び前進し(F)、右に回転(+)、最後に再び前進します(F)。

この方法で空間的な枝分かれ形成を作成すると、リアルな茂みや木を作ることができます。

ユーザーデータ

シンボルのシーケンスで、 ユーザーデータ を変数として使用することができます。上記の画像では、前提フィールドで^(亀は横軸の周りを回転)のために代入されている括弧付きの回転パラメータが、ユーザーデータに追加されています。

変数名には特別な文字やスペースは使用できません。大文字や下線は認識されます(たとえば「second_length」)。

数式

定義された変数(たとえばF(_growth*2)などのような数式を、通常の桁の代りに使用することができます。下記の数式が使用可能です。

_total 現在の記号列でのコマンド総数(下記参照)
_index 記号列内の現在のコマンドインデックス(下記参照)
_growth 現在の成長レベル
_level 現在のコマンドレベル (適用されている場合; 下記参照)
_x, _y, _z 空間での現在のTurtleの位置
_arg1, _arg2, _arg3, _arg4 1番、2番、3番、4番の偏角値 (例 F(1,2,3,4)から)
_age 現在のコマンド年齢 (represents_growth - _level) 0.0から開始。
_length TurtleとMoSpline起点の現在の弧の距離
_move 現在のデフォルトスケール距離
_tropism 現在の屈性
_scale 現在のデフォルトスケール
_rotate 現在のデフォルト角度
_rnd, random -1.0と+1.0の間のランダムな値

例 「_totalおよび_index」

2つコマンドで構成されるF(_index)F(_index)という文字列があるとします。この文字列は、F(1)F(2)(1単位前進し、次に2単位前進する)と同じ機能を実行します。たとえば、「_total」はコマンド数の合計なので、次のコマンドで螺旋を作成することができます。

前提FA

置換規則A=+(20*_index/_total)FA

例 「_RND」

次のコマンドがあるとします。

前提: A

置換規則: A=+(_rnd*90)FA

「_rnd*90」のコマンドは、各生長の押し出し角度が-90から+90度の間で確定され 、ランダムな角度によってカクカクした線が得られます。

例 「_level」

次のコマンドがあるとします。

前提A

置換規則A=FA

次のレベルの値が結果として出ます(ここでは、デモとして表示するために括弧付きで示されています。実際には表示されません)。

成長= 0 : A(0)

成長= 1 : F(1)A(1)

成長= 2 : F(1)F(2)A(2)

成長= 3 : F(1)F(2)F(3)A(3)

これで、「_index」の番号付けがどのように行われるかわかります。次のコマンドを見てください。

前提FA

置換規則A=+F(_level*10)A

すると、デフォルト角度90°に設定された次の螺旋が作成されます。

例 「_arg」

亀コマンド(この例ではF)のパラメータを設定するために「F(a,b,c)=F(a*2,b*2,c*2)」と定義できるように、「_arg」コマンドも使用することができます。これらは、先頭で値を求める必要はありません。F=F(_arg1*2,_arg2*2,_arg3*2)」は、上記のコマンドと同様の機能を果たします。

高度な構文のバリエーション

下記の構文も可能です。

前提F(2)F(1,2)F(2,3)

置換規則F(a,b) = F(a*2,b*2)

全てのFは置き換えられます。また、置換規則内に「a」または「b」が表示される場所では、既存のF引数は次のように処理されます。

F(2*2,1*2)F(1*2,2*2)F(2*2,3*2)

(論理的に「F(4,2)F(2,4)F(4,6)」に相当)

次のように構成されるルールも可能です。

F(a,b):(a>10)=F(a,b)+F(a/2)

このルールは、たとえば、最初の引数の値が10より大きい場合にのみ適用されます。

下記の例では、上記の構文バリエーションが組み合わされ、おもしろい効果を生み出しています。

例 「実」

上記の例では、いくつかの枝が同時に成長しています。1つの枝が成長し終わると、球体が枝の端に置かれます(コマンドJが必要です。クローンオブジェクトの例をご覧ください)。

なお、最初のルールで「B(6)」が定義され、3番目のルールで「h=0」が最終的に球体を設定するまで、2番目のルールで「B(h-1)」が引数を1減らします。

コンソールを見て、文字列全体を確認してください(初めに結果の文字列をコンソールにボタンをクリックします)。

数式に関する詳細は、添付ファイルで確認することができます。

前提

ここに前提を入力します。たいていは、1文字からなるコマンド( 置換規則参照)、または置換規則フィールドでコンテンツが追加されるプレースホルダーです。次のページでは、どのような文字列になるか、例が多数示されています。

置換規則を無視

ここでは、コンテキストルールによって無視される一連のシンボル(コマンド)を定義することができます。たとえば、下記の配列があるとします。

前提A+B+C+D+E+F

置換規則A<B=C

置換規則

F(a,b,c) Turtleの前進移動して、指定した長さ(a)、スケール(b)、分割数(c)でラインを追加描画する。
f(a) Turtleの前進移動して、その間はラインを描画しない(例: スプラインのセグメントは分離する) 「a」は、長さを指定する場合の値。
H(a,b,c) Turtleの前進移動して、指定した長さ(a)、スケール(b)、分割数(c)の半分値でラインを追加描画する。
h(a) Turtleの前進移動して、その間はラインを描画しない(例: スプラインのセグメントは終了する) 「a」は、長さを指定する場合の半分の長さの値。
M(x,y,z) 移動してラインを描画します。Turtleは、ローカル座標(x,y,z)の内側へ移動しますが、自分自身は回転しません。
m(x,y,z) Turtleは、移動しますが、ラインは描画しません。 Turtleは、ローカル座標 (x,y,z) の内側へ移動しますが、回転はしません。
G(a) Turtleは、前進移動しますが、ラインは描画せず、スプラインのセグメントは分離しない。「a」は、長さを指定する場合の値。
R Turtleの開始点を最初にリセットして、元の開始点からラインを描画する。(MoSplineのTurtleのセグメントは、常に[ ]で囲まれています)
r Turtleの開始点を最初にリセットして、元の開始点からラインを描画しない。(MoSplineのTurtleのセグメントは、常に[ ]で囲まれています)
P(x,y,z) Turtleを、指定座標に置き、ラインを描画する。
p(x,y,z) Turtleを、指定座標に置き、ラインを描画しない。
-(a) Turtleを垂直を軸として反時計回りに回転させる。「a」は、指定角度の値。
+(a) Turtleを垂直を軸として時計回りに回転させる。「a」は、指定角度の値。
&(a) Turtleを水平を軸として上に回転させる。「a」は、指定角度の値。
^(a) Turtleを水平を軸として下に回転させる。「a」は、指定角度の値。
/(a) Turtleを中心を軸として反時計回りに回転させる(ひねる)。「a」は、指定角度の値。
\(a) Turtleを中心を軸として時計回りに回転させる(ひねる)。「a」は、指定角度の値。
[ 新しい枝 = 新しいTurtle
] 枝の終了
{ ポリゴン開始 (下記のサンプルを参照: 「ポリゴン生成」)
} ポリゴンの終了
. ポリゴンポイントを追加。 (ポリゴン用の括弧内で使用: 例 = {.-f.+f.+f.+f} )
| Turtleを垂直軸に沿って 180ー回転。
* Turtleを中心軸に沿って 180ー回転。
% 枝をこのポイントで剪定する (「]」で閉じられるまで、すべて無視されます。サンプルの 「枝の剪定」を参照)
"(a) 各成長に対して「a」の値で複数の長さを指定。(次のサンプルの例: 複数分割を参照)
!(a) 各成長に対して「a」の値で複数のスケールを指定。 (MoSplineの直径は、スイープジェネレータを使う場合に連携します)
;(a) 各成長に対して「a」の値で複数の角度を指定。
_(a) 各成長に対して「a」の値で指定した長さで分割。
?(a) 各成長に対して「a」の値で指定したスケールで分割。 (MoSplineの直径は、スイープジェネレータを使う場合に連携します)
@(a) 各成長に対して「a」の値で指定した角度で分割。
T(a) 屈性を追加 (例: FTFTF), これにより、各スプラインのセグメントはグローバルのY軸方向に少しカーブします。パーティクルモディファイアの影響を受けます。
$(x,y,z) アップベクターの最後を表示して、Turtleの向きを合わせます。Turtleが直面する面をベクトルを定義してください。
I(a,r,g,b) (最初の文字は、大文字の「i」です)
J(a,r,g,b) &nbsp;
K(a,r,g,b) &nbsp;
L(a,r,g,b) I, J, K, L、クローナーオブジェクトで生成された任意の数のクローンがTurtleスプラインに沿って配列されます。 「r,g,b」は、クローンの色を表し、「a」はインデックスです。(例: クローナーの下に配置されているオブジェクトの順番を表します。 - 下記の「インデックス」を参照)I, J, K, Lは、クローナーオブジェクトのオブジェクトモードにある分布パラメータをそれぞれ表しています。「Group 1」 「Group 2」「Group 3」「Group 4」。 サンプルが、以下の「サンプル: クローナーオブジェクト」にあります。.

例 「ポリゴンの作成」

置換規則フィールドの2番目のラインを見てください。

L=[{.-f.+f.+f.++++f.+f.+f.+f}]

ポリゴンを定義する波括弧の間で、ポリゴンが作成される特定の数のポリゴンポイントが定義されます(それぞれ「.」で始まります)。波括弧は角括弧内に含まれるので、亀は各葉が作成されたあと、葉を作成する前のポイントにリセットされます。

葉の全体は「L」に割り当てられ、上記ラインのルールは「L」が存在する箇所で完全な葉を作成します。

なお、MoSplineは、スプラインまたはポリゴンのどちらかを生成することができます。両方を同時に生成したい場合は、方向スプラインを使用してください。

例 「乗算/除算」

置換規則フィールドに、自身で置き換えするシンボルのシーケンスを使用する場合は(たとえば、A=F+BA)、乗数または除数(!;_?@)を使用して、各ジェネレータの値を増加または減少させることができます。

例 「枝を切る」

このルールを見ると、プレースホルダーA、B、C、Dが前提に追加されていることがわかります。さまざまな成長値に対し、ルールは各プレースホルダーの%値との置換を定義します。そのため、次のシンボルが各枝にある(また、各枝ごとに)そのポイントで切り落とされます。

例 「クローナーオブジェクト」

成長値がアニメートされると、この構造はあふれるばかりに成長します(成長するクローンを含みます)。

クローナーオブジェクトのクローンを参照するルールで、JK がどのように使用されているか注目してください(これらは、それぞれ(1,1,1,1)と(1,1,1,1)に置き換えられます。また、括弧の引数が省略された場合、それぞれは標準値を使用します)。両方のクローナーオブジェクトに従って、モードを設定する必要があります。

I(1,1,1,1)は、Group 1を反映します。

J(1,1,1,1)は、Group 2を反映します。

K(1,1,1,1)は、Group 3を反映します。

L(1,1,1,1)は、Group 4を反映します。

なお、1つの ルールでは、

前提: FA

置換規則: A=FX

X=J(1,1,1,1)

が機能する可能性があります。しかし、クローンは段階なしには成長しませんが、突如として表示されます。

例 「インデックス」

クローナーオブジェクトの子オブジェクトは、連続して番号付けされます(「0」から始まります)。たとえば、A=FJ(2,1,1,1)A(RGB値は省略可能)と定義する場合は、クローナーオブジェクトはインデックス「2」(球体の左側)が付いているオブジェクトのみを使用します。右側のA=J(rnd(2))Aを使用する場合は、クローンは無作為に選ばれた「0」から「2」の間の数字に応じて、ランダムに置かれます。

例 「ランダムな成長」

異なるリミットが異なる形状を生成します。

このルールと、ユーザーデータのLimit1およびLimit2(2つの値の合計は100%になります)の異なる値との組み合わせを使用して、同一ではないが類似の「植物」を作成することができます(確率的Lシステム。(rnd(1)<)または(rnd(1)>)の条件は、3つのルールのうち、どのルールが適用されるべきか、無作為に決定します(それぞれ新しいジェネレータ、つまり、より大きい成長パラメータのためランダムな選択が新たに行われます)。

例 「コンテキストルール」

ルールは次のような形式で書くこともできます。

前提ABC

置換規則A<B=C

結果(成長 > 1の場合):ACC

では、どのような結果になるのでしょうか?これは、結果文字列のシーケンスによります。「A<B=C」というルールは、「B」が直に「A」の後に来る文字列の中のインスタンスを検索し、「B」を「C」で置き換えます。

一方、「A>B=C」と入力する場合は、「B」の左側にある「A」は「C」に置き換えられます(結果は「CBC」になります)。

「AB=C」というルールについては、このルールはどのシンボルが「C」に置き換えられるべきか決定することができません。この場合、両方とも「C」に置き換えられます(結果は「CCC」になります)。

結果

構文エラーを表示します。

結果の文字列をコンソールに

このボタンをクリックすると、全てのルールと成長パラメータが考慮され、コンソールに現在効力があるシンボルシーケンスが表示されます。そのようなシーケンスは、たとえば、下記のようになります(これは、成長4に設定されたの例からのシンボルのシーケンスです)。