PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : آموزشOPenGl



آبجی
8th March 2010, 04:45 PM
مقدمه:

استقلال از وابستگي به هر گونه پلتفرم خاص :



OpenGL يک API پيشرفته و قدرتمند براي طراحي گرافيک سه بعدي ميباشد با بيش از 300 تابع و دستور که همه چيز را از نشاندن رنگ ماده بر روي شئ و خصوصيات انعکاس تا چرخش و دگرگوني هاي پيچيده مختصاتي را پوشش ميدهد. ممکن است که شما تعجب کرده باشيد که چگونه OpenGL حتي يک تابع براي امور پنجره و يا مديريت صفحه ندارد. بعلاوه هيچ تابعي براي دريافت ورودي صفحه کليد يا فعل و انفعالات ماوس ندارد. بهر حال يکي از اهداف اوليه تيم طراح OpenGL استقلال آن از پلتفرم بود. شما به طرق مختلفي تحت سيستم عامل هاي مختلف براي برنامه خود پنجره ميسازيد.

اگر OpenGL دستوري براي باز کردن يک پنجره داشت آيا شما از آن استفاده ميکرديد يا شما دوست داشتيد تا از توابع توکار API سيستم عامل خود کمک بگيريد.

موضوع ديگر در مورد پلتفرم روش رسيدگي به کيبورد و رخدادهاي ورودي ماوس تحت سيستم عامل هاي مختلف است. اگر تمام محيط ها شيوه رسيدگي مشابهي براي اين رخدادها داشتند ما تنها يک محيط داشتيم تا در باره اش فکر کنيم و احتياجي به يک API باز نداشتيم. بهر حال موضوع ما اين نيست و ممکن است اين در طول عمرمان رخ ندهد. پس ارزش مستقل از پلتفرم بودن OpenGL در همين است که تابعي براي سيستم عامل و GUI ندارد.



استفاده از GLUT :

در آغاز تنها کتابخانه AUX يعني کتابخانه کمکي OpenGL که مخفف OpenGL Auxiliary Library ميباشد. اين کتابخانه به منظور تسهيل يادگيري و نوشتن برنامه هاي OpenGL طراحي شده بود. بدون اينکه برنامه نويس با جزئيات محيطي که در آن برنامه مينويسد گيج بشود حالا چه سيستم عامل يونيکس چه لينوکس يا مکينتاش و يا ويندوز. شما هنگام استفاده از AUX کد نهايي را نمي نوشتيد. آن به عنوان يک اسکلت مقدماتي براي تست ايده هاي شما بود. نبودن خصوصيات مقدماتي GUI در اين کتابخانه استفاده از آن را براي ساخت برنامه هاي حرفه اي محدود ميکند.

چندين سال پيش بيشتر برنامه هاي نمونه OpenGL روي وب با استفاده از کتابخانه AUX نوشته شده بودند. پياده سازي تحت ويندوز اين کتابخانه پر از ايراد بود و باعث ميشد برنامه بارها Crash کند. نبودن هيچ خصوصيت GUI يکي از دلايلي بود که آن را در عصري که همه برنامه ها بر اساس GUI طراحي ميشدند بي مصرف ساخت.

در نهايت کتابخانه AUX با کتابخانه GLUT تعويض شد. GLUT کتابخانه اي است مستقل از پلتفرم براي طراحي برنامه هاي نمونه و نمايشي. GLUT مخفف OpenGL Utility Toolkit ميباشد.(لطفا با کتابخانه GLU اشتباه نگيريد). مارک کيلگارد زماني که در شرکت SGI کار ميکرد GLUT را به منظور از دور خارج کردن AUX با يک کتابخانه بهتر و لايقتر نوشت. کتابخانه GLUT رايگان ميباشد. شما ميتوانيد آخرين ورژن آن را از اين آدرس دانلود کنيد.





http://www.xmission.com/~nate/glut.html (http://www.xmission.com/%7Enate/glut.html)







http://www.sun.com/software/graphics/opengl/glut/download.xml





