خلاصه
Lsystem SOP سیستم‌های L یا Lindenmayer-systems را پیاده‌سازی می‌کند، که به نام آریستید لیندن‌مایر (1925-1989) نامگذاری شده‌اند. این سیستم‌ها امکان تعریف شکل‌های پیچیده را از طریق تکرار فراهم می‌کنند. آن‌ها از یک زبان ریاضی استفاده می‌کنند که در آن یک رشته اولیه از کاراکترها به‌طور مکرر ارزیابی می‌شود و نتایج برای تولید هندسه استفاده می‌شوند. نتیجه هر ارزیابی، پایه‌ای برای تکرار بعدی هندسه خواهد بود و این حس رشد تدریجی را ایجاد می‌کند.

ساخت یک سیستم L با تعریف دنباله‌ای از قوانین شروع می‌شود که برای تولید رشته جدیدی از کاراکترها ارزیابی می‌شوند. هر کاراکتر در رشته جدید نمایانگر یک دستور است که روی یک قلم تخیلی (یا “لاک‌پشت”) تأثیر می‌گذارد. تکرار این فرآیند، هندسه شما را رشد می‌دهد.

کاربردهای L-system:

  • ایجاد اشیاء ارگانیک مانند درختان، گیاهان و گل‌ها به مرور زمان.

  • ایجاد اشیاء شاخه‌ای متحرک مانند صاعقه و دانه‌های برف.

فایل‌ها می‌توانند از دیسک یا وب خوانده شوند. برای استفاده از URL، از http:// استفاده کنید.


زیبایی الگوریتمی گیاهان

توضیحاتی که در اینجا آمده برای شروع نوشتن قوانین L-system کافی است، اما اگر به صورت جدی قصد دارید سیستم‌های L تولید کنید، باید کتاب زیر را تهیه کنید:

The Algorithmic Beauty of Plants
نویسندگان: Przemyslaw Prusinkiewicz & Aristid Lindenmayer
ناشر: Springer-Verlag, New York
ISBN: 0-387-94676-4, 1996

این کتاب مرجع نهایی در این زمینه است و شامل تعداد زیادی مثال L-system به همراه توضیح ایده‌ها و نظریه‌های پشت مدل‌سازی رشد واقعی گیاهان است.


پارامترها – صفحه هندسه (Geometry Page)

  • Type – type
    گزینه‌های خروجی هندسه:

    • Skeleton – skel: هندسه سیم‌اسکلت تولید می‌کند. مناسب برای اشیایی که سفت و زاویه‌دار هستند مانند صاعقه یا برف. همچنین زمان Cook SOP را کاهش می‌دهد.

    • Tube – tube: هندسه لوله‌ای تولید می‌کند. مناسب برای هندسه‌های جامد با منحنی‌های نرم مانند درختان و بوته‌ها. پارامترهای صفحه Tube تنها زمانی فعال می‌شوند که این نوع انتخاب شود.

  • Generations – generations
    تعیین تعداد دفعات اعمال قوانین روی رشته اولیه. این مقدار رشد سیستم L را کنترل می‌کند. می‌توان از تابع مبتنی بر زمان برای انیمیت کردن رشد استفاده کرد.

  • Random Scale – randscale
    مقیاس تصادفی به صورت درصد. طول، زاویه و ضخامت هندسه تغییر یافته را به صورت تصادفی مقیاس می‌دهد.

  • Random Seed – randseed
    بذر تصادفی برای SOP، برای انتخاب توالی‌های متفاوت از مقادیر تصادفی.

  • Continuous Angles – contangl
    محاسبه زاویه‌های افزایشی شاخه‌ها اگر مقدار غیر صحیح برای Generations استفاده شود. هنگام انیمیت کردن Generations، برای رشد نرم باید فعال شود.

  • Continuous Length – contlength
    محاسبه طول افزایشی نقاط هندسه اگر مقدار غیر صحیح برای Generations استفاده شود. همانند Continuous Angles برای رشد نرم و پیوسته.

  • Continuous Width – contwidth
    محاسبه ضخامت افزایشی نقاط هندسه (برای هندسه لوله‌ها).

  • Apply Color – docolor
    استفاده از یک TOP برای اعمال رنگ به L-system در طول رشد.

  • Image File – colormap
    تعیین TOP برای استفاده وقتی Apply Color فعال است. همچنین به ` و # اپراتورهای لاک‌پشت مربوط است.

  • UV Increment – inc
    تعیین مقدار پیش‌فرض افزایش U و V هنگام استفاده از اپراتورهای لاک‌پشت ` یا #.

    • incu

    • incv

  • Point Width Attribute – pointwidth
    افزودن ویژگی عرض به هر نقطه هندسه. این عرض توسط پارامترهای Thickness و Thickness Scale صفحه Tube تحت تأثیر قرار می‌گیرد.


