java 3D

درس اول:

سلام به همه برو بچه های برنامه نویس و غیر برنامه نویس و برنامه نویس نما (مثل من) :) ، امروز می خوام یه کم در مورد برنامه نویسی سه بعدی به صورت سطح بالا براتون بنویسم ، (سطح پایینش اینه که مستقیماً واسه open gl یا direct x کد بزنید )

اما چرا سطح بالا ، سطح پایین؟؟؟

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

java 3d یک تکنولوژی تحت جاوا برای نوشتن برنامه های سه بعدیه و در اون لازم نیست شما خیلی خودتون درگیر آن چه که در پشت پرده اتفاق می افته بکنید ، به نظر من اگه تازه دارید برنامه نویسی سه بعدی رو شروع می کنید این ساده ترین و بهترین گزینه است ، بعداً اگه عمری باقی موند این دو روش برنامه نویسی (سطح بالا و سطح پایین ) رو برای برنامه های با گرافیک سه بعدی با دقت بیشتری مقایسه می کنیم (دور همی )

خب داستان دیگه بسه ، بهتره که شروع کنیم،

1) اولین کاری که باید انجام بدیم اینه که ابزار اولیه java 3d رو نصب کنیم ، چون این ابزار به صورت پیش فرض با JRE یا JDK ارائه نمیشه باید اونو جدا دانلود کنید و بنصبید:

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

http://safecomp.persiangig.com/SOFTWARE/j3d-1_5_2-windows-i586.exe


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

http://safecomp.persiangig.com/SOFTWARE/j3d-jre.zip

2) بعد از اینکه فایل خوبه رو نصب کردید نوبت اینه که نمه نمه برنامه نویسیش رو هم شروع کنید،

خب پس یکی از اون IDE خوبا رو که رو سیستمتون نصب کردید باز کنید و یه کلاس جدید با نام First ایجاد کنید و کد زیر رو توش بزنید (توجه کنید که کد رو می زنن ،نمی نویسن :) )


یه کار دیگه هم اینه که کد بالا رو دانلود کنید

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

ولی خب بهتره که از همین شروع کار خودتون کد ها رو بزنید ، چون جلوتر که بریم کد ها طولانی میشن و ...

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

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

نقطه سر خط.

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

درس دوم:

قبل از این که بریم سره برنامه بعدی ، بزارید یه نموره در مورد SimpleUniverse توضیح بدم ،

SimpleUniverse زیر کلاس VirtualUniverse می باشه و بسیاری از ابزار هایی که یه برنامه نویس سه بعدی کار مبتدی به اون نیاز داره رو در اختیار ما میزاره ، همونطور که تو مثال قبل مشاهده کردید خیلی سریع یه چیزی مثل فریم که پس زمینه اش هم یه بوم (Canvas) بود اومد بالا بدون اینکه ما دو خط کد اضافه بزنیم، از ویژگی های مهم این کلاس اینه که سه چیز رو برای ما درست می کنه :

1)Local

2)Viewer

3)ViewingPlatform

که در مورد این سه چیز بعداً بیشتر صحبت می کنیم

و اما درس جدید:

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

وقتی یه Universe ایجاد می کنیم باید حداقل یه گروه داشته باشیم ، برای ایجاد گروه در جاوا تری دی از کلاس Group و زیر کلاس های اون استفاده می کنیم

BranchGroup : زیر کلاس Group می باشد و ما از این به بعد اشیایی رو که می سازیم به شی ای از این نوع کلاس اضافه می کنیم ، و در نهایت پس از اضافه کردن اشیا مورد نظر به این BranchGroup ، خود BranchGroup رو به دنیای گرافیکیمون اضافه می کنیم، به مثال زیر توجه کنید:



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

1) اون شی در کجا قرار داده بشه (مختصات هندسی شی)

2) دنیامون رو از چه نقطه ای ببینیم (مختصات هندسی دنیا )

ولی به جای دو تا گزینه بالا می تونیم از میون بر استفاده کنیم(فعلاً واسه نیاز های ما این راه جواب میده):

متد setNominalViewingTransform پنجره دیدی که برای دنیامون هست رو اونقد در محور Z عقب میاره تا شی ای که قصد دیدن اون رو را داریم نسبت به محور X ها در فاصل 1- و 1 نرماله بشه ( ها!!!!!!) (برای اینکه منظورمو بهتر بفهمید تو کد زیر پارامتر ورودی ColorCube رو عوض کنید تا مطلب جا بیفته )