در موقع دانلود مواظب باشيد که نگارش مخصوص ويندوز را دانلود نماييد. ما در بيشتر آموزشهايي که من از کتاب OpenGL SuperBible 3rd Edition ترجمه کرده ام از GLUT استفاده ميکنيم.

اين کار براي ما دو هدف را بر آورده ميکند اول اينکه افراد بيشتري ميتوانند از آموزشهاي ما استفاده کنند و نه فقط برنامه نويسان ويندوز. با يک تلاش مختصر کاربران سيستم هاي لينوکس و مکينتاش ميتوانند GLUT را در محيط برنامه نويسي شان آماده و تنظيم کنند و با ما آموزشهاي اين وبلاگ را دنبال کنند. اما دليل دومي که ما از کتابخانه GLUT استفاده ميکنيم اينست که استفاده از اين کتابخانه هرگونه نياز به دانستن برنامه نويسي GUI تحت پلتفرم خاص را از بين ميبرد و ما ميتوانيم همه حواسمان را به قابليتها و يادگيري OpenGL معطوف کنيم.

بعد ها و سر فرصت ما ميتوانيم روش ايجاد برنامه با توابع API ويندوز و استفاده از openGL را مي آموزيم. فعلا ما نياز داريم که تمام وقت خود را روي يادگيري قابليتهاي OpenGL صرف کنيم. البته ما نميتوانيم هميشه از GLUT استفاده کنيم چون آن به درد برنامه هاي بزرگ و واقعي نميخورد. اما نياز ما را در طي آموزشهايمان به خوبي برطرف ميکند. همانطور که قبلا نيز گفتم بعدها روش ايجاد و طراحي و مديريت پنجره برنامه را با استفاده از توابع API ويندوز فرا خواهيم گرفت. و اين که چطور برنامه هاي OpenGL خود را با کمک توابع API ويندوز بنويسيم.


دانلود:



http://www.rogepost.com/dn/z4cu/OpenGL.rar (http://www.rogepost.com/dn/z4cu/OpenGL.rar)

آبجی
8th March 2010, 04:51 PM
Chapter3


طراحي در فضا : اشکال اوليه هندسي و بافرها





آنچه در اين فصل خواهيد آموخت:




کاري که تابع انجام ميدهد





تابع
کشيدن نقاط و خطوط و اشکال



GlBegin/glEnd/glVertex
اشکال را به صورت سيمي
wire frameيا جامد
solidدر مي آورد




GlPolygonMode
اندازه نقاط را براي طراحي معين ميکند



GlPointSize
پهناي خط کشيده شده را مشخص ميکند



GlLineWidth
سطوح مخفي را پاک ميکند



GlCullFace/glClear
الگويي را براي خطوط شکسته معين ميکند



GlLineStipple
الگوي پر کردن چند ضلعي ها
polygon را معين ميکند



GlPolygonStipple
استفاده از جعبه تقسيم
scissor در openGL



GlScissor
استفاده از بافر براي الگو برداري

GlStencilFunc/glStencilMask/glStencilOp




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

تعريف پيکسل: پيکسل کوچک ترين جزء در مانيتور شما و در سيستم رنگ بندي است و هر پيکسل ميتواند هر رنگي داشته باشد.

شما ميتوانيد از نرم افزارهاي سه بعدي براي کشيدن اشکال مورد نظرتان استفاده کنيد. اما در OpenGL کار مقداري فرق ميکند. درOpenGL شما نبايد نگران مختصات صفحه نمايش يا پيکسل هاي آن باشيد بلکه بايد حواستان به موقعيت مختصات ديدتان باشد. کارهايي مانند کشيدن خطوط و اشکال و برپايي صحنه سه بعدي مورد نظر و بالاخره تبديل آن به صحنه دو بعدي را خود OpenGL انجام ميدهد.
اين بخش و بخش بعد به امور پايه در API هايي مانند OpenGL ميپردازد. در اين بخش در مورد اينکه چطور تصاوير سه بعدي در مانيتور شما به صورت دو بعدي در مي آيند صحبت ميکنيم.
بعلاوه چگونگي تغيير شکل جسم( چرخش و جابجايي و تغيير اندازه ) را خواهيم آموخت.
Vertex: نقطه سه بعدي
براي تعيين يک نقطه براي شروع کار طراحي از تابع glVertex استفاده ميکنيم که بيشترين کار برد را در OpenGLدارد. ورتکس سطح پايين ترين جز در چند ضلعي هاي پايه ي OpenGL است. ورتکس نقطه اي در فضاي سه بعدي است.
تابع زير نقطه اي را در فضاي سه بعدي براي ما ميکشد. اين تابع ميتواند تا چهار آرگومان را قبول کند که در درسهاي بعد درباره آنها بيشتر صحبت ميکنيم.