پارامترها – صفحه Tube

این پارامترها فقط زمانی فعال هستند که Geometry Page > Type = Tube باشد.

  • Rows – rows
    تعداد طرفین لوله و تعداد تقسیمات هر طول گام.

  • Columns – cols
    تعداد طرفین لوله و تعداد تقسیمات هر طول گام.

  • Tension – tension
    میزان نرمی گوشه‌های شاخه‌ها.

  • Branch Blend – smooth
    فعال کردن این گزینه باعث اتصال پیوسته شاخه فرزند به شاخه والد می‌شود.

  • Thickness – thickinit
    ضخامت پیش‌فرض لوله.

  • Thickness Scale – thickscale
    ضریب مقیاس استفاده شده با اپراتورهای ! یا ?.

  • Apply Tube Texture Coordinates – dotexture
    فعال کردن، مختصات UV را روی لوله‌ها اعمال می‌کند تا بافت به صورت نرم و پیوسته روی شاخه‌ها قرار گیرد.

  • Vertical Increment – vertinc
    تعیین فاصله عمودی مختصات بافت روی هندسه لوله هنگام اعمال بافت.


پارامترها – صفحه Values

  • Step Size – stepinit
    طول پیش‌فرض لبه‌ها هنگام تولید هندسه جدید.

  • Step Size Scale – stepscale
    مقیاس تغییر طول هندسه توسط اپراتورهای ” یا _ (double quote یا underscore).

  • Angle – angleinit
    زاویه پیش‌فرض برای چرخش، رول و پیچ‌ها.

  • Angle Scale – anglescale
    ضریب مقیاس برای اپراتورهای ; یا @.

  • Variable b, c, d – varb, varc, vard
    جایگزینی متغیرهای تعریف‌شده توسط کاربر در قوانین یا رشته اولیه. می‌تواند شامل متغیرهای سیستمی مانند $F و $T باشد.

  • Gravity – gravity
    میزان گرانش اعمال شده به هندسه از طریق اپراتور T (تروپیسیم). تروپیسیم یعنی خم شدن گیاه در پاسخ به محرک خارجی. بخش‌های ضخیم یا کوتاه کمتر خم می‌شوند و بخش‌های بلند یا نازک بیشتر خم می‌شوند.


پارامترها – صفحه Funcs

این پارامترها امکان Stamping هندسه برگ‌ها را می‌دهند تا هر نسخه متفاوت باشد، به جای کپی ساده.

  • Pic Image TOP – pictop
    TOP مورد استفاده توسط تابع pic().

  • Group Prefix – grpprefix
    اگر تولید g(n) رخ دهد، تمام هندسه بعدی در گروهی با پیشوند این لیبل و مقدار ASCII n قرار می‌گیرد.

  • Channel Prefix – chanprefix
    اگر chan(n) ظاهر شود، با کانال محلی با پیشوند این لیبل و مقدار ASCII n جایگزین می‌شود.

  • Leaf Param A/B/C – stampa, stampb, stampc
    تعیین پارامترهای استفاده شده توسط برگ‌ها.

  • Rules DAT – rules
    مسیر به DAT تعریف‌کننده قوانین L-system.

  • Context Ignore – context_ignore
    کاراکترهایی که باید هنگام بررسی حساسیت زمینه نادیده گرفته شوند.

  • Premise – premise
    تعریف رشته اولیه‌ای که قوانین جایگزینی روی آن اعمال می‌شوند.


