درس نهم

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

درس نهم

چرخش 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

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

نقطه سر خط.