glVertex3f(50.0f, 50.0f, 0.0f);
تابع بالا نقطه اي را در x=50 , y=50 , z=0 براي ما ميکشد.








اين تابع ميتواند از دو تا چهار آرگومان را قبول کند که بسته به شرايط ميتوانيد از آنها استفاده کنيد. براي مثال نقطه بالا را ميتوان به صورت زير هم تعريف کرد:



glVertex2f(50.0f, 50.0f);
در اين حالت z همواره صفر خواهد بود .

گفتم که اين تابع چهار آرگومان را ميپذيرد (glVertex4) و آرگومان چهارم که پهنا را تعيين ميکند در صورت مشخص نشدن همواره 1 فرض ميشود . از آرگومان چهارم يا همان پهنا ميتوان براي تغيير اندازه (scale) استفاده کرد در بخش هاي بعد توضيح بيشتري در اين مورد خواهيم داد.

براي شروع کار ما تعريف هندسي vertex را مي آوريم:
در هندسه بر خلاف دنياي cyber که vertex را نقطه اي در فضا در نظر مي گيريدvertex نقطه برخورد دو خط يا منحني تعريف ميشود . و همين تعريف پايه اشکال اوليه (primitives ) را تشکيل ميدهد .


Primitive: اشکال اوليه در حقيقت پايه و شرحي هستند بر اجسام بزرگ تر و به بيان ديگر مجموعه اي از vertex ها که به شکل خاصي بر روي صفحه نمايش نشان داده شده اند.

در OpenGL 10 نوع پايه از اين اشکال وجود دارند. از يک vertex ساده شروع و تا يک n ضلعي بسته ادامه دارند.يک راه براي کشيدن اين اشکال استفاده از دو تابع glBegin و glEnd ميباشد.

با glBegin به برنامه ميگوييد کار دسته بندي و شرح يک سري از vertex ها را براي رسم يک شکل شروع کند و با استفاده از glEnd کار تعريف اين راس ها (vertex ) را به پايان ميرسانيد.

براي شروع نقطه اي را در فضا رسم ميکنيم:

glBegin(GL_POINTS); // Select points as the primitive
glVertex3f(0.0f, 0.0f, 0.0f); // Specify a point glVertex3f(50.0f, 50.0f, 50.0f); // Specify another point glEnd(); // Done drawing points
آرگوماني که در تابع glBegin به کار رفته يعني GL_POINT به OpenGL ميگويد که راس هاي(vertex)
به کار رفته در اين تابع براي نمايش يک نقطه به کار ميروند. بدنه تابع بالا دو نقطه را با مختصاتشان
مشخص ميکندو هر دو رسم ميشوند.
مثالي که زديم نکته مهمي را در رابطه با دو تابع glBegin و glEnd براي ما مشخص ميکند. اينکه شما
ميتوانيد به تعداد دلخواه از اشکال پايه را در بين اين دو تابع ايجاد کنيد به شرطي که همه اين
اشکال (primitive) از يک نوع باشند.مثلا در تابع بالا ميتوانستيم براي رسم نقطه دوم يک بار ديگر
از glBegin و glEnd استفاده کنيم اما از آنجا که ما قصد داشتيم دو نقطه را رسم کنيم و همانطور که
بديهي است دو نقطه از يک جنس هستند هر دو را درون يک تابع glBegin/glEnd رسم کرديم. اما اگر
ميخواستيم بر فرض مثال دايره اي رسم کنيم بايد دوباره از تابع glBegin/glEnd استفاده ميکرديم.
دقت کنيد که اگر تابع بالا را دو قسمتي مينوشتيم سرعت کار پايين مي آمد.