جایگزینی قوانین (Rule Substitution)

با گرامر L-system، اشیاء ارگانیک و شاخه‌ای ساختارمند ایجاد می‌شوند.

  • فرآیند با بررسی اولین کاراکتر رشته اولیه شروع می‌شود.

  • ۱۶ قانون به ترتیب بررسی می‌شوند تا قانون مناسب پیدا شود.

  • کاراکتر فعلی با یک یا چند کاراکتر جایگزین می‌شود و بقیه رشته مشابه پردازش می‌شوند.

  • این فرآیند برای هر نسل تکرار می‌شود.

محدودیت‌های قوانین:

  • اپراتورهای Polygon {} و Branch [] تا ۳۰ سطح تو در تو می‌توانند باشند.

  • طول قوانین می‌تواند ۲۵۶ کاراکتر باشد.

  • متغیرها می‌توانند تا ۵ پارامتر داشته باشند.

  • حداکثر ۲۵ قانون می‌توان تعریف کرد.


اپراتورهای لاک‌پشت (Turtle Operators)

  • F – جلو رفتن (ایجاد هندسه)

  • H – جلو رفتن نصف طول (ایجاد هندسه)

  • G – جلو رفتن بدون ثبت نقطه

  • f, h – جلو رفتن بدون ایجاد هندسه

  • J/K/M – کپی هندسه J، K یا M در موقعیت لاک‌پشت بعد از مقیاس و چرخش

  • T – اعمال وکت

نمادهای پارامتر (Parameter Symbols)

هر نماد می‌تواند حداکثر پنج متغیر تعریف‌شده توسط کاربر داشته باشد که می‌توان آن‌ها را در عبارات ارجاع داد یا مقداردهی کرد. متغیرها در پیشین (predecessor) نمونه‌برداری می‌شوند، در حالی که متغیرها در جانشین (successor) مقداردهی می‌شوند.

مثال:
قاعده A(i, j) = A(i+1, j-1)، هر A را با یک A جدید جایگزین می‌کند که پارامتر اول افزایش و پارامتر دوم کاهش یافته است.

توجه کنید که متغیرهای پیشین می‌توانند در بخش شرط یا احتمال قانون نیز ارجاع داده شوند.

مثال:
قاعده A(i):i<5 = A(i+1) A(i+1) هر A را حداکثر پنج بار دو برابر می‌کند (فرض یک Premise برابر A(0)).

پارامترهای اختصاص داده شده به نمادهای هندسی (مثل F، +، یا !) به صورت هندسی تفسیر می‌شوند.

مثال:
قاعده F(i, j) = F(0.5*i, 2*j) هر F را با یک F جدید جایگزین می‌کند که طول آن نصف و عرض آن دو برابر شده است.


بازنویسی اپراتور (Operator Override)

به‌طور معمول، نمادهای لاک‌پشت از طول/زاویه/ضخامت فعلی برای اثر خود استفاده می‌کنند. با ارائه یک پارامتر صریح، اپراتور لاک‌پشت مقدار پیش‌فرض را نادیده می‌گیرد.

پارامترهای Override برای F، f، G، h، H به شکل زیر است:

F(i,j,k,l,m)

  • i – بازنویسی طول

  • j – بازنویسی ضخامت

  • k – بازنویسی تعداد Segment لوله

  • l – بازنویسی تعداد Rows لوله

  • m – پارامتر کاربر

