استفاده از Lindenmayer system در ساخت procedural terrain

Mahdi_Rashed

Well-Known Member
Lindenmayer system یکی از انواع Fractal ها در محیط دوبعدی و سه بعدی هستند که میتوان با آنها داده های تصادفی را تولید و در ساخت سازه های تصادفی در بازیها مانند درخت، گیاهان و بیشتر ساخت کوه و کوهستان استفاده کرد . به طور کلی Procedural generation ها یا سازه های خودساخته یا تصادفی ترکیبی از انواع Fractal ها با سیستمهای رندر رئال تایم است که هم میتوان از mesh rendering و هم از Voxel استفاده کرد . ولی برای بهینه سازی حجم داده هایی که از GPU بازخوانی و پردازش میشوند بهترین راه استفاده از Mesh Rendering است. Lindenmayer system یک نوع از Fractal ها هستند که اول از همه از یک مثلث متساوی الاضلاع تشکیل شده . در مرحله دوم با اضافه شدن یک فرمول دیگر به فرمول قبلی یعنی:

n=0 , A به n=2 , AB

تبدیل میشود و روی هر یک از اضلاع یک مثلث متساوی الاضلاع دیگر درست میشود و اضلاع مشترک آنها که ساق مثلثهای جدید است از سیستم حذف میشود . بنابراین به ترتیب داریم:

n=3 , ABAAB و ....

وقتی لازم باشد که یکی از اضلاع مشترک حذف شود داریم :

n=4 , ABAABABA و n=5 , ABAABABAABAAB

در این حالت شکلی مطالق شکل زیر ایجاد میشود.

2420169232463563435.jpg


که در حالتی که از نزیک تر نگاه کنیم این شکلی است

32723239318530392170.jpg


فرق سیستم Lindenmayer در 3بعد این است که اضلاع مشترک حذف نمیشوند چون در صورتی حذف آنها Face مورد نظر که به صورت triangle تشکیل شده از هم می پاشد.

در کد نویسی سیستم Lindenmayer باید به بخشهایی مانند یابنده face های 3گوشه در شی 3بعدی و تبدیل هر یک یه 3 face جدید یعنی وسط هر face یا پیدا کرده و از هر راس به آن یک edge اضافه کند .

پس در سیستم Direct X با فراخوانی یک 3Dplane آن را با کمی دستکاری از طریق mesh editor به شکل زیر تبدیل میکنیم.

2106280333910213528.jpg


با دادن ترکیب های داده ای که بعداً آموزش برنامه نویسی اون رو قرار میدم 3 فرمول جدید به mesh اضافه میشه با شرط اینکه اضلاع مشترک حذف نشن یا اگر لازم به حذف آنها بود face جدید با دستورات cap ترمیم بشه . بنابراین شکل جدید این شکلی است

296270422393348519.jpg


همین روش را یا 11 فرمول دیگه هم ادامه میدیم

6631302106738033581.jpg


شکل نهایی ما همین است که میشه با استفاده از دستورات displace و soft select کمی شی 3بعدی را شبیه یک کوه انجام بدیم . برای این کار بهتر است که با استفاده از تکسچرهای تصادفی Plasma یا smoke است ولی چون توضیح این دو سیستم تصادفی بسیار وقت گیر میباشد فقط یک دستور soft select ساده به شی 3بعدی نسبت میدهیم.

2621133132702324395.jpg


منبع : جامعه طراحان خورشید
 

Mahdi_Rashed

Well-Known Member
زبان برنامه نویسی : C# Advanced version 2010 ویرایش 4300

ساخت سیستمLindenmayer در 3بعد:

کد:
using system;
using system.direct3D;
using system.directdraw;
using system.fractal;
using system.Lsystem;

public struct vector3
{
    float X = 0.0;
    float Y = 0.0;
    float Z = 0.0;
}

public struct 3dplane
{
    float value length = 128;
    float value width = 128;
    float value Doubleshade = 1;
    float value matcolor = 0x802B00;
}

// ااینجا شی ایجاد شده را در mesh editor پیشفرض سیستم برنامه نویسی میبریم

on object 3dplane {
    load edge value = A,B,C,D,E,F,G,H,I;
    load face value = a,b,c,d,e,f,g,h,i;
    load vertex value = a1,b2,c3,d4;
    if ( edge = 3 + face = 1 ) {
        do value A+B+C = W;
        do value W/3 = Q;
        do object action connect {
            do connect a1=A && b2=B && c3=C;
        }
        else {
            do action reset;
        }
    }
    if ( edge = 3 + face = 0 ) {
        do object action cap {
            do cap A=a && B=b && C=c;
        }
        else {
            do action reset;
        }
    }
    void action reset;
    do object action formula {
        do action step && value = 12;
    }
}

on object 3dplane {
    do object action softselect {
        set name = mod1;
        float value center = 374.735;
        float value middle = 274.915;
        float value border = 100;
    }
    do object action displace {
        do object chain_action mod1;
        float X = 0.0;
        float Y = 0.0;
        float Z = +150.000;
    }
}
 

جدیدترین ارسال ها

بالا