ساخت انجین سه بعدی بر روی فلش پلایر ۱۰

mehdadoo

Member
مواردی که میخوام براتون دربارشون بگم، هیچ وقت قدیمی نمیشن و چیزایی هستن که هر برنامه نویس سه بعدی باید بدونه. از فلش پلایر ۱۰ استفده میکنم.


اولین نکته 3D وجود بعد دیگری به غیر از طول و عرضه، که ما بهش میکیم عمق که با z نشونش میدیم.برای این آموزش فرض میکنیم، که اشیا هرچه دورتر از ما میشن، عمقشون افزایش پیدا میکنه. همینطور برخلاف پیش فرض فلش که نقطه (0,0) در بالا و سمت چپ قرار داره، نقطه مرکزی (0,0,0) رو ما در مرکز صفحه نمایش در نظز میگیریم.

پرسپکتیو قانونیه که با استفاده از اون ما تشخیص میدیم یک شی به ما نزدیک یا دور هستش. یا به قولی دیگه، ما چه جوری میتونیم کاری کنیم یه شیه به نظز نزدیکتر یا دورتر از ما دیده بشه.
از میان قوانین دقیق پرسپکتیو، دو تاش به درد ما میخورند. ۱-اشیا هر چه دورتر بشن، کوچیک تر باید دیده بشن ۲- اشیا هرچه که دورتر برن، نزدیک تر به نقطه مرکز دیده میشن.

بنابراین این دو قانون بسیار ساده ابزار ما برای شبیه سازی بعد عمق یا z هستند. یعنی:۱- اشیا رو بزرگ یا کوچک کنیم. ۲-اشیا را از نقطه مرکزی دورتر یا نزدیک تر کنیم.
perspective.png


یک توضیح که میتونید نخونیدش.
برای شبیه سازی این قوانین، یک نکته دیگه هم هست. ما یک شی داریم، یک صفحه نمایش، و یک عدد که نشون دهنده عمق شیه یا Z هست، یک چشم، و یک عدد تازه دیگه، فاصله چشم از صفحه نمایش. البته منظوزم از چشم اون چیزیه که به نوعی مثل دوربین داره از کل اشیاعکس میگیره. به عدد آخر در همه جا حتی عکاسی Focal Length - fl میگن. اون عدد رو ۲۰۰ فرض میگیریم.

برای محاسبه نسبت بزرگنمایی یک شی سه بعدی، در صفحه دو بعدی مانیتور، لازمه از یک قانونی که همه استفاده میکنند استفاده کنیم. کار سختی نیست:
کد:
[LEFT]scale = fl / ( fl + z);[/LEFT]
این فرمول یک عددی بین ۰.۰ تا ۱.۰ رو بیرون میده، که نسبت کوچک نمایی و همینطور نزدیک شدن شی به نقطه مرکزیه.

حالا کافیه scaleX و scaleY شیه رو یا این عدد ضرب کنیم. همینطور حاصلضرب x و y شیه با این نسبت، مکان شی رو در صفحه نمایشگر رو نشون خواهد داد.





به همین سادگی.

مرحله بعدی برای نمایش قدرت انجین سه بعدیمون، نوشتن فرمولی هستش که با استفاده ازش چرخش شی رو بتونیم اندازه گیریم کنیم. یا به قول دیگه ای، دوربین رو دور شیه بچرخونیم.
rotation.png

این فرمول با سرعت بالا ساده(در واقع پیچیده!) شده توسط قوانین الجبرا.
کد:
[LEFT]x1 = cos(angle) * x - sin(angle) * y;
y1 = cos(angle) * y + sin(angle) * x;[/LEFT]
این فرمول یک شی رو نسبت به نقطه (0,0) روی محور z به اندازه زاویه تعیین شده میچرخونه.


تمام جمله های قبلی مربوط به تقطه بود، ولی من برای قابل درک تر بودن از کلمه شی استفاده کردم. پس وقتشه یک کلاس برای نقطه درست کنیم و همه فرمول هایی که گفته شد رو توش بذاریم.
Point3D.as

مدل سازها شاید از poly modeling استفاده کنند، ولی در واقع هر شکل بیشتر از سه ضلع، در نهایت برای رندر شدن به مثل تبدیل میشن. مثلث پایه به تصویر کشیدن مدل سه بعدیه.
کافیه سه Point3D رو به هم وصل کنیم، و دیگه تمامی امکانات انجین سه بعدی، رومون باز میشه. پس هر مدل از مثلث ها تشکیل شده، و هر مثلث از سه نقطه. مثلث های یک مدل در اکثر موارد از نقطه های مشترکی استفاده میکنند.عکس triangles.png راحت تر توضیح میده.
triangles.png