پارامترهای k و l امکان تعیین پویا رزولوشن لوله‌ها را فراهم می‌کنند.

مثال‌ها:

  • F – جلو رفتن با طول فعلی و ایجاد هندسه

  • H – جلو رفتن نصف طول فعلی و ایجاد هندسه

  • F(i,j) – جلو رفتن به طول i و ایجاد هندسه با ضخامت j

  • H(i,j) – جلو رفتن نصف طول i و ایجاد هندسه با ضخامت نصف j

  • +(i) – چرخش i درجه

  • ~(i) – زاویه تصادفی با مقدار i جایگزین شود

  • $(x0,y0,z0) – لاک‌پشت به مختصات (x0, y0, z0) اشاره می‌کند

مثال Premise:

F(1) +(90) F(1) +(90) F(1) +(90) F(1)

یک مکعب واحد تولید می‌کند، بدون توجه به Step Size یا Angle پیش‌فرض.


فهرست Override اپراتورها

لیستی از تفسیر هندسی پارامترها برای برخی نمادهای لاک‌پشت موجود است که شکل‌های هندسی تولید شده را مشخص می‌کند.


بازنویسی لبه (Edge Rewriting)

در کتاب The Algorithmic Beauty of Plants، مثال‌های زیادی از Edge Rewriting استفاده می‌کنند که شامل زیرنویس‌های چپ و راست است.

مثال:

Generations 10
Angle 90
Premise F(l)
Rules
F(l) = F(l)+F(r)+
F(r) = -F(l)-F(r)

TouchDesigner مستقیماً F(l) و F(r) را نمی‌شناسد. باید از پارامترگذاری استفاده کنیم.
پارامترهای اول چهارگانه برای نماد F: طول، عرض، تعداد sides لوله، تعداد segments لوله، و آخرین پارامتر قابل تعریف توسط کاربر است.

تعریف پارامتر آخر:

  • 0 = چپ

  • 1 = راست

پس از دو نسل: Fl+Fr+-Fl-Fr تولید می‌شود که تفاوتی با F+F+-F-F ندارد.

راه دیگر: استفاده از دو متغیر جدید و شرط برای تبدیل به F در مرحله آخر.


عبارات (Expressions)

عبارات مانند 0.5*i و 2*j می‌توانند در هر فیلد عددی استفاده شوند.

نمادهای قابل استفاده در عبارات:

  • () – پرانتز برای تعیین اولویت

  • ^ + - * / % – عملگرهای ریاضی

  • min(), max(), sin(), cos(), asin(), acos(), pic(), in() – توابع پشتیبانی‌شده

  • == != = < <= > >= – عملگرهای منطقی

  • & | ! – عملگرهای منطقی AND, OR, NOT

  • b c d – پارامترهای SOP b,c,d پس از توسعه

  • x y z – موقعیت فعلی لاک‌پشت

  • g – سن نماد

  • t – زمان (نسل‌های L-system)

  • a – پارامتر زاویه SOP

  • T – پارامتر تروپیسیم (گرانش) SOP

توجه: متغیرهای پیش‌فرض نباید در پیشین استفاده شوند.


توابع مخصوص L-System

  • pic(u, v, c) – مقدار نرمال‌شده پیکسل (0 تا 1) در مختصات نرمال‌شده (u,v) با کانال c

  • in(q, r, s) – بررسی اینکه نقطه (q,r,s) در داخل متابال است یا نه


شرایط (Conditions)

هر قانون می‌تواند شرط اختیاری داشته باشد:

[lc<] pred [>rc]:cond = succ

مثال:

Rule1 A:y>2=J

همه Aهای بالای ارتفاع 2 شامل J می‌شوند.


احتمال (Probability)

هر قانون می‌تواند احتمال استفاده شدن داشته باشد:

[lc<] pred [>rc]:cond=succ=prob

مثال:

Rule1 A=B:0.5
Rule2 A=C:0.5