یه نکته در مورد محور ها:

از چپ به راست پنجره محور جهت دار X

از پایین به بالای صفحه محور جهت دار Y

از ته صفحه به سمت ما محور جهت دار Z

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

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

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

و

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

باور کنید شکل بالا یه مکعبه :) ، چیه ؟؟؟ باور نمی کنید ؟؟؟ فکر می کنید مستطیله؟؟؟ نه مکعبه ،منتها چشم ها را باید شست ، جور دیگر باید دید!!!! بعداً که تونستیم این رو توی صفحه جا به جا کنیم اونوقت باور می کنید که یه مکعبه :)

نقطه سر خط.

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

درس سوم:

Swingizination

قبل از این که کارهای گرافیکی رو ادامه بدیم ، قبلش بریم یه کم این چیزا رو با Swing ای ،AWT ای چیزی مخلوط کنیم که اگه بعداً خواستیم یه برنامه درست درمون بنویسیم نمونیم تو گل!!!!

پس بریم به سمت Swing :

تو این قسمت می خوام یه برنامه فریمی خیلی ساده بنویسم که یه بوم و یه دکمه داره (همین)

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

1) اول یه کلاس ایجاد می کنیم با نام WithSwing1 و اون رو زیر کلاس JFrame قرار می دیم.

2) یه SimpleUniverse و یه Canvas3D و یه JButton به صورت عمومی تعریف می کنیم،

3) اندازه فریم رو 420 در 250 قرار میدیم

4) Layout رو به صورت null تنظیم می کنیم ( اینجا برای راحتی اینکار رو می کنیم ،ولی در کل توصیه می کنم خیلی از این Layout بندی استفاده نکنید)

5) تغییر سایز رو غیر مجاز می کنیم و DefaultCloseOperation رو روی EXIT_ON_CLOSE تنظیم می کنیم:

حالا بوم(Canvas3D) و دکمه(JButton) ای رو که تعریف کرده بودیم ،new می کنیم:


بعد از این ، مختصات این دو تا شی رو تنظیم می کنیم و اونا رو به فریممون اضافه می کنیم:

اینجای کار یه کم عجیب غریبه :) ، اون universe ای رو که تعریف کرده بودیم ،الآن new می کنیم ،منتهی با پارامتر ورودی myCanvas :


و در نهایت فریممون رو نمایش می دیم:

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

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

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

*

نقطه سر خط.

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

درس چهارم:

خب بریم که برنامه قبلی رو یه سر و سامونی بهش بدیم.

یادتونه اولی باری که یه مکعب رنگی (ColorCube) ساختیم اونو به یه BranchGroup اضافه کردیم و آخر سر اون BranchGroup رو به SimpleUniverse اضافه کردیم ؟؟؟ یادتونه؟؟؟ خب اون برناه خیلی ساده بود و ما فقط یه شکل تو دنیای سه بعدیمون داشتیم ، وقتی تعداد اشکالمون زیاد بشه به جای اینکه همه شکل ها رو به یه BranchGroup اضافه کنیم یه کار دیگه می کنیم:

اول: یه BranchGroup اصلی می سازیم

دوم: به ازای هر شکلی که ایجاد می کنیم یه BranchGroup فرعی ایجاد می کنیم و شکلمون رو به این BranchGroup فرعی اضافه می کنیم

سوم: به جای اینکه با خود اشکال کار کنیم با BranchGroup های فرعی کار می کنیم و اونا (BranchGroup های فرعی) رو به BranchGroup اصلی اضافه می کنیم (این کار همون گراف بندیست که حرفشو قبلاً زدیم)

چهارم: سر آخر هم اون BranchGroup اصلی رو به SimpleUniverse امون اضافه می کنیم

توجه: می تونیم به جای اینکه BranchGroup های فرعی بسازیم ، اشکالمون رو مستقیماً به BranchGroup اصلی اضافه کنیم ولی من توصیه می کنم که این کار رو نکنید و از روش بالا برای مدیریت اشکالتون استفاده کنید چون این روش ( ایجاد BranchGroup های فرعی) یه مزایایی داره که در ادامه خودتون می بینید.

