ادامه جاوا تری دی

اگه درس های قبلی جاوا تری رو مشاهده نکردید توصیه می کنم برید قسمت اول آموزش جاوا تری دی رو ببینید بعد بیایید اینجا!

---------------------------------------------------------------------------------------------------------------------

درس هفتم:

Appearance،Color3f،Sphere

امروز می خوام در مورد Appearance صحبت کنم ، Appearance یکی از مهم ترین ابزارات یک تری دی کاره ، با Appearane خیلی کارا میشه کرد، میشه یه شکل رو رنگ کرد ، میشه واسش Texture تعریف کرد ،میشه باهاش به یک شی Material اضافه کرد و ....

کلاً چیز خوبیه :) !!!

برای اینکه با Appearance آشنا بشیم یه مثال ساده کار می کنیم و خلاص!

امروز  می خواهیم یه برنامه خیلی خیلی ساده با هم بنویسیم که یک کره به شعاع 6. داشته باشیم(جان کره!!! امروز برای اولین بار از شر مکعب رنگی خلاص میشیم) ، برای سادگی هم به جای استفاده از Transform برای شکل و نقطه دید ، امروز فقط از متد کار راه انداز setNominalViewingTransform استفاده می کنیم.

خب چون برنامه خیلی ساده است کدش رو یه جا می زنیم:

همونطور که گفتم ،برنامه خیلی ساده است ، یه SimpleUniverse داریم ، یه BranchGroup اصلی ، یه BranchGroup واسه شکلمون (که همون کره باشه) ، یه کره با شعاع 6. (Sphere) 

نمک و فلفل به مقدار کافی :) ( نه این مال اینجا نبود :) اشتباه شد)

بعد هم که تکراریه :کره s رو به shapeGroup و shapeGroup رو به rootGroup و rootGroup رو به universe اضافه کردیم ،در آخر هم از سر تنبلی از متد setNominalViewingTransfom استفاده کردیم (اصلاً شما که دیگه همه اینا رو از برید من برای چی تکرار می کنم؟؟ ؟؟؟؟ ؟؟؟؟؟؟؟؟)

اما!همه چیز به همین سادگی هم نیست ، اگه برنامه رو اجرا کنید ، هیچی نمی بینید :) :) :) (خیلی حال میده نه؟؟؟ )

برای چی؟؟؟ دلیلش ساده است: چون شکلمون نه رنگی داره ، نه طرحی داره ،نه پولی داره، نه ماشینی!!!! ، خلاصه اینکه چون هیچ مشخصه خاصی نداره جاوا تری دی بد بخت هم نمی دونه چی نشون بده!!!! قبلاً هم از colorCube استفاده می کردیم چون خودش رنگ منگ به اندازه کافی داشت.

خب حالا چی کار کنیم!

جواب : 

اول باید یه رنگ واسه خودمون تعریف کنیم، برای اینکار از Color3f استفاده می کنیم ( مسیر کاملش اینه : javax.vecmath.Color3f)

پارامتر ها به ترتیب red و green و blue هستند . (همون RGB خودمونه دیگه!)

بعد از تعریف رنگ باید یه Appearance ایجاد کنیم ، رنگ رو بهش اعمال کنیم و سر آخر این Appearance رو به شکلمون نسبت بدیم.

برای اینکار به صورت زیر عمل می کنیم:

اول Appearance رو تعریف می کنیم:

دوم: چون مستقیماً نمی تونیم اون رنگی رو که تعریف کردیم به Appearance امون اضافه کنیم باید از یه واسط استفاده کنیم به نام ColoringAttributes ، برای اینکار به صورت زیر عمل می کنیم:

(دیگه هی من مسیر کامل این چیزایی که معرفی می کنم رو نگم ،یا خودتون ctrl+space ای چیزی بزنید یا تا آخرش صبر کنید همه چیز معلوم میشه)

حالا که Appearance امون رو ساختیم می تونیم اون رو به شکلمون (همون کره ه با نام s) نسبت بدیم:

الآن دیگه همه چیز تموم شده و به خوبی و خوشی کار می کنه ،کل برنامه هم تا الآن باید این شکلی باشه:

کد برنامه رو هم می تونید از اینجا دانلود کنید:

 http://safecomp.persiangig.com/CODE/MyApp.java

و اگه برنامه رو اجرا کنید خروجیش باید این شکلی باشه:

و در آخر دو تا نکته:

1) نکته اول اینکه این شکلمون که اصلاً شبیه کره نیست! شبیه دایره است!چرا؟؟؟ خوب برای اینکه نور پردازی نداریم ، اگه اون مکعب رنگی رو هم می تونستیم سه بعدی ببینیم واسه این بود که اضلاعش رنگ های مختلفی داشتند(البته اونجا هم نور پردازی نداشتیم ولی تفاوت رنگ اضلاع خودش برای ایجاد تصور سه بعدی کافی بود).

2) نکته دوم: حالا دایره به نظر رسیدنش به کنار ،چرا مثل آدمیزاد شبیه دایره نیست؟؟؟ خوب برای اینکه به طور پیش فرض برای تولید کره از جزیئات زیادی استفاده نمیشه ، اگه می خوایید یه کره تر و تمیز تر داشته باشید باید میزان جزئیات رو افزایش بدید ، برای مشخص کردن میزان جزئیات یک کره باید از سازنده سه پارامتری اون استفاده کنید:

فعلاً با پارامتر دوم این سازنده کاری نداریم ، فقط همین رو بدونید که پارامتر سوم میزان جزئیات رو نشون میده ، سعی کنید به جای 40 مقادیر دیگه ای مثل 4 و 5 و 6 و 60و 70 و ... رو هم آزمایش کنید تا متوجه قضیه بشید :)

نقطه سر خط.

--------------------------------------------------------------------------------------------------------------------

درس هشتم:

PolygonAttributes و چرخش I:

سلام مجدد به برو بچه های جاوا تری دی کار.یه دو سه هفته ای بود که حسش نبود بیام از جاوا تری دی بگم ، امروز بعد مدت ها دوباره حسش اومد :) :)

.

امروز می خواهیم یه کم کارای جالب بکنیم:

1) با PolygonAttributes آشنا بشیم ، و ببینیم چه جوری میشه نحوه نمایش یک شکل رو با استفاده از اون کنترل کرد.

2) با نحوه چرخش شکل ها آشنا بشیم .اونم به ساده ترین نحوش (چون چرخش اشکال تو جاوا تری دی جنبه های مختلفی داره که تو جلسات بعد با بقیه جنبه ها هم آشنا می شیم)

چون می دونم که تا اینجا به اندازه کافی تو جاوا تری دی حرفه ای شدید برای همین امروز خیلی در مورد کد هایی که می نویسیم توضیح نمی دم

مثل همیشه اول اول یه کلاس ایجاد می کنیم (من اسمش رو گذاشتم MyRotationI )

این دفعه این کلاس رو   implements Runnable  قرار می دیم ، چون می خواهیم یه کاری رو به صورت دائمی تو برنامه ممون انجام بدیم ( شکلمون رو توی یه حلقه بی نهایت نسبت به محور ها Y ها بچرخونیم)

کل import ها و مقدماتی که لازم داریم رو می تونید ببینید:

چون این دفعه کدمون یه مقدار زیاد میشه به جای اینکه همه رو توی سازنده کلاس بنویسیم ،چند تا متد می نویسیم که کدمون یه مقدار تر و تمیز تر شه (البته توجه کنید که این متد بندی ها فقط واسه تمیز کاری و هیچ گونه از مباحث مهندسی نرم افزار یا شی گرایی یا ... رو نمی خواهیم رعایت کنیم ( اصلاً حسش نیست که بخواهیم اینا رو هم رعایت کنیم))

پس اول سازنده رو می نویسیم و متد هایی که لازم داریم رو فراخوانی می کنیم و نمه نمه خود متد ها رو هم می نویسیم:

مثل همیشه universe و rootGroup رو که باید ایجاد کنیم ( از نون شب واجب تر اینان)

یه TransformGroup هم برای نگه داری شکلمون استفاده می کنیم