A با احتمال برابر به B یا C جایگزین می‌شود.


ایجاد گروه‌ها با L-Systems

  • اپراتور g تمام هندسه ساخته شده را در گروهی جمع می‌کند.

  • پارامتر اختیاری:

g(1)[F]

تمام هندسه F را در گروه lsys1 قرار می‌دهد.

  • وضعیت گروه با وضعیت لاک‌پشت Push/Pop می‌شود.

مثال:

gF [ gFF ] F
  • F اول و آخر در گروه 0

  • FF میانی در گروه 1


کنترل طول در طول زمان

برای کاهش X درصد طول در هر تکرار، باید Premise را با مقدار شروع کنید و در قانون آن مقدار را در درصد دلخواه ضرب کنید:

Premise A(1)
Rule A(i) = F(i) A(i*0.5)

مثال عملی

  1. SOP دایره قرار دهید و Divisions = param("lsys",3)
    → مثلث نمایش داده می‌شود

  2. آن را به ورودی J یک L-System SOP متصل کنید

  3. Premise و Rule را تغییر دهید:

Premise A(0)
Rule1 A(i)=FJ(,,i+3)A(i+1)

→ خطی از چندضلعی‌ها با ترتیب افزایشی ایجاد می‌شود
4. 20 برگ تولید کنید و همه را در Switch SOP قرار دهید:

Select Input: param("lsys",0)
  1. استفاده از J(,,0), J(,,1) … برای تخصیص SOPها

توجه: می‌توان تا سه پارامتر Stamp استفاده کرد:
J(,,1,2,3)


ورودی‌های اپراتور (Operator Inputs)

  • Input 0: –

  • Input 1: –

  • Input 2: –

  • Input 3: –


کانال‌های Info CHOP

اطلاعات اضافی LSystem SOP از طریق Info CHOP قابل دسترسی است.

کانال‌های مشترک SOP Info:

  • num_points – تعداد نقاط

  • num_prims – تعداد پرمیتیوها

  • num_particles – تعداد ذرات

  • last_vbo_update_time – زمان صرف شده در Thread دیگر برای بروزرسانی GPU

  • last_meta_vbo_update_time – زمان صرف شده برای داده‌های سطح متا

کانال‌های مشترک Operator Info:

  • total_cooks – تعداد Cookهای انجام شده

  • cook_time – زمان Cook آخر (ms)

  • cook_frame – شماره فریم Cook شده نسبت به timeline کامپوننت

  • cook_abs_frame – شماره فریم Cook شده نسبت به زمان مطلق

  • cook_start_time – زمان شروع Cook در ms

  • cook_end_time – زمان پایان Cook در ms

  • cooked_this_frame – 1 اگر این فریم Cook شده باشد

  • warnings – تعداد هشدارها

  • errors – تعداد خطاها


برگه تقلب کد نویسی:

Turtle Operators

F Move forward (creating geometry)
G Move forward half the length (creating geometry)
f Move forward but don’t record a vertex
g Move forward (no geometry created)
h Move forward a half length (no geometry created)

J K M Copy geometry source J, K or M at the turtle’s position
after rescaling and reorienting the geometry.

^ Apply tropism vector
+ Turn right
– Turn left (minus sign)
& Pitch up
~ Pitch down
\ Roll clockwise
/ Roll counter-clockwise
| Turn 180 degrees
! Roll 180 degrees
@ Pitch / Roll / Turn random amount
* Multiply current length
” Multiply current thickness
% Multiply current angle
_ Divide current length (underscore)
= Divides current width
( Divide current angle
‘ Increment color index U (single quote)
” Increment color index V
\ Cut off remainder of branch
$ Rotate ‘up’ towards the sun about heading
[ Push turtle state (start a branch)
] Pop turtle state (end a branch)
{ Start a polygon
. Make a polygon vertex
} End a polygon
! Create a new primitive group to which subsequent geometry is added