بالا
 تعرفه تبلیغات




 دانلود نمونه سوالات نیمسال دوم 93-94 پیام نور

 دانلود نمونه سوالات آزمونهای مختلف فراگیر پیام نور

صفحه 2 از 2 اولیناولین 12
نمایش نتایج: از شماره 11 تا 13 از مجموع 13

موضوع: آموزش مقدماتی و فشرده شروع برنامه نویسی گرافیکی سه بعدی تحت XNA و زبان های VB.Net و C#‎.Net

  1. #11
    TAHA آواتار ها
    • 9,180
    مدير بازنشسته

    عنوان کاربری
    مدير بازنشسته
    تاریخ عضویت
    Mar 2009
    محل تحصیل
    PNU-CLUB
    شغل , تخصص
    PNU-CLUB
    رشته تحصیلی
    PNU-CLUB
    راه های ارتباطی

    Icon14


    ----- طراحی اشیای مناسب در 3DMax و استفاده صحیح از Texture

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

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


    مثلاً ...
    اگر شما به اغلب سه بعدی کارها بگویید برایتان یک ماشین یا تانک یا ساختمان و... طراحی کنند که در بازی تان استفاده کنید، آنها میتوانند شی مورد نظر شما را با تمام جزئیات و کامل در داخل 3dmax طراحی کنند!
    که شی نهایی بسیار زیبا و خوش ساخت هم خواهد بود ولی اغلب این اشیا ارزش کاربردی در برنامه های سه بعدی ندارند!!!

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

    این قبیل کارها بسیار زیبا هستند ولی برای کار بازی سازی مطلقاً فاقد ارزش هستند!!!

    آن فرد متخصص سه بعدی کار میخواهد یک تک ماشین را با 100 یا 200 هزار یا فیشتر فیس روی رایانه خودش که معمولاً بسیار هم قوی است ببیند و آخر سر هم چهار ستون رایانه و RAM و CPU و HDD و VGA و... میلزد تا یک دانه ماشین او را روی مانیتور نشان دهد!!!

    حالا شما فکر کنید بخواهید 10 یا 100 تا از ان ماشین یا تانک یا آدم یا ساختمان و... را در بازی خود لود کنید و تازه کلی مخلفات اضافه هم داشته باشید (سایر اشیا و زمین و ساختمانها و درختها و شهر و...)
    آنگاه بدون شک برای اجرای بازی شما به جای 500M حافظه نیاز به یک رایانه با 5GB حافظه و به جای کارت گرافیک 512MB یک کارت گرافیکی 500GB نیاز خواهید داشت!!!!

    اگر شما به بازی های روز و قوی فعلی نگاه مهندسی معکوس وار (و نه نگاهی از سر لذت و کیف بردن از بازی!) بیاندازید متوجه نکته کوچک و البته بسیار مهمی در تفاوت اشیای استفاده شده توسط این بازیها میشوید.
    در تمام بازیها برای پیاده سازی جزئیات یک شی از تصویرهایی استفاده میشود که روی سطح را مثل یک کاغذ دیواری میپوشانند.


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

    یا اگر روی زنجیر تانکی زوم کنید متوجه میشود زنجیر هم صاف است ولی رویش یک عکس الگو دار کشیده شده.

    دیوار و پنجره و... ساختمانها هم همه تصویری هستند که روی یک سطح صاف کشیده شده اند.

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

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


    شما باید تا حد امکان زوایاو جزئیات واقعی سه بعدی اشیا را کاهش دهید و به جایش ان جزئیات را روی تصاویر روکش شده برای اشیا بیاورید.
    چون هر زاویه و جزئیات سه بعدی منابع سیستم و کارت گرافیکی را مصرف میکند ولی برای رایانه فرقی ندارد که تصویر روکش ساده باشد یا رنگارنگ باشد!

    پیشنهاد میکنم با در نظر گرفتن مطلب فوق و با نگاه دقیق تر یک بازی رایانه یا پلی استیشن و ... را دقیق بررسی کنید و اشیا را سی کنید از نزدیک ترین فاصله ببینید!
    (به فکر بردن نباشید! خیالتان راحت اگر بازی را باختید ایراد ندارید میتوانید دوباره اجرایش کنید!)

    ==============

    یک مژده هم به دوستانی که XNA را شروع کرده ام بدهم!
    همانطور که حتماً متوجه شده اید XNA از نمایش runtime متون string از RightToLeft پشتیبانی نمیکند و به صورت runtime قادر به نمایش متون فارسی و عربی نیستید ...
    البته میتوانید کلمات و عبارات خود را عکس و تصویر کنید و در برنامه نشان دهید که این کار خیلی ساده تر و البته سریعتر هم است ولی بحرحال فعلاً runtime نمیتوانید یک string فارسی را نمایش دهید!

    اما مژده اش !!!
    من توانستم تابعی جدیدی برای این امر نوشته و با موفقیت هم آزمایشش کنم که اجازه میدهد به همان سادگی نمایش متون انگلیسی و با همان دستورات و بدون دنگ و فنگ بتوانید متون فارسی را هم نمایش دهید.
    انشا ا... در محل مناسب و در امکانات ghnet.xna.dll معرفی خواهد شد.

  2. #12
    TAHA آواتار ها
    • 9,180
    مدير بازنشسته

    عنوان کاربری
    مدير بازنشسته
    تاریخ عضویت
    Mar 2009
    محل تحصیل
    PNU-CLUB
    شغل , تخصص
    PNU-CLUB
    رشته تحصیلی
    PNU-CLUB
    راه های ارتباطی

    Icon14

    معرفی مفاهیم پایه ریاضی و ساختارهای مربوطه ...
    سلام

    بردار
    XNA.Vector3

    بردار یک پاره خط جهت دار است، به بیان ساده تر یک فلش یا پیکان در فضا که جهتی مشخص را نشان میدهد و طولی مشخص دارد.
    بردار به ذات یک مکان هندسی نیست و جای خاصی در فضا ندارد و در عین حال میتوانید آن را هر جایی تصور کنید، مهم نوک جهت پیکان بردار و طول ان است.

    هر بردار سه مولفه X و Y و Z دارد.

    =====

    نقطه !
    XNA.Vector3

    یک تک نقطه را در فضا مشخص میکند.
    برای نقطه ساختار و کلاس جداگانه ای نداریم و میتوان از همان XNA.Vector3 استفاده کرد که سه مولفه X و Y و Z دارد.
    طبیعی است که اگر منظور از XNA.Vector3 یک نقطه باشد دیگر توابع گفته شده در فوق بی معنی خواهند بود.
    (
    البته از دید ریاضی نقطه هم در واقع میتواند یک بردار باشد که از نقطه 0,0,0 به سمت آن محل کشیده شده و نام دیگر نقطه، میتواند بردار مکان باشد!
    )

    =====

    بردار رنگی !
    XNA.Vector3

    لازم به ذکر است که در برخی توابع XNA برای مشخص کردن رنگ یا فیلتر رنگی خاصی باز از بردارد استفاده میشود که در آن شرایط XYZ مشخص کننده طولهایی RGB در یک مکعب فرضی رنگی هستند. به بیان ساده تر از XYZ به جای RGB استفاده شده.

    البته ساختاری خاص برای رنگ هم داریم XNA.Graphics.Color

    ولی باید این دقت را داشته باشید که لزوماً یک XNA.Vector3 را در کدی دیدی همیشه به عنوان یک بردار فضایی-مکانی عادی تصور نکنید.

    =====

    بردار ها قابل جمع و تفریق با برداری دیگر و یا ضرب تقسیم در یک عدد هستند که هر مولفه بردار جداگانه رویش عمل فوق انجام میشود و اپراتور این اعمال در ساختار XNA.Vector3 از قبل تعریف شده.
    کد:
    کد:
    //C#‎
    XNA.Vector3 v1, v2, v3;
    v3 = v1 + v2;
    
    
    'VB
    Dim v1, v2, v3 As XNA.Vector3
    v3 = v1 + v2
    (در نوشتار جبری از همان چهار علایم اصلی استفاده میشود.)

    =====

    طول بردار
    طول پاره خط بردار برابر جذر مجموع مکعب مولفه هایش است!
    کد:
    کد:
    //C#‎
    XNA.Vector3 v;
    float len = (float)Math.Sqrt(v1.X * v.X + v.Y * v.Y + v.Z * v.Z);
    float len = v.Length();
    
    
    'VB
    Dim v As XNA.Vector3
    Dim len As Single = CSng(Math.Sqrt(v1.X * v.X + v.Y * v.Y + v.Z * v.Z))
    Dim len As Single = v.Length()
    (در نوشتار جبری از علامت قدر مطلق استفاده میشود، چون قدر مطلق یک عدد هم نوعی طول بردار است! مثلاً |x| )

    مکعب طول بردار را که در برخی محاسبات نیاز میشود میتوانید با LengthSquared به دست اورید که در واقع دیگر محاسبه رادیکال را ندارد ²|x|

    =====

    نرمال سازی بردار
    به عملی اطلاق میشود که طی ان برداری جدید تولید میشود که هم جهت با بردار اولیه است ولی طولش یک واحد است
    طبیعتاً برابر است با تقسیم بردار بر طول خودش
    کد:
    کد:
    //C#‎
    XNA.Vector3 v, n , n;
    n = v / v.Length();
    
    n = XNA.Vector3.Normalize(v);
    
    n = v;
    n.Normalize();
    
    XNA.Vector3.Normalize(ref v, out n);
    
    
    'VB
    Dim v, n As XNA.Vector3
    n = v / v.Length()
    
    n = XNA.Vector3.Normalize(v)
    
    n = v
    n.Normalize()
    
    XNA.Vector3.Normalize(v, n)
    (
    در نوشتار جبری چنیبن بیان میشود |n/|n
    هموراه هموراه 1=| |n\|n |
    )

    =====

    ضرب نقطه ای دو بردار
    یک عدد میشود که برابر جمع ضرب جفت مولفه ها است.
    و نیز برابر ضرب طول دو بردار در Cos زاویه بین آنها است.
    کد:
    کد:
    //C#‎
    XNA.Vector3 v1, v2;
    float dot = v1.X * v2.X + v1.Y * v2.Y + v1.Z * v2.Z;
    float dot = XNA.Vector3.Dot(v1 , v2);
    
    
    'VB
    Dim v1, v2 As XNA.Vector3
    Dim dot As Single = v1.X * v2.X + v1.Y * v2.Y + v1.Z * v2.Z
    Dim dot As Single = XNA.Vector3.Dot(v1 , v2)
    بنابر تعریف دوم ضرب نقطه ...
    اگر این ضرب صفر شود یعنی دو بردار عمود بر هم هستند ...
    اگر این ضرب یک شود یعنی دو بردار موازی هم هستند ...
    با کمک تابع ArcCos میتوان زوایه بین دو بردار را به دست آورد ...
    و...

    این ضرب کاربرهای بسیاری در هندسه سه بعدی دارد.
    (
    در نوشتار جبری از یک نقطه برای نمایش ان استفاده میشود v1.v2
    هموراه (a.b=|a|.|b|.Cos(β
    )

    =====

    ضرب خارجی یا متقاطع دو بردار
    حاصل برداری است برابر با برابر دترمینالی 3 در 3 که سطر اول ان بردارهای یکه سه محور و دو سطر بعدی دو بردار باشند. (که به علت بردارهای یکه سه محور حاصل یک عدد مشخص نمیشود و یک بردار میشود.)
    - طول این بردار حاصل برابر ضرب اندازه دو بردار در Sin زاویه بینشان است.
    - بردار حاصل در فضا بر هر دو بردار قبلی عمود خواهد بود و جهت آن از قانون دست راست بدست می آید.
    - اگر جای بردار اول و دوم عوض شود مولفه های نهایی 1- برابرخواهند شد.

    کد:
    کد:
    //C#‎
    XNA.Vector3 v1, v2, v3;
    v3.X = (v1.Y * v2.Z) - (v1.Z * v2.Y);
    v3.Y = (v1.Z * v2.X) - (v1.X * v2.Z);
    v3.Z = (v1.X * v2.Y) - (v1.Y * v2.X);
    v3 = XNA.Cross(v1, v2);
    
    
    'VB
    Dim v1, v2, v3 As XNA.Vector3
    v3.X = (v1.Y * v2.Z) - (v1.Z * v2.Y)
    v3.Y = (v1.Z * v2.X) - (v1.X * v2.Z)
    v3.Z = (v1.X * v2.Y) - (v1.Y * v2.X)
    v3 = XNA.Cross(v1, v2)
    (
    در نوشتار جبری از علامت ضرب برای نمایش ان استفاده میشود v1×v2
    هموراه (a×b|=|a|.|b|.Sin(β|
    )



  3. #13
    TAHA آواتار ها
    • 9,180
    مدير بازنشسته

    عنوان کاربری
    مدير بازنشسته
    تاریخ عضویت
    Mar 2009
    محل تحصیل
    PNU-CLUB
    شغل , تخصص
    PNU-CLUB
    رشته تحصیلی
    PNU-CLUB
    راه های ارتباطی

    پیش فرض

    معرفی مفاهیم پایه ریاضی و ساختارهای مربوطه ... 2
    سلام

    شعاع
    XNA.Ray

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

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

    ==============

    صفحه
    XNA.Plane

    مکان هندسی نقاط مشخصی در فضا است که بردار این نقاط با یک نقطه مشخص بر بردار نرمال صفحه عمود است ...
    صفحه دو مولفه دارد، یک بردار نرمال و یک نقطه (بردار مکان)

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

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

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

    ==============

    ماتریس
    XNA.Matrix
    به طور مشخص در کار ما یک جدولی دو بعدی و 4 در 4 شامل 16 عدد است!

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

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

    مثلاً یک ماتریس میتوانید حاوی اطلاعاتی در خصوص ....
    - بزرگنمایی مجزا در هر سه بعد
    - وضعیت چرخش یک جسم به طور مجزا برای هر سه بعد
    - نقطه مرکزی چرخش و دوران جسم
    - نقطه مکانی انتقالی که جسم باید بدان جا حرکت کند باشد
    !!!!
    و با اعمال ان به ماتریس جسم میتوانید همه تغییرات فوق را در یک لحظه اعمال کنید!

    این ساختار انواع متدهای C#‎-Static یا VB-Shared را دارد که ماتریس را برای شرایط مختلف تولید میکند و میتوان آنها را با عمل ضرب با هم ترکیب کرد.

    =====

    ضرب دو ماتریس
    حاصل همچنان ماتریسی خواهد بود که هر عنصر آن از ضرب سطر نظیر در ماتریس اول در ستون نظیر در ماتریس دوم حاصل میشود
    این ضرب خاصیت جا به جایی ندارد بدان معنی که m1*m2 برابر نیست با m2*m1
    کد:
    کد:
    //C#‎
    XNA.Matrix m1, m2, m3;
    m3 = m1 * m2;
    m3 = XNA.Matrix.Multiply(m1, m2);
    XNA.Matrix.Multiply(ref m1, ref m2, out m3)
    
    
    'VB
    Dim m1, m2, m3 As XNA.Matrix
    m3 = m1 * m2
    m3 = XNA.Matrix.Multiply(m1, m2)
    XNA.Matrix.Multiply(m1, m2, m3)
    =====

    درک این مطلب بسیار مهم است که این ضرب خاصیصت جابه جایی ندارد.
    به کد زیر دقت کنید:
    کد:
    کد:
    //C#‎
    XNA.Matrix mxscale = XNA.Matrix.CreateScale(3.0f, 3.0f, 3.0f);
    XNA.Matrix mxtrans = XNA.Matrix.CreateTranslation(1.0f, 0.0f, 0.0f);
    
    XNA.Matrix x = mxscale * mxtrans;
    XNA.Matrix y = mxtrans * mxscale;
    
    'VB
    Dim mxscale As XNA.Matrix = XNA.Matrix.CreateScale(3.0f, 3.0f, 3.0f)
    Dim mxtrans As XNA.Matrix = XNA.Matrix.CreateTranslation(2.0f, 0.0f, 0.0f)
    
    Dim mx1 As XNA.Matrix = mxscale * mxtrans
    Dim mx2 As XNA.Matrix = mxtrans * mxscale
    mxscale اگر به هر مجموعه بردار مکان یا شی ای اعمال شود ابعاد آن را در همه جهات سه برابر میکند.
    mxtrans اگر به هر مجموعه بردار مکان یا شی ای اعمال شود آن را دو واحد در جهت محور X ها حرکت میدهد.

    فرض کنید یک شی سه بعدی در محل (0,0,0) قرار دارد و ماتریس mx1 و یکبار هم mx2 را به آن اعمال میکنیم.
    (در محل مناسب طرز نمایش و این عمل توضیح داده خواهد شد.)

    - اگر ماتریس mx1 به شی اعمال شود اول شی سه برابر بزرگتر شده و سپس به نقطه (2,0,0) میرود (یا اینطور دیده میشود)

    - اگر ماتریس mx2 به شی اعمال شود، اول شی به نقطه (2,0,0) میرود و بعد بردارهای مکان شی که آن را در این محل نشان داده و به شی حجم هم میدهند سه برار میشوند که نتیجه روی مانیتور آن خواهد بود که شی در محل (6,0,0) سه برار نمایش داده میشود.


    یعنی خلاصه در mx1 شی در (2,0,0) سه برابر بزرگتر دیده میشود ولی با mx2 شی در (6,0,0) سه برابر بزرگتر دیده میشود.

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

    =====

    متد XNA.Vector3.Transform جهت اعمال یک ماتریس روی یک بردار یا نقطه تکی
    به عنوان نمونه جهت اعمال یک ماتریس به یک بردار میتوانید از متد XNA.Vector3.Transform استفاده کنید:
    کد:
    کد:
    //C#‎.Net
    XNA.Matrix mx = XNA.Matrix.CreateRotationX(XNA.MathHelper.PiOver4);
    XNA.Vector3 v1 = new XNA.Vector3( ... );
    XNA.Vector3 v2 = XNA.Vector3.Transform(v1, mx);
    
    'VB.Net
    Dim mx As XNA.Matrix mx = XNA.Matrix.CreateRotationX(XNA.MathHelper.PiOver4)
    Dim v1 As XNA.Vector3 = New XNA.Vector3( ... )
    Dim v2 As XNA.Vector3 = XNA.Vector3.Transform(v1, mx)
    کد فوق بردار v1 را 45 درجه حول محور X چرخانده و حاصل را در v2 قرار میدهد.

    ==============

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

    شخصاً به دوستان پیشنهاد میکنم سعی کنند هندسه سه بعدی خود را قوی کنند تا در اعمال دستورات و چیزهایی که میخواهند در صحنه بازی مشکل نداشته باشند و دوربین دور سرشان نچرخد!

    ==============

    با توجه به درخواست برخی دوستان (در یک تالار دیگر) فعلاً ghnet.xna.dll به پک معرفی شده در تاپیک اول اضافه شد.
    http://support.h02.ir/fwlink/?LinkId=1005808167

    یک سمپل ساده از امکانات دو بعدی ghnet.xna هم به همراه نسخه exe به پک اضافه شد.

صفحه 2 از 2 اولیناولین 12

برچسب برای این موضوع

مجوز های ارسال و ویرایش

  • شما نمی توانید موضوع جدید ارسال کنید
  • شما نمی توانید به پست ها پاسخ دهید
  • شما نمی توانید فایل پیوست ضمیمه کنید
  • شما نمی توانید پست های خود را ویرایش کنید
  •