چون می خواهیم این شکل رو بچرخونیم یعنی می خواهیم Transform اون رو تغییر بدیم پس باید ویژگی ALLOW_TRANSFORM_WRITE رو بهش اضافه کنیم (البته این موضوع رو قبلاً یاد گرفته بودیم فقط واسه یاد آوری می گم)

شکلی که می خواهیم ایجاد کنیم سه کره است ، از سازنده سه پارامتری Sphere استفاده می کنیم که بتونیم میزان جزئیات رو هم تنظیم کنیم (در اینجا 14 )

متد addShape چند تا کار باید برامون انجام بده:

1) شکل رو رنگی کنه ( با استفاده از ColoringAttributes که قبلاً باهاش آشنا شدیم)

2)نحوه نمایش شکل رو تنظیم کنه ( با استفاده از PolygonAttributes که در ادامه باهاش آشنا میشیم) 

3) در نهایت هم شکل مورد نظر رو به shapeGroup اضافه کنه

متد moveShape فقط شکل رو جا به جا می کنه ( که با نحوه این کار قبلاً آشنا شدیم )

بعد این کارا shapeGroup رو به rootGroup و rootGroup رو به universe اضافه می کنیم مثل همیشه

بعد متد moveUniverse رو فراخوانی می کنیم ( که نقطه دید رو جا به جا می کنه)

آخر هم یه Thread می سازیم و کلاسمون رو براش ارسال می کنیم و start رو صدا می زنیم تا متد run اجرا بشه.

پس اول متد addShape:

با ColoringAttributes که قبلاً آشنا شدیم ،PolygonAttributes هم مثل اون به Appearance اعمال میشه.تو کد بالا PolygonMode رو به صورت POLYGON_LINE تنظیم کردیم.

اما این ویژگی دقیقاً چیه؟؟؟ خب اگه خودتون تجربه رسم دو بعدی و سه بعدی داشته باشید درکش ساده است.در حقیقت شکل های اینجوری ایجاد می شن که اول مجموعه ای از نقاط ایجاد میشه ، سپس این مجموعه نقاط به هم وصل میشن و خط ها رو به وجود میارن، سر آخر هم هر سطح بسته ای که بین چند تا خط قرار بگیره fill میشه ،وقتی PolygonMode رو به صورت POLYGON_LINE تنظیم می کنیم فقط دو مرحله اول اجرا میشن (خودتون POLYGON_POINT رو هم آزمایش کنید)

بقیه اش هم که نیاز به توضیح نداره.

این متد هم شکل مورد نظر رو 1 واحد تو محور X ها می بره سمت راست ،1 واحد تو محور Y ها می بره پایین و 6 واحد تو محور Z ها می بره عقب ، دیگه این یه کار رو باید خیلی خوب یاد گرفته باشید چون تا حالا n بار انجامش دادیم :) :)

این متد moveUniverse بدون توضیح!!!!!!!

و حالا متد run که قراره توش دائماً شکلمون رو به گردش در بیاریم.

توجه کنید که ما خود شکل ها رو نمی تونیم بچرخونیم بلکه می تونیم TransformGroup هایی که شکلمون رو در بر دارن بچرخونیم یا جا به جا کنیم یا هر کاری مثل این.

برای چرخش باید اینجوری عمل کنیم:

1) اول Transform قبلی ای که به شکلمون اعمال شده بود رو به دست بیاریم،برای اینکار یه Transform3D ایجاد می کنیم و اون رو به متد getTransform   اون TransformGroup ای که شکلمون رو در بر داره ارسال می کنیم،تو این مثال چون shapeGroup در بردارنده شکل مورد نظره از اون استفاده می کنیم(shapeGroup.getTransform  رو صدا می زنیم)

 

بعد یه Transform3D دیگه ایجاد می کنیم که تبدیل مربوط به چرخش رو با استفاده از اون ایجاد کنیم ، مثل این:

این Transform ساده است که نسبت به محور Y به اندازه PI/8ام می چرخه .

توجه کنید که از منفی یا مثبت بودن زاویه برای تعیین جهت چرخش استفاده می کنیم.