پس اگر نقطه های
کد:
p1=(0, 0,0); p2=(10, 0,0); 
p3=(0,10,0); p4=(10,10,0);
رو داشته باشیم، برای ساخت یک مربع، مثلث ها این گونه خواهند بود:
کد:
t1=(p1,p2,p3); t2=(p2,p3,p4);
این مهمه که برای تعیین نقطه های مثلث در جهت گردش عقربه ساعت یا برخلاف جهتش عمل کنیم. باید برای ساخت همه مثلث ها از یک راه استفده کنیم. مثلا
کد:
t2=(p4,p3,p2);
غلطه چون برای ساخت مثلث t1 بر جهت حرکت عقربه ها نقطه ها رو انتخاب کردیم ولی برای t2 برخلا حرکت عقربه ها. اهمیت همسان بودن قاعده انتخاب نقطه ها در قانون بعدی خودش رو نشون میده.

اگر مثلثی پشت به دوربین بود، نباید اون رو نقاشی کنیم. به این کار backface culling مگین. برای تشخیص اینکه یک مثلث آیا پشت به دوربین هست یا نه، نقطه وسط مثلث رو پیدا میکنیم و یک بردار ازش بیرون میکشم. ریاضی ۳ رو یادتون هست. ضرب بردارها.
اگر ضرب بردار فرضی که از دوربین به شی رسم میشه با برداری که از مرکز سه نقطه مثلث به بیرون رسم میشه مثبث باشه، اون وقت پشت مثلث به دوربین هست.
نیازی به یادآوری قوانین بردار نیست، چون قبلا با استفاده از الجبرا فرمول خیلی با سرعت بالایی برای محاسبه backface culling طراحی شده و ما از اون استفاده میکنیم.
در کلاس Triangle3D تمامی مطالب گفته شده درباره مثلث به کد تبدیل شده، و با مطالعه اون کلاس کل داستان قابل درک تر میشه.



حالا وقتشه که از دو کلاس Point3D و Triangle3D استفاده کنیم، و یک مدل سه بعدی بسازیم. کلاس Main.as
حرف A رو به صورت نقطه نقطه در یک Array ذخیره میکنیم، و بعد با استفاده از این نقطه ها مثلث هایی رو درست میکنیم، و اون وقت اولین مدل سه بعدیمون را خواهیم داشت.
برای نقاشی مدل سه بعدی، نقطه های هر مثلث رو به هم وصل میکنیم و با استفاده از moveTo LineTo در یک graphics object مثلث ها رو رسم میکنیم.
یه نکته هست، اونم اینه رندر گرفتن یک مدل، مثل کار نقاش ها میمونه. یعنی لایه لایه روی هم چیز هایی رو میکشن. ما هم باید تمامی مثلث ها رو لایه لایه روی هم نقاشی کنیم. طبیعیه که لایه ای که دورتر قرار داره باید اول رسم بشه.
مثلا اگر داخل یک محفظه Array تمامی مثلث های مدلمون رو داشته باشیم، باید اون Array رو با توجه به عمق هر مثلث ترتیب بندی کنیم.
برای محاسبه عمق هر مثلث میشه از میانگین عمق های سه نقطه مثلث استفاده کرد، اما ما نزدیک ترین مثلث به دوربین رو نقطه z مثلث فرض میکنیم.
برای ترتیب بندی، از فانکشن ساده
کد:
triangles.sortOn("depth", Array.DESCENDING | Array.NUMERIC);
فانکشن Array.sortOn تمامی اعضای یک array رو با توجه به یک property ترتیب بندی میکنه. ما مثلث های موجود در triangles Array رو با توجه به عمقشون ترتیب بندی کردیم.
باید بدونید آموزش ترتیب بندی درست مثلث ها در یک کتاب جا نمیشه، و این راحت ترین راه بود که عرضه شد!






حالا با command
mxmlc main.as -output main.swf
کامپایل میکنیم.
main.png

و به همین سادگی ‌BasicHomeMadeVision3D رو با main.swf به رخ میکشیم!
البته من کمی جلوتر رفتم و مدل سه بعدی که برای بازی مولتی پلایر westRace ساخته بودم رو با استفاده از python در blender به xml خروجی گرفتم و نتیجش رو در Load3D.swf میتونید ببینید. برای این کار با استفاده از امکانات Native فلش پلایر ۱۰ و Affine Rendering تونستم texture رو هم نقاشی کنم.البته اون با زبان Haxe نوشته شده.
Load3D.png

تمامی این قوانین به پلتفورم های دیگه هم میتونه اطلاق بشه.

Special thanks to grant skinner, keith peters, nicollas cannasse.
 

پیوست ها

  • 3D.zip
    246.8 کیلوبایت · بازدیدها: 215
آخرین ویرایش:

benyamin_pc

Well-Known Member
برای شروع آموزش 3D به شکل پایه ای و کاملا دستی فایل آموزش introduction to directX که همراه با دایرکت ایکس قدیما دانلود میشد فصل اولش ریاضی و هندسه درس داده و ماتریس دوران و ... کامل توضیح داده و دید خوبی میده اما ساخت ی موتور تو ایران فقط میتونه جذاب باشه اما نه اقتصادیه نه آینده نگری
 

mehdadoo

Member
دونستن مهمه، حتی دونستن ساخت دوباره چره از نو

