آموزش OpenTK بخش دوم - قسمت دوم

به نام خدا

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

در این بخش ما به رسم مارپیچ خواهیم پرداخت . مار پیچ یا Sprial امروزه کاربرد وسیعی در صنعت دارد.

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

عکس زیر است که جهان کنونی را نشان میدهد :

شکل اسپایرال یا مارپیچ به صورت زیر و هم به صورت بالا است :

و معادله مارپیچ به صورت زیر است :

که با تغییر theta، شعاع هم متغیر است. در اصل مارپیچ یک دایره با شعاع متغیر است .

در اصل فاصله بین هر دور ، مقدار متغیر a است . (توجه : معادله فوق به فرم قطبی است. ) برنامه زیر 

مارپیچ را به تعداد دورهای دلخواه رسم میکند ، در خط زیر :

r = r + (1.0f/max_turns)

قصد بر این بوده که در دور آخر ، مقدار شعاع یک شود ، یعنی شعاع بین 0 تا 1 تغییر نماید.

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

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


دانلود سورس کد + فایل اجرایی

آموزش Open Tk بخش دوم - قسمت اول

به نام خدا

چنانچه آموزش قسمت اول را ندیده اید ، اینجا را کلیک کنید.

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

امکان پذیر است . مثلا برای رسم دایره ،طبق یک معادله بیضیگون با a و c برابر یک داریم :

معادله فوق ، معادله یک دایره است که کافیست با استفاده از کد زیر آنرا رسم نماییم :

GL.Vertex2(x,y)

اما راحت تر این است که ما از مختصات قطبی برای رسم دایره استفاده نماییم :

طبق شکل فوق ، اگر زاویه تتا از 0 تا 360 درجه یا از 0 تا 6.28 رادیان تغییر نماید ، و r شعاع باشد ، ما یک

دایره خواهیم داشت که مختصات x و y یک نقطه روی آن در بالا نشان داده شده است ، یعنی :

x=rcos theta

y=rsin theta

برنامه زیر ، چنین دایره هایی را رسم می کند که مقدار r آنها متغیر است :

نکته : در سی شارپ در تابعهای زیر ، ورودی باید بر حسب رادیان باشد :

Math.Sin(theta)

Math.Cos(theta)

به همین دلیل ما ، درجه را در عدد پی ضرب می کنیم و بر 180 تقسیم میکنیم تا به رادیان تبدیل گردد :

rad = degree * 3.1415 / 180

دانلود سورس کد و فایل اجرایی

آموزش OpenTK - بخش اول

به نام خدا

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

ما به آموزش OpenTK برای ایجاد شبیه سازی و بازی های سه بعدی و دو بعدی با سی شارپ خواهیم پرداخت.

این وبلاگ افتخار این را دارد که اولین وبلاگیست که این آموزش را به شما کاربران محترم ارائه میکند.

---

مقدمه :

کتابخانه OpenGL برای ++C کاربرد خیلی زیادی برای کارهای گرافیکی دارد.وقتی سی شارپ خلق شد ،

یک سری کتابخانه مثلا Managed DirectX برای کارهای سنگین گرافیکی با سی شارپ تعبیه شدند.

مایکروسافت بنا بر دلایل فنی تصمیم به حذف Managed DirectX گرفت.خوب از آنجایی که کاربران دستشان

تو حنا مانده بود ، فرصت خوبی برای گروه ها و شرکت های کوچک بود که یک کتابخانه گرافیکی برای سی

شارپ بنویسند. پس Slim DX برای سی شارپ بوجود آمد و کاربرانی را پذیرایی کرد.

اما بحث وقتی جالب شد که مایکروسافت رسما به دلیل ذات کامپایلر سی شارپ ، گفت از دایرکت ایکس

استفاده نکنید.

خوب یک کتابخانه مانند Tao بکار آمد که اوصول گرافیکی را برای سی شارپ محقق کرد.حال ما با OpenTK

که بر اساس Tao است کار میکنیم که OpenTk همان OpenGL است اما برای سی شارپ.

دانلود Open TK

برای دانلود OpenTK روی دکمه زیر کلیک نمایید. چنانچه لینک خراب بود ، اینجا را کلیک کنید.

وقتی فایل را دانلود کردید ، یک پروژه Console Application با سی شارپ بسازید و فایل OpenTK.dll

را از مسیر Binaries/OpenTK/Release به پروژه Add Reference کنید.

از آنجایی که این کتابخانه به System.Drawing نیاز دارد ، System.Drawing را نیز Add Reference کنید.

عکس فوق ، عکس یک برنامه ای است که من با Open TK نوشته ام. در آخر سورس کدش را برای دانلود

قرار داده ام یا می توانید آن را از اینجا دانلود کنید.

کلاس اصلی برنامه که در آن تابع Main است باید و باید از کلاس GameWindow به ارث ببرد.

public MyGame():base(200,200,GraphicsMode.Default,"SAP")
{
}

کد فوق مربوط به Constructor کلاس است که یک پنجره به ابعاد 200 در 200 با نام SAP می سازد.

حال در کد زیر ، ما چارچوب مختصات سه بعدی خود را تعیین میکنیم.(این کد ها فقط یکبار در آغاز برنامه اجرا

میشوند .)

protected override void OnLoad(EventArgs e)
{
 base.OnLoad(e);
 GL.Ortho(-2, 2, -2, 2, -2, 2);
}

خوب تابع Ortho مانند OpenGL است که به ترتیب x- و x+ و y- و y+ و z- و z+ را مقدار دهی میکند.

حال ما میخواهیم مثلث را رسم کنیم . اما قبل رسم باید صفحه Clear شود و نقاشیمان را روی آن انجام دهیم.

درست مثل اینکه وقتی شما قصد نقاشی را دارید ، چه میکنید ، از یک برگه سفید استفاده میکند. پس

ما در چند خط زیر می گوییم که می خواهیم از یک برگه سیاه استفاده کنیم :

protected override void OnRenderFrame(FrameEventArgs e)
{
 base.OnRenderFrame(e);
 GL.ClearColor(System.Drawing.Color.Black);
 GL.Clear(ClearBufferMask.ColorBufferBit);

خوب این کار ها را ما در تابع RenderFrame انجام میدهیم ، این تابع در هر سیکل CPU  چندین بار اجرا

میشود تا ما مثلث را ساکن ببینیم.

ما چند نوع کاغذ داریم ؟ (معمولی ، کانسون ، پاستیلی ، شفاف ، ...) خوب چرا تابع Clear چند نوع Clear

نداشته باشد. ما با انتخاب گزینه ColorBufferBit توانسته ایم کاغذ معمولی را برگزییم.

GL.Begin(BeginMode.Polygon);
 GL.Color3(Color.Red);
 GL.Vertex3(-1.0f,0.0f,0.0f);
 GL.Color3(Color.Blue);
 GL.Vertex3(0.0f, 1.0f, 0.0f);
 GL.Color3(Color.Green);
 GL.Vertex3(1.0f, 0.0f, 0.0f);
 GL.End();
 SwapBuffers();
}

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

با توابع GL.Vertex3 ما مختصات نقاط را و با توابع GL.Color3 ما رنگ هر راس را تعیین کردیم.

وقتی نقاشی را تمام کردیم ، با SwapBuffers ما Back Buffer را با Primary Buffer عوض میکنیم تا نتیجه

دیده شود.

پایان آموزش اول

دانلود سورس کد + فایل اجرایی