حالا اکه یه چیزایی از هندسه تحلیلی و تبدیل ماتریس ها یادتون باشه که خیر و برکت ولی اگه نباشه هم باز خیر و برکت :) :) ، کاری که الآن باید بکنیم اینه که این تبدیل دوم رو به تبدیل اول اعمال کنیم و نتیجه که ترکیب این دو تا تبدیل هست رو مجدداً به shapeGroup اعمال کنیم:

همه این کار ها رو هم باید بزاریم توی یه حلقه با یه مقدار تاخیر :

اینم نتیجه اجرای برنامه: (البته کره ه باید بچرخه:) )

مثل همیشه کد کامل رو می تونید از اینجا دانلود کنید:

http://safecomp.persiangig.com/CODE/MyRotationI.java

و اما نکته پایانی:

امروز فقط تونستیم شکل مورد نظر (البته درست تر اینه که بگیم TransformGroup مورد نظر) رو حول خودش بچرخونیم ، جلسه های بعد یاد می گیریم که چه جوری میشه حول یه محور دیگه هم چرخید!!!!

---------------------------------------------------------------------------------------------------------------------

درس نهم

چرخش II:

تو درس قبلی تا حدودی با چرخش آشنا شدیم ، ترفندی که استفاده کردیم این بود که اول TransformGroup ای که شکلمون رو در بر گرفته بود به یه نقطه دلخواه جا به جا می کردیم و بعد هم اون رو می چرخوندیم ، هر TransformGroup یک نقطه محوری داری که به عنوان مختصات مرکزی اون به کار میره ،هر TransformGroup محور های اصلیش از همین نقطه مرکزی عبور می کنند ، وقتی یه TransformGroup رو تحت یک عمل انتقال قرار می دیم در حقیقت همین نقطه مرکزیه جا به جا میشه! شکل زیر این موضوع رو نشون میده:

از طرفی قبلاً یاد گرفتیم که می تونیم Group های تو در تو داشته باشیم ، یعنی یک شکل مفروض S رو می تونیم بزاریم تو Gn و بعد Gn رو بزاریم تو Gn-1 و .... G3 رو بزاریم تو G2و G2 رو بزاریم تو G1 و در نهایت با این کار شکلمون رو در n لایه ی تو در تو قرار می دهیم.شکل زیر این حالت رو برای دو لایه نشون میده:

توجه کنید که TransformGroup رو میشه به صورت یک کش خیلی محکم که به دور شکلمون کشیده شده در نظر گرفت ، برای همین وقتی یک شکل رو توی دو تا TransformGroup تو در تو می زاریم این دو تا TransformGroup به هم می چسبن و مثل یه TransformGroup رفتار می کنن(در حقیقت همه TranformGroup ها از یک نقطه مرکزی استفاده می کنند).برای اینکه این ویژگی رو از بین ببریم باید TransformGroup های داخلی تر رو تحت یک عمل انتقال قرار بدیم مثل شکل زیر:

پس از اینکه عمل انتقال رو برای TransformGroup های داخلی انجام دادیم اونوقت نقطه مرکزی TransformGroup های داخلی عوض میشه و بعد این هر TransformGroup می تونه ساز خودش رو بزنه:)

حالا می خواهیم با این حرف ها برنامه قبلی رو طوری تغییر بدیم که شکل مورد نظر حول دو تا محور بچرخه (حول خودش و حول یه محور دیگه).نکته:این برنامه خیلی خیلی شبیه برنامه قبلیه ،برای همین حواستون به تفاوت ها باشه ، چون خیلی ریزن.

اولین کار ایجاد یک کلاسه که من اسمش رو میزارم MyRotationII.

اینم مواد اولیه:

می بینید که دو تا TransformGroup ایجاد کردیم (یکی لایه 1 و دیگری لایه 2) ، در ادامه می بینیم که این دو لایه بودن چه کار بردی داره :).

مثل همیشه اول اون چیزایی که لازم داریم رو ایجاد می کنیم :

برای هر دو تا لایه اجازه انتقال رو صادر کردیم:)

حالا شکل مورد نظرمون رو هم ایجاد می کنیم:

و متد addShape رو فراخوانی می کنیم ، کار این متد اینه که یه کم به سرو وضع شکلمونه برسه و بعد اون رو به لایه 2 اضافه کنه (shapeGroupLayer2) و لایه 2 رو هم به لایه 1 اضافه کنه.(این متد رو جلوتر کدش رو می زنیم ، غمتون نباشه).

و حالا دو تا متد مهم رو فراخوانی می کنیم ، اولی لایه 1 رو جا به جا می کنه. دومی هم لایه 2 رو در درون لایه 1 جا به جا می کنه ، توجه کنید که جا به جایی لایه های تو در تو موجب تغییر نسبی مختصات لایه های داخلی میشه.

و یه سری کارای تکراری دیگه برای اینکه کارمون با سازنده تموم بشه:

توجه کنید چون TransformGroup ها تو در تو هستند فقط shapeGroupLayer1 رو به BranchGroup اصلی (rootGroup)اضافه می کنیم.

حالا بیایید متد ها رو دونه به دونه توسعه بدیم:

همه چیزه این متد مثل برنامه درس قبلیست به جز دو خط آخرش ، که اول شکل رو به لایه 2 اضافه می کنیم و بعد هم لایه دو رو به لایه 1 اضافه می کنیم (نحوه ایجاد لایه های تو در تو).

حالا متد جا به جا کردن لایه 1 رو می نویسیم:

این متد لایه یک رو 1 واحد به سمت راست ، 0 واحد به سمت بالا و 6 واحد به سمت عقب میبره ، در حقیقت این کار باعث میشه نقطه محوری لایه 1 روی نقطه 0 , 1 , 6- قرار بگیره. و از این به بعد هر چرخشی که به این لایه اعمال کنیم تحت محور هایی انجام میشه که از این نقطه عبور می کنن. (چرخش یک TranformGroup رو جلسه قبل یاد گرفتید ).

حالا برای اینکه نقطه مرکزی لایه 2 با نقطه مرکزی لایه 1 فرق کنه باید لایه 2 رو جا به جا کنیم ، من اینجا انتقالی رو نوشتم که مرکز لایه 2 رو به میزان 2 واحد در راستای محور x ها از مرکز لایه یک دور کنه .(اینجوری دیگه شکل مورد نظر محور های اصلیش با محور های اصلی لایه دو برابره ولی با محور های اصلی لایه یک فرق داره).

خب نتیجه اخلاقی این انتقال ها چیه؟؟؟ الآن اگه لایه یک رو بچرخونیم ، چون مرکز شکلمون با مرکز لایه فرق کرده این چرخش باعث میشه که ما مشاهده کنیم که شکل مورد نظر حول یه محور دیگه می چرخشه به جای اینکه حول خودش بچرخه و این همون چیزیه که ما دنبالش بودیم (پس جنبه آموزشی درس امروز همینجا تموم میشه ، بقیه کدهایی هستن که فقط باید زد:))در ضمن اگه بخواهیم مثل قدیم مدیم ها شکلمون حول خودش هم بچرخه می تونیم لایه دو رو بچرخونیم چون مرکز لایه 2 با مرکز شکل یکیه:) :) ( حال می ده نه؟؟؟)

moveUniverse هم که مثل دفعه قبله با این تفاوت که این دفعه نقطه دید رو 5 واحد جا به جا کردم که به ظاهر خیلی به نظر میاد (با دفعه قبل مقایسه کنید) ، این برای اینه که جا واسه جنگولک بازی هایی که قراره در بیاریم باشه ، همیشه باید طوری نقطه دید رو جا به جا کنیم که دید خوبی نسبت به صحنه اصلی بهمون بده ، لازم هم نیست طوری این کار رو بکنیم که کل صحنه دیده بشه ، در کل دل بخواهیه !!!

و اما متد run که همون کارای جلسه قبل رو باید توش انجام بدیم ، منتهی این دفعه برای دو تا لایه.برای اینکه چرخش ها جالب تر به نظر برسن لایه یک رو با سرعت کمتری ( با انتخاب تغییر زاویه کوچیکتر) می چرخونیم.

مثل همیشه کد کامل رو می تونید از اینجا دانلود کنید:

http://safecomp.persiangig.com/CODE/MyRotationII.java