خب برای اینکه این بحث بهتر واستون جا بیفته بیایید برنامه قبلی رو توسعه بدیم.

اول یه کلاس به نام WithSwing2 ایجاد می کنیم و کدی رو که دفعه قبل زده بودیم این دفعه هم می زنیم ( می تونید کپی ،پیست هم کنید ولی من این کار رو توصیه نمی کنم) ، به متغیر های عمومی تون یه متغیر دیگه هم اضافه کنید ( همون BranchGroup اصلی مون که اینجا بهش می گیم rootGroup):

تا اینجاش که 99 درصدش شبیه برنامه قبلی بود ، حالا اون rootGroup رو هم new می کنیم و متد addShapes رو هم فراخوانی می کنیم ، این متد رو هم چند لحظه دیگه می نویسیم:

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

خب حالا بر می گردیم به نقطه ای که این متد رو فراخوانی کردیم و اضافه کاری ها رو انجام می دیم( rootGroup رو به universe اضافه می کنیم):

الآن کل کدتون باید این شکلی باشه:

الآن اگه این کد رو اجرا کنید خروجی باید به صورت زیر باشه:

تصویر بالا مربوط به سه تا مکعبه !!!!!!!!!! که بزرگه پشت سره متوسطه است و متوسطه پشت سره کوچیکه ولی چون ما از رو به رو می بینیمشون فکر می کنیم داریم یه مستطیل می بینیم :)

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

مثلاً با این کدمون می خواهیم بگیم که اگه rootGroup چند تا فرزند داشت ، ابتدایی ترین فرزندش رو حذف کن ،یعنی اگه دفعه اول این دکمه رو فشار بدیم باید مکعب بزرگه حذف شه چون اون ابتدایی ترین فرزند rootGroup است!!!! (یادتونه گفتم ترتیب اضافه کردن مهمه؟؟) و همین طور اگه دفعه دوم این دکمه رو فشار بدیم مکعب متوسطه حذف میشه و الی آخر....

ولی خب اگه برنامه رو اجرا کنید و دکمه رو بزنید یه لیست بلند بالایی از Exception میاد جلو روتون و اعصابتون رو میریزه به هم!!!!:) :) :) ولی برای چی یه همچین اتفاقی میافته؟؟؟

چون حالت پیش فرض BranchGroup اینه که بچه هاش به صورت Read_Only بهش اضافه میشن و ثانیاً وقتی یه BranchGroup رو به BranchGroup دیگه اضافه می کنیم حالت پیش فرضش اینه که به صورت جدا ناپذیر به اون BranchGroup اضافه میشه ، برای رفع این مشکل باید یه مقدار دیگه کد بزنیم:

اول : کاری می کنیم که بچه های rootGroup دیگه Read_Only نباشن،برای اینکار خط زیر رو به برنامه اضافه می کنیم(دقیقاً بعد از جایی که rootGroup رو new کردیم):

دوم: به BranchGroup های فرعی ای که برای هر یک از اشکالمون می سازیم این ویژگی رو اضافه می کنیم که جدا پذیر باشند،یعنی متد addShapes رو به صورت زیر تغییر میدیم:

حالا اگه برنامه رو اجرا کنید و اون دکمه رو بزنید ، می بینید که مکعب ها حذف میشن!!

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

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

نقطه سر خط.

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

درس پنجم:

خب بریم رو مبحث بعدی

مبحثی که امروز می خوام در موردش بگم ، مبحث مهمیه پس خوب دقت کنید.

امروز می خوام در مورد Transform و TransformGroup بگم .

اول TransformGroup:

یکی از زیر کلاس های Group میباشد ، پس می تونیم ازش به عنوان یه ابزار گروه بندی اضافه کنیم ، یعنی می تونیم اشکالمون رو بهش اضافه کنیم ( به عبارتی می تونیم به جای BranchGroup از این استفاده کنیم) ،منتهی وقتی از TransformGroup استفاده می کنیم باید یک تبدیل هم برای اشکالی که بهش اضافه می کنیم در نظر بگیریم ،این تبدیلی می تونه هرچیزی رو مشخص کنه ، مثلاً موقعیت هندسی ، یا چرخش یا کش اومدن یا ....

برای مشخص کردن تبدیلی که به یک TransformGroup اختصاص داشته باشه باید از کلاس Transform3D استفاده کنیم.