glBegin(GL_POINTS); // Specify point drawing glVertex3f(0.0f, 0.0f, 0.0f); //thisglEnd(); //this glBegin(GL_POINTS); // Specify another point glVertex3f(50.0f, 50.0f, 50.0f); //thisglEnd(); //this
پس اين نکته را به خاطر داشته باشيد که براي کشيدن تعداد دلخواه شکل پايه به شرطي که همگي از
يک نوع باشند ميتوان از يک تابع glBegin/glEndاستفاده کرد.

حالا ميرسيم به بخش کد نويسي.براي شروع قطعه کدي در زير آمده است.توضيح اينکه با کد زير ما
نقاطي رو در فضاي سه بعدي رسم ميکنيم. بعد با استفاده از توابع مثلثاتي اونا رو در مسير z و به
صورت مارپيچ به بالا حرکت ميديم.
دقت کنيد که از تابع setupRC براي تعيين رنگ نقاط به رنگ سبز استفاده کرده ايم.



// Define a constant for the value of PI

#define GL_PI 3.1415f



// This function does any needed initialization on the rendering

// context.

void SetupRC()

{

// Black background

glClearColor(0.0f, 0.0f, 0.0f, 1.0f );



// Set drawing color to green

glColor3f(0.0f, 1.0f, 0.0f);

}





// Called to draw scene

void RenderScene(void)

{

GLfloat x,y,z,angle; // Storage for coordinates and angles



// Clear the window with current clearing color

glClear(GL_COLOR_BUFFER_BIT);



// Save matrix state and do the rotation

glPushMatrix();

glRotatef(xRot, 1.0f, 0.0f, 0.0f);

glRotatef(yRot, 0.0f, 1.0f, 0.0f);



// Call only once for all remaining points

glBegin(GL_POINTS);



z = -50.0f;

for(angle = 0.0f; angle <= (2.0f*GL_PI)*3.0f; angle += 0.1f)

{

x = 50.0f*sin(angle);

y = 50.0f*cos(angle);



// Specify the point and move the Z value up a little

glVertex3f(x, y, z);

z += 0.5f;

}



// Done drawing points

glEnd();



// Restore transformations

glPopMatrix();



// Flush drawing commands

glFlush();

}
اين کد ها مقادير x و y را بر حسب درجه اي که سيستم محاسبه ميکند به ما برميگردانند.اين درجه بين
0 تا 360 متغير است.سپس سيستم با استفاده از مختصات x,y,z نقطه اي را رسم ميکند.

در انتها دستور z += 0.5f; ارتفاع را مقداري افزايش ميدهد. http://i7.tinypic.com/24pytqf.jpg فکر بقيه توابعي که در کد اصلي استفاده شده نباشيد.تمام انها را در دروس بعدي مورد مطالعه قرار ميدهيم. نکته:
اگر رياضيات دبيرستان را مطالعه کرده باشيد ميدانيد که شکل بالا نمايشگر صفحه مختصات است.همانطور که مشاهده ميکنيد خطي که ابتداي آن مرکز مختصات و انتهاي آن نقطه اي روي دايره است يک زاويه را تشکيل ميدهد.توابع sin و cos در حقيقت نمايان گر طول (x) و عرض (y) نقطه مورد نظر است. دقت کنيد که توابع sin() و cos() در زبان Cزاويه را بر حسب راديان محاسبه ميکنند. يک دايره 2pi راديان است.

استفاده از تمامی مطالب سایت تنها با ذکر منبع آن به نام سایت علمی نخبگان جوان و ذکر آدرس سایت مجاز است

استفاده از نام و برند نخبگان جوان به هر نحو توسط سایر سایت ها ممنوع بوده و پیگرد قانونی دارد