نتیجه اجرای برنامه رو هم دیگه عکسش رو نمیزارم ، خودتون تو خونه یا خوابگاه یا هر جای دیگه ای که هستید اونو اجرا کنید حالشو ببرید:)

نقطه سر خط.

---------------------------------------------------------------------------------------------------------------------

درس دهم:

بارگذاری آبجکت فایل!

معمولاً طراحی های اشیای سه بعدی رو توسط نرم افزار های تری دی مثل maya ،3d max  و ... انجام میدیم و بعد هم سعی می کنیم که این اشیا رو بیاریم تو برنامه خودمون !

معمولاً این محیط های سه بعدی ساز می تونن فایل هایی با پسوند obj. ایجاد کنن که خوشبختانه جاوا تری قادر به رندر کردن این نوع فایل ها هست (البته با یه سری محدودیت).

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

برای درس امروز من یه فایل از نت پیدا کردم (حسش نبود خودم یه دونه طراحی کنم :) ) نمی دونم گلدونه ؟ پیاله است؟ دیگه قهوه ایه؟ چیه؟ :) هر چی هست چیز خوبیه کار امروزمون رو راه میندازه!

این فایل رو می تونید از اینجا دانلود کنید:

http://safecomp.persiangig.com/Terracotta_Pot.obj 

خب ببینیم برای لود کردن این فایل باید چی کار کنیم:

اول ابزار های مورد نیاز:

خب دو تا چیز امروز هست که قبلاً ندیده بودیم ، یکیش همین Scene !

Scene هیچی نیست به جز یه interface که ازش برای یکپارچه سازی لودر ها استفاده میشه !

ObjectFile  یه لودره که برای فایل های obj. استفاده می شه ، آبجکت فایل ها در حقیقت فایل های متنی هستند که می تونید به صورت دستی خارج از محیط های سه بعدی سازی هم دستکاریشون کنید (البته اگه ازشون سر در بیارید) محتویات این نوع فایل ها در نهایت یه شکل سه بعدی رو توصیف می کنه.

خب کم کم بریم کد بزنیم که بفهمیم این حرفایی که می زنیم یعنی چی!

مثل همیشه کا رو از سازنده کلاس شروع می کنیم بیشتر کارمون رو هم همونجا انجام میدیم:

تو کد بالا می بینیم که هنگام ساخت objF پرچم RESIZE رو به سازنده ObjectFile ارسال کردیم ، اما برای چی این کار رو کردیم؟ معمولاً باید از اندازه شی ای سه بعدی ای که قصد داریم تو برنامه مون لودش کنیم با خبر باشیم ولی اگه ازش خبر نداریم یا اندازه اش زیادی بزرگ و درد سر سازه این پرچم رو برای سازنده ObjectFile ارسال می کنیم این پرچم شکل رو تو مختصات صفر و صفر و صفر قرار می ده و مختصات گوشه های اون رو طوری تنظیم میکنه که تو رنج 1- ,1- ,1- تا 1,1,1 قرار بگیرن.

اینجوری بعداً اگه خواستیم می تونیم این شکل رو به هر اندازه ای که خواستیم تغییر اندازه بدیم.

حالا باید فایل مورد نظر رو لود کنیم و اطلاعات اون رو توی یه Scene (در اینجا s) قرار بدیم.

من اون فایل obj. رو تو درایو ایم کپی کرده ام شما هر جای دیگه که دوست دارید کپی کنید (اصلاً بزارید کنار برنامه تون آدرس محلی بهش بدید!)

حالا این شکل رو به shapeGroup اضافه می کنیم :

بقیه کار ها هم که تکراریه ، shapeGroup رو به rootGroup اضافه می کنیم ، اونو به universe و ...

بعد هم باید Transform مورد نیاز برای universe  رو انجام بدیم ، برای اینکار هم که دیگه بد عادت شدیم یه متد moveUniverse می نویسیم و اونو صدا می زنیم:

پس اول صداش بزنیم که کارمون با سازنده تموم شه:

بعد هم بیاییم کدش رو بزنیم که فردا کسی پشت سرمون حرف در نیاره:) :