برای اینکه بحث بالا رو بهتر متوجه شیم ، از مثال استفاده می کنیم.

یادتونه یه بار برای نمایش شکل گفتم اگه بخواهیم یه شکل رو نشون بدیم باید دو تا کار بکنیم،

یکی این که موقعیت شکلمون رو مشخص کنیم و دوم اینکه موقعیت نقطه دیدمون رو مشخص کنیم و درست همون موقع هم بود که از روی تنبلی به جای این دو تا کار از یه میونبر استفاده کردیم (منظورم setNominalViewingTransform) ، یادتون هست یا نه؟؟؟

خب امروز دیگه باید تنبلی رو بزاریم کنار.

می خوام یه مکعب رو بزارم تو صفحه به طوری که:

1) نقطه دیدمون رو تو نقطه (0و0و0) تنظیم کنم.

2) شکل مورد نظر رو تو محور Z ها چهار واحد ببرم عقب ، تو محو X ها 1 واحد ببرم سمت راست ،و تو محور Y ها کاریش نداشته باشم ، یعنی برای شکل مورد نظر می خوام از تبدیل (X=1,Y=0,Z=-4) استفاده کنم.

اولین کاری که می کنم اینه که یه کلاس به اسم MyTransform1 ایجاد می کنم.

برای اینکه کار ها تر تمیز پیش بره 6 تا متغیر از نوع float مشخص می کنم.

سه تاش برای نقطه دید

و سه تاش هم برای شکل مورد نظر (باز هم مکعب رنگی!!!!!!!!!!! )

و این شیش تا متغیر رو با مقادیری که بالا ذکر خیرشون بود مقدار دهی می کنم.

یعنی تا اینجا باید برنامه این جوری باشه:

مثل همیشه یه SimpleUniverse و یه BranchGroup اصلی ایجاد می کنم:

حالا وقتشه که کد خوبه رو بزنیم ، یعنی یه شکل ایجاد کنیم ،و به جای اینکه مثل قدیما اونو به BranchGroup اضافه کنیم ، این دفعه اون رو به TransformGroup اضافه کنیم ، ببینیم کار با این TransformGroup چی جوریه؟؟؟ هی می گن TransformGroup ،TransformGroup :)

می ریم تو سازنده کلاس

اول universe و rootGroup رو new می کنیم ، بعد هم یه مکعب رنگی می سازیم:

حالا یه TransformGroup می سازیم، یه Transform3D هم می سازیم ، چون همونطور که قبلاً گفتم تبدیلات یک TransformGroup رو باید با کلاس Transform3D مشخص کرد.

حالا وقته اونه که تبدیلی رو که برای شکلمون در نظر گرفته بودیم به shapeTrans (که شی ای از Transform3D هست) اعمال کنیم:

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

*

حالا با خیال راحت این TransformGroup (همون shapeGroup ) رو به BranchGroup اصلی (همون rootGroup) اضافه می کنیم:

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

یه قدم دیگه مونده تا کارمون تموم شه ، و اون اینکه الآن باید تبدیلی رو که برای نقطه دیدمون در نظر گرفته بودیم اعمال کنیم ، ولی چی جوری ؟؟؟ ما که نمی خواهیم universe رو به جایی add کنیم ، پس نمی تونیم واسش یه TransformGroup جدید new کنیم ، پس باید چی کار کنیم؟؟؟ هیچی !!! ViewingPlatform ای که به universe اختصاص داره خودش TransformGroup داره ، ما فقط باید اون رو ویرایش کنیم ،برای اینکار به صورت زیر عمل می کنیم( باید سه بار "دات" بزنید :) :) ) :

حالا که یه TransformGroup برای universe داریم ، اعمال تبدیل که دیگه کاری نداره ،قبلاً یاد گرفتید این کار رو :

حالا rootGroup رو به universe اضافه می کنیم و خلاص !

کل برنامه الآن باید این شکلی باشه:

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

مثل همیشه ،کد رو هم می تونید از اینجا دانلود کنید (هر چند مثل همیشه توصیه ام اینه که خودتون کد رو بزنید):

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

نقطه سر خط.

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

درس ششم:

حرکت!

موضوع امروز حرکته! دفعه قبل با مفهوم 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 ها)

نقطه سر خط.

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

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

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