درس هشتم

در جاوا تری دی Java 3D

درس هشتم:

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 مورد نظر) رو حول خودش بچرخونیم ، جلسه های بعد یاد می گیریم که چه جوری میشه حول یه محور دیگه هم چرخید!!!!