خب الآن دیگه به نظر میاد برنامه کامل باشه ، حالا وقتشه که اون اجرا کنیم:

می بینیم که ( یا نمی بینیم که !!!!!) هیچی معلوم نیست! اگه یادتون باشه قبلاً هم با یه همچین مشکلی مواجه شده بودیم ! اونجا اگه اشتباه نکنم و خوب یادم باشه شکلمون رو رنگ کردیم که بشه دیدش ولی امروز برای اینکه یه کم چیز بیشتری یاد بگیریم یه کار دیگه می کنیم!

امروز می خوام به صحنه نور اضافه کنم که بشه شکل مورد نظر رو دید.نوری که می خوام به صحنه اضافه کنم ترکیبی از سبز و آبی خواهد بود یه چیزی تو مایه های رنگ چراغ خواب!!!

نور پردازی تو جاوا تری دی ای بگیم نگیم اوضاعش بد نیست امروز می خوام از نور پردازی محیطی استفاده کنم(یه نوع نور پردازی که جهت مهت درست و حسابی نداره) ، نور پردازی های جوره دیگه هم هست البته که اگه بعداً عمری باقی بود و حسی میام می گم!

خب پس دو باره برگردیم تو سازنده کلاس قبل از اونجایی که moveUniverse رو صدا زدیم.(البته قبل و بعدش فرق چندانی هم نداره ها! ، همینجوری می گم!)

برای اینکه بتونیم یه نور محیطی ایجاد کنیم اول باید یه محدوده تعیین کنیم که بگیم "آقا ما می خواهیم نور تو این محدوده فقط وجود داشته باشه"

برای ایجاد این محدوده از BoundingSphere استفاده می کنیم، برای این مثال من BoundingSphere رو به صورت یک کره که تو نقطه 0و 0 و 20 قرار گرفته و دارای شعاع 100 هست تعریف می کنیم(این میشه همون محدوده ای که نور توش قرار می گیره، شعاع 100 هم کم نیست ها!!!).

قبل از ایجاد نور باید رنگش رو تعریف کنیم:

حالا نور محیطی رو ایجاد می کنیم

اون محدوده ای رو هم که قبلاً تعریف کرده بودیم حالا برای نورمون به کار می بریم و خلاص!!!!!!:

خب کارمون با نور دیگه تموم شده فقط مونده که اونو به صحنه اضافه کنیم ، برای اینکار باید اونو به rootGroup اضافه کنیم ، هم می تونیم نور رو مستقیماً به rootGroup اضافه کنیم و هم اینکه اول براش یه branchGroup بسازیم بعد branchGroup رو به rootGroupاضافه کنیم. من اینجا از روش دوم استفاده می کنم:

خب حالا با خیال راحت برنامه رو اجرا کنید!

.

.

.

چی شد؟؟؟ ترکید؟؟؟ اکسپشن داد؟؟؟ (البته می دونم بعضی ها برنامه رو هنوز اجرا نکردن ، چی فکر می کنی خیلی بچه زرنگی؟؟ :) حالش به این بود که اون موقع که گفتم برنامه رو اجرا کنید اجرا می کردی برنامه رو!)

خب اگه برنامه رو اجرا کردید و ترکیدن رو مشاهده کردید باید یه جابه جایی انجام بدید و اون خطی رو که rootGroup رو به universe اضافه می کنه بیاریدش بعد همه این کارایی که بالا انجام دادید یعنی قبل از فراخوانی moveUniverse:

خب الآن می تونید برنامه رو با خیال راحت اجرا کنید و خروجیش رو ببینید! نکته اخلاقی این درس هم این بود که بزارید آخر همه کارا rootGroup رو به universe اضافه کنید!:) :) :) :)

اینم خروجی برنامه:

البته لازم نیست که تاکید کنم که این شکله سه بعدیه و این که الآن ما چرا اینقدر ضایع می بینیمش دلیل داره!

مثل همیشه کد رو می تونید از اینجا دانلود کنید:

http://safecomp.persiangig.com/CODE/MyObjectLoader1.java

نقطه سر خط!.

---------------------------------------------------------------------------------------------------------------------

گزارش تخلف
بعدی