درس ششم

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

درس ششم:

حرکت!

 

موضوع امروز حرکته! دفعه قبل با مفهوم Transform آشنا شدیم، الآن دیگه باید بتونیم یه کاری کنیم که کاربر بتونه توی صفحه حرکت رو ایجاد کنه.

در کل دو جور حرکت داریم:

1) گاهی اوقات اشکال توی صفحه حرکت می کنند

2) گاهی اوقات هم نقطه دید توی صفحه حرکت می کنه (جا به جا میشه)

امروز می خواهیم یه برنامه بنویسیم که توش هر دو جور حرکت رو پیاده سازی کنیم،برای اینکار یه برنامه فریمی با نام SimpleAnimate ایجاد می کنیم و توش چهار تا دکمه می زاریم که دو تاش شکل رو تو محور X جا به جا می کنن ( یکیش x رو کاهش میده و دیگری افزایش) و دو تا دگه دیگه هم نقطه دید رو تو محور X جا به جا می کنند.

پس بیایید شروع کنیم:

کمترین کاری که فعلاً می تونیم انجام بدیم اینه که یه کلاس با اسم SimpleAnimate ایجاد کنیم و اون رو زیر کلاس JFrame قرار بدیم ، یه دونه SimpleUniverse و یه دونه BranchGroup اصلی هم که همیشه نیاز داریم ( از نون شب واجب ترن) ، پس تا اینجاش اینا رو داریم:

حالا اون چهار تا دکمه ای که حرفش بود رو تعریف می کنیم،مثله دفعه قبل سه تا متغیر برای تعیین موقعیت شکل و سه تا هم برای تعیین موقعیت نقطه دید تعریف می کنیم (مثل دفعه قبل هم مقدار دهی می کنیم):

چون می خواهیم شکل و نقطه دید رو جا به جا کنیم ،واسه هر کدومشون هم یه TransformGroup تعریف می کنیم که بتونیم با استفاده از اونا و اعمال Transform های مناسب به هدفمون برسیم:

(توجه کنید اون متغیر هایی که با view یا vp شروع می شن واسه نقطه دید قراره به کار برن)

الآن وقتشه که فریممون رو طراحی کنیم:

خب ، مثل اینکه همه چیز داره خوب پیش میره، پس بهتره که همین الآن فریممون رو چک کنیم:

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

کد زیر رو بعد از setBounds ها میزنیم:

همونطور که می بینید تا اینجاش که کار جدیدی انجام ندادیم ،دقیقاً مثله دفعه قبله (خیلی هاش هم کپی پیسته ،اینو از سوتی هایی که تو اسم متغیراست میشه فهمید:) )

یه مکعب رنگی ایجاد کردیم

واسش یه TransformGroup جدید ایجاد کردیم

تبدیل مورد نظر رو با استفاده از Transform3D به TransformGroup اعمال کردیم

مکعب رو به TransformGroup اضافه کردیم

برای اعمال تبدیلات به نقطه دید هم کار های مشابه رو انجام دادیم با این تفاوت که TransformGroup اش رو new نکردیم!!!!!

در آخر TransformGroup ای که شکلمون رو در بر داشت به rootGroup که BranchGroup اصلیمونه اضافه کردیم و خود rootGroup رو هم به universe اضافه کردیم که همه اینا رو قبلاً یاد گرفتید و من فقط برای یاد آوری و تنبه :) اینا رو بهتون گفتم !!!

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

مثلاً بیایید کد مروبط به shapXInc رو بزنیم، برای اینکار باید کد زیر رو به برنامه اضافه کنید:

(بعد setBounds ها و قبل از کدی که الآن نوشتیم!!!،یعنی قبل از تعریف ColorCube )

(یه موقع دوباره کدهای مربوط به ColorCube یا setBounds رو نزنید!!! :) :) ،اینارو گذاشتم تو عکس که جای این کد جدید رو راحت تر مشخص کنم :) )

حالا دیدید! کار از این ساده تر هم داشتیم؟؟؟؟؟ فقط مختصات X شکل رو افزایش دادیم و مبتنی بر این مختصات جدید دوباره یه Transform3D ایجاد کردیم و اون رو به shapeTG اعمال کردیم ، چون shapeTG اون مکعب رنگیه رو در بر داره ،این تبدیل جدید به اون هم اعمال میشه،همین!

اما!!

اما!!!!

اما!!!!!!!!

اما!!!!!!!!!!!!!!!!

میبینید که علامت ها تعجب با توان 2 دارن رشد پیدا می کنن ،پس یه خبرایی هست!!! و اون اینکه اگه الآن برنامه رو اجرا کنید و روی دکمه shapeXInc کلیک کنید ، شکل رو که جا به جا نمی کنه هیچ ، یه لیست بلند بالایی از Exceptionهم میاره جلو روتون به قول معروف فحش میده!!!!

ولی این مشکل بر می گرده به حالت پیش فرض TransformGroupبرای رفع این مشکل کافیه که بعد از ایجاد TransformGroup این ویژگی رو بهش اضافه کنیم که آقا Transform ها بتونن ویرایش بشن!! یعنی کد زیر رو به برنامه اضافه می کنیم:

مجدداً یه تذکر خنده دار بدم و اون اینکه addChild رو تو تصویر بالا فقط برای راهنمایی گذاشتم که جای این کد جدیده رو پیدا کنید!!یه موقع دوباره addChild رو ننویسید!!!!! :)

نکته مهم دیگر!

یه نکته مهم دیگه ای که مونده اینه که همین کار رو لازم نیست برای vpTG انجام بدید ،نه تنها لازم نیست ، بلکه نمی تونید این کار رو بکنید چون vpTG رو اگه یادتون باشه ما new کردیم ما فقط از اونی که قبلاً بوده داریم استفاده می کنیم ،البته نگران نباشید ،vpTG خودش پیش فرضش اینه که Transform ها رو بشه ویرایش کرد :)

حالا که همه چی حل شد، سه تا دکمه دیگه رو هم عملیاتی می کنیم:

حالا اگه برنامه رو اجرا کنید متوجه میشید که همه چیز به خوبی و خوشی کار می کنه ، و یه نکته ساده ولی مهم اینکه افزایش مختصات X نقطه دید مثل کاهش مختصات X شکل عمل می کنه و کاهش مختصات X نقطه دید مثل افزایش X شکل عمل می کنه !! که این امر طبیعی هم هست ولی چون مهم بود متذکرش شدم!!!!

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

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

*

توصیه می کنم که هشت تا دکمه دیگه به این برنامه اضافه کنید و کد لازم برای جابه جایی شکل و نقطه دید توی دو تا محور دیگه رو هم بنویسید (محور Y ها و Z ها)

نقطه سر خط.