برای شروع آموزش 3D به شکل پایه ای و کاملا دستی فایل آموزش introduction to directX که همراه با دایرکت ایکس قدیما دانلود میشد فصل اولش ریاضی و هندسه درس داده و ماتریس دوران و ... کامل توضیح داده و دید خوبی میده اما ساخت ی موتور تو ایران فقط میتونه جذاب باشه اما نه اقتصادیه نه آینده نگری

البته مفاهیم توضیح داده شده، پایه ای ترین موضوعاتی بودند که هر برنامه نویس سه بعدی و 3D engineer باید بهشون مسلط باشه.
وحید کاظمی هم اکنون در تیم image processing فیس بوک هست، به این دلیل که فکر میکرد ساخت موتور در ایران هم جذابه هم آینده نگری!
 

benyamin_pc

Well-Known Member
بعضی ها شاید حمایت پشتشون باشه و به نظر من آینده نگری نیست توی ایران فرصت 10 تا چیز دیگرو که باید یاد گرفت بذاریم رو چیزی که معلوم نیست در چه حد جواب بده و کل زندگیو گذاشت پای چیزی که آخرشم که خوبم یادش بگیری از هر چندین هزار نفر شاید ی نفر شانس پیشرفت داشته باشه اونم خارج از ایران و بنده هم همینو گفتم درسته؟
اینکه همه بخان دنبال چیزی باشن که از اول از داخل کلا ناامید باشن این راه و هدف و حتی شانس همه نیست و نمیتونه باشه
البته منظورم نیست هدف بدیه نه اما این موضوع خیلی سادس مثل اینه که شما مثلا تو کشوری کارخونه تولید بستنی بزنی که اون کشور کلا مصرف بستنی نداره و تمام امید به فروش خارجی باشه و داخل اگه مصرف بخاد داشته باشه اولا فقط مصرفه و دوما هزینه و وقتی که بابت تاسیس اون کارخونه گذاشتی فقط باید جوابگوی علاقه و هدفت باشه و دیگر هیچ
 
آخرین ویرایش:

benyamin_pc

Well-Known Member
منم ی موقه به پردازش تصویر علاقه شدیدی داشتم . فوریه و موجک و لاپلاسین و ..... اما دیدم دارم وقتمو رو کارخونه بستنی و شاید اصلا خود بستنی زیر آفتاب سوزان ایران مصرف میکنم و اهدافم هم به واسطه این و خیلی چیزای دیگه کمی تغییر کرد
 

sharktech

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

وگرنه همه افرادی که تو این کار هستن از همه مشکلات آگاهی دارن.

ممنون مهرداد جان عالی بود
 

benyamin_pc

Well-Known Member
بله درسته , منهم ازشون تشکر کردم و خیلی هم عالیه و رفرنسی هم خودم معرفی کردم که به طور کامل برای هرکی دوست داره بیشتر بدونه توش هست اما در کل اون بحث هم باز شد و همونطور که قبلا هم گفتم این موضوع ربطی به علایق نداره و هرکس هر علاقه ایو میتونه دنبال کنه
 
آخرین ویرایش:

ava282009

Member
مهاجرت به اتریش و تحصیل در این کشور ممکن است یک فرصت عالی برای گسترش دانش و تجربه شغلی باشد. در زیر به چند مرحله برای مهاجرت و تحصیل در اتریش اشاره شده است:1. **انتخاب دوره تحصیلی:**- ابتدا باید تصمیم بگیرید که در چه رشته‌ای می‌خواهید تحصیل کنید. اتریش دارای دانشگاه‌های با سابقه و برنامه‌های تحصیلی متنوعی است.2. **آموزش زبان:** - برخی از برنامه‌های تحصیلی به زبان آلمانی یا زبان انگلیسی ارائه می‌شوند. بسته به دوره و دانشگاه، ممکن است نیاز به یادگیری زبان محلی (آلمانی) داشته باشید.3. **انتخاب دانشگاه و برنامه تحصیلی:**—- پس از انتخاب رشته، باید دانشگاه و برنامه تحصیلی مورد نظر را انتخاب کنید. بررسی شرایط پذیرش، امکانات دانشگاه، و شهریه مهم است.4. **درخواست پذیرش:**- درخواست پذیرش را به دانشگاه ارسال کنید. این مرحله شامل ارسال مدارک، اطلاعات تحصیلی، و در بعضی موارد مصاحبه است.5. **ویزای تحصیلی:** پس از دریافت پذیرش، باید ویزای تحصیلی را درخواست کنید. بررسی نیازمندی‌ها و مدارک مورد نیاز برای درخواست ویزا مهم است.6. **آمادگی برای زندگی در اتریش:*- مطالعه درباره فرهنگ محلی، سیستم آموزشی، و زندگی روزمره در اتریش اهمیت دارد. همچنین باید مسائل مالی، مسکن، و بیمه را مدیریت کنید.قبل از هر مرحله‌ای، توصیه می‌شود که با دقت اطلاعات مرتبط با دانشگاه‌ها، برنامه‌های تحصیلی، و الزامات مهاجرت به اتریش را بررسی کنید و در صورت نیاز از مشاوره مراکز معتبر یا دفاتر مهاجرت بهره‌مند شوید.
 

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

بالا