500 likes | 776 Views
آشنايي با OpenGL. برنامه نويسي سه بعدي با استفاده از OpenGL دلفي. زهرا علیدوست. چکیده. مقدمه انواع کتابخانه های برنامه نویسی سه بعدی. OpenGL چيست ؟ OpenGL چگونه کار میکند ؟ كتابخانه هاي كمكي در OpenGL . انواع داده ها در OpenGl . ساختار توابع استفاده شده در OpenGl .
E N D
آشنايي با OpenGL برنامه نويسي سه بعديبا استفاده از OpenGLدلفي زهرا علیدوست
چکیده • مقدمه • انواع کتابخانه های برنامه نویسی سه بعدی. • OpenGLچيست ؟ • OpenGL چگونه کار میکند؟ • كتابخانه هاي كمكي در OpenGL. • انواع داده ها در OpenGl. • ساختار توابع استفاده شده در OpenGl. • خطاها در OpenGL. • ساختار برنامه در OpenGl.
مقدمه openglاستانداردي با كيفيت بالا براي ساخت برنامه هاي سه بعدی صنعتي مي باشد .براي مثال اكثر برنامه هاي رياضي معروف مانندMathematica ، Matlab و برنامه هاي صنعتي مانند Working model 3d ، ANSYSو امثال اينها از اين تكنولوژي قوي كهويرايش هاي ديگري نيز تحت سيستم عامل هاي گوناگوني دارد ، استفاده مي كنند.
كتابخانه های استاندارد برنامه نويسي3D دو نوع كتابخانه استاندارد برنامه نويسي3D تحت Win32 وجود دارد: 1- Direct-3D Immediate Mode 2- OpenGL
Open GL چرا ؟
مقایسه Open GL و ِDirect-x • طراحي و سادگي استفاده ازAPI موجود در Open GL • تولید کد ساده و خوانا • اختصاص ندادن زمان زیاد • D3D سختي زيادي را به برنامه نويسان تحميل مي كند • در بسياري از موارد تنها يك خط از كد GL معادل يك نيم صفحه كد D3D مي باشد .
مقایسه Open GL و ِDirect-x GL با توابع سروكار دارد و با فراخواني يك به يك توابع مي توان به نتيجه نهايي دست يافت . glBegin (GL_TRIANGLES); glVertex (0,0,0); glVertex (1,1,0); glVertex (2,0,0); glEnd ();
مقایسه Open GL و ِDirect-x : D3D كد معادل در (psuedo code, and incomplete) v = &buffer.vertexes[0]; v->x = 0; v->y = 0; v->z = 0; v++; v->x = 1; v->y = 1; v->z = 0; v++; v->x = 2; v->y = 0; v->z = 0; c = &buffer.commands; c->operation = DRAW_TRIANGLE; c->vertexes[0] = 0; c->vertexes[1] = 1; c->vertexes[2] = 2; IssueExecuteBuffer (buffer);
چيست ؟OpenGL OpenGL دقیقا به عنوان یک "رابط نرم افزاری برای سخت افزار گرافیکی" تعریف شده است. OpenGL در ماهیت خود یک کتابخانه مدل سازی و گرافیک سه بعدی میباشد که بسیار سریع و قابل انتقال است. با استفاده از OpenGL شما میتوانید تصاویر سه بعدی زیبا و جذابی طراحی کنید. بزرگترین فایده استفاده از OpenGL اینست که فوق العاده از یک ردیاب نور (ray tracer ) سریعتر است.
OpenGL برای رسیدن به دو هدف ارائه شد • مخی کردن پیچیدگی های ارتباط با شتابدهنده های سه بعدی ، بوسیله ی ارائه ی APIهایی یکسان و واحد. • مخفی کردن امکانات پلتفرم های سخت افزاری ، بوسیله ی مجموعه ای از امکانات مشخص که همواره می توان اطمینان داشت که پشتیبانیمی شوند ( حتی با شبیه سازی نرم افزاری آنها)
OpenGL چگونه کار میکند OpenGL بیشتر از آنکه یک API گرافیکی توصیفی باشد حالت رویه ای دارد. بجای توصیف صحنه و اینکه صحنه چگونه باید ظاهر شود برنامه نویس مراحل لازم را برای دست یافتن به نمایش معین یا یک افکت را تعیین میکند. این مراحل باعث فراخوانی دستورات زیادی از OpenGL میشود. این فرامین برای رسم اشکال ابتدایی گرافیکی مانند خط و نقطه و چندضلعی در صحنه سه بعدی استفاده میشوند.
كتابخانه هاي كمكي و واسط هاي OpenGl • AGL, GLX, WGL • GLU (OpenGL Utility Library) • GLUT (OpenGL Utility Toolkit)
انواع داده ها در OpenGl برای اینکه انتقال کدهای نوشته شده در OpenGL به راحتی از یک پلتفرم به پلتفرم دیگر قابل انتقال باشند OpenGL انواع داده مخصوص به خودش را تعریف کرده است. هر محیط برنامه نویسی یا کامپایلری بهر حال قواعد خاصی برای اندازه و نوع حافظه متغیر های مختلف سی "C" دارد.
قواعد نامگذاری توابع در OpenGL تمام توابع OpenGL قالب زیر را دارند : <Library><Root><Optional><Optional>
خطاها در OpenGL واضح است که در هر پروژه ای شما میخواهید که برنامه ای قوی و با تربیت بنویسید که بصورت مودبانه به کاربرانش پاسخ دهد و مقداری هم انعطاف پذیری داشته باشد. برنامه های گرافیکی هم که از OpenGL استفاده میکنند از این قاعده مستثنی نیستند. اگر شما میخواهید که برنامه هایتان بطور روان اجرا شوند شما باید خطاها و رویداد های غیر مترقبه را همیشه مد نظر قرار دهید.
خطاها در OpenGL هنگامی که اتفاقات بدی برای کدهای خوب روی میدهند : OpenGL بطور ذاتی از مجموعه ای از شش پرچم حمایت میکند که هر پرچم یک نوع خاص از خطا را نشان میدهد. هر زمان که یکی از این خطاها اتفاق بیفتد پرچم متناظر با آن خطا برقرار میشود. برای اینکه بفهمیم آیاهیچ کدام از این پرچم ها برقرارند یا نه این تابع را صدا میزنیم : glGetError:Glenum glGetError(void);
خطاها در OpenGL شما همچنین میتوانید از تابع دیگری در کتابخانه GLU استفاده کنید که gluErrorString نام دارد تا رشته ای دریافت کنید که پرچم خطا را شرح میدهد. nst GLubyte* gluErrorString(GLenumerrorCode);
برنامه نويسي سه بعديبا استفاده از OpenGLدلفي
تعيير اندازي پنجره نمايش GLvoid ReSizeGLScene(GLsizei width, GLsizei height) { if (height==0) { height=1; } glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }
تعريف رنگ، عمق و ويژگي هاي پنجره نمايش int InitGL(GLvoid) { glShadeModel(GL_SMOOTH); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); return TRUE; }
تابع رسم اجسام int DrawGLScene(GLvoid) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); return TRUE; }
ايجاد و حذف پنجره نمايش • تايع ايجاد پنجره رسم • BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag) • تابع حذف پنجره رسم • GLvoid KillGLWindow(GLvoid)
نشان دادن يك نقطه در صفحه int DrawGLScene(GLvoid) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(-1.5f,0.0f,-6.0f); glBegin(GL_POINTS); glVertex3f( 0.0f, -2.47f, 0.0f); glVertex3f(0.0f,0.0f, 0.0f); glVertex3f( 0.0f, 0.0f, 5.0f); glEnd(); return TRUE; }
glTranslatef(-1.5f,0.0f,-6.0f); glVertex3f(0.0f,0.0f, 0.0f); glVertex3f( 2.0f, 0.0f, -12.0f); glVertex3f( 2.0f, 0.0f, 5.0f); glVertex3f( 2.0f, 0.0f, 0.0f); glVertex3f( 0.0f, -1.47f, 0.0f);
glTranslatef(-3.0f,0.0f,-6.0f); glVertex3f(0.0f,0.0f, 0.0f); glVertex3f( 0.0f, 0.0f, 5.0f); glVertex3f( 0.0f, -2.47f, 0.0f);
رسم مثلث int DrawGLScene(GLvoid) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f,0.0f,-6.0f); glBegin(GL_TRIANGLES); glVertex3f( 0.0f, 1.0f, 1.0f); glVertex3f(-1.0f,-1.0f, 1.0f); glVertex3f( 1.0f,-1.0f, 1.0f); glEnd(); return TRUE; } نشان مي دهد كه رئوس داخل Begin تشكيل يك مثلث را خواهند داد.
رسم چهار ضلعی int DrawGLScene(GLvoid){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f,0.0f,-6.0f); glBegin(GL_QUADS); glVertex3f(-1.0f, 1.0f, 0.0f); // Top Left glVertex3f( 1.0f, 1.0f, 0.0f); // Top Right glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left glEnd(); return TRUE; } نشان مي دهد كه رئوس داخل Begin تشكيل يك چهار ضلعی را خواهند داد.
رنگ آميزي براي رنگ آميزي يك شکل دو روش وجود دارد : 1- روش اول :smooth glTranslatef(-1.5f,0.0f,-6.0f); glBegin(GL_TRIANGLES); glColor3f(4.0f,0.0f,0.0f); glVertex3f( 0.0f, 1.0f, 0.0f); glColor3f(0.0f,1.0f,0.0f); glVertex3f(-1.0f,-1.0f, 0.0f); glColor3f(5.0f,0.0f,1.0f); glVertex3f( 1.0f,-1.0f, 0.0f); glEnd(); براي هر راس يكبار رنگ دهي مي كنيم.
رنگ آميزي 1- روش دوم :flat تنها يكبار رنگ دهي مي كنيم. glTranslatef(3.0f,0.0f,0.0f); glColor3f(0.5f,0.5f,1.0f); glBegin(GL_QUADS); glVertex3f(-1.0f, 1.0f, 0.0f);// Top Left glVertex3f( 1.0f, 1.0f, 0.0f); // Top Right glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left glEnd();
تابع دوران • glRotatef(Angle,Xvector,Yvector,Zvector) • اين تابع با گرفتن 4 آرگمان دوران به شكل اعمال مي نمايد. • Angle: ميزان زاويه گردش شكل • Xvector: ميزان دوران در راستاي محور X • Yvector: ميزان دوران در راستاي محور Y • Zvector: ميزان دوران در راستاي محور Z
محل قرار گيري تابع دوران int DrawGLScene(GLvoid) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(-1.5f,0.0f,-6.0f); glRotatef(rtri,0.0f,1.0f,0.0f); glBegin(GL_TRIANGLES); glEnd(); rtri+=0.2f; rquad-=0.15f; return TRUE; }
رسم اشكال 3D • براي رسم اشكال سه بعدي تنها كافي است كه چند نتقطه جديد را براي بعد هاي ديگر شكل خود را اضافه نماييد. • در اينجا يك نمونه كد آورده مي شود كه به مثلث و مربع مثال قبل يك بعد ديگر اضافه مي كند. • هر گوشه آنها را به رنگ خاصي در مي آورد.
رسم مثلث سه بعدي glBegin(GL_TRIANGLES); glColor3f(1.0f,0.0f,0.0f); // Red glVertex3f( 0.0f, 1.0f, 0.0f); // Top Of Triangle (Front) glColor3f(0.0f,1.0f,0.0f); // Green glVertex3f(-1.0f,-1.0f, 1.0f); // Left Of Triangle (Front) glColor3f(0.0f,0.0f,1.0f); // Blue glVertex3f( 1.0f,-1.0f, 1.0f); // Right Of Triangle (Front) glColor3f(1.0f,0.0f,0.0f); // Red glVertex3f( 0.0f, 1.0f, 0.0f); // Top Of Triangle (Right) glColor3f(0.0f,0.0f,1.0f); // Blue glVertex3f( 1.0f,-1.0f, 1.0f); // Left Of Triangle (Right) glColor3f(0.0f,1.0f,0.0f); // Green glVertex3f( 1.0f,-1.0f, -1.0f); // Right Of Triangle (Right)
رسم مثلث سه بعدي - 2 glColor3f(1.0f,0.0f,0.0f); // Red glVertex3f( 0.0f, 1.0f, 0.0f); // Top Of Triangle (Back) glColor3f(0.0f,1.0f,0.0f); // Green glVertex3f( 1.0f,-1.0f, -1.0f); // Left Of Triangle (Back) glColor3f(0.0f,0.0f,1.0f); // Blue glVertex3f(-1.0f,-1.0f, -1.0f); // Right Of Triangle (Back) glColor3f(1.0f,0.0f,0.0f); // Red glVertex3f( 0.0f, 1.0f, 0.0f); // Top Of Triangle (Left) glColor3f(0.0f,0.0f,1.0f); // Blue glVertex3f(-1.0f,-1.0f,-1.0f); // Left Of Triangle (Left) glColor3f(0.0f,1.0f,0.0f); // Green glVertex3f(-1.0f,-1.0f, 1.0f); // Right Of Triangle (Left) glEnd();
رسم مربع سه بعدي glBegin(GL_QUADS); glColor3f(0.0f,1.0f,0.0f); // Set The Color To Green glVertex3f( 1.0f, 1.0f,-1.0f); // Top Right Of The Quad (Top) glVertex3f(-1.0f, 1.0f,-1.0f); // Top Left Of The Quad (Top) glVertex3f(-1.0f, 1.0f, 1.0f); // Bottom Left Of The Quad (Top) glVertex3f( 1.0f, 1.0f, 1.0f); // Bottom Right Of The Quad (Top) glColor3f(1.0f,0.5f,0.0f); // Set The Color To Orange glVertex3f( 1.0f,-1.0f, 1.0f); // Top Right Of The Quad (Bottom) glVertex3f(-1.0f,-1.0f, 1.0f); // Top Left Of The Quad (Bottom) glVertex3f(-1.0f,-1.0f,-1.0f); // Bottom Left Of The Quad (Bottom) glVertex3f( 1.0f,-1.0f,-1.0f); // Bottom Right Of The Quad (Bottom)
رسم مربع سه بعدي - 2 glColor3f(1.0f,0.0f,0.0f); // Set The Color To Red glVertex3f( 1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Front) glVertex3f(-1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Front) glVertex3f(-1.0f,-1.0f, 1.0f); // Bottom Left Of The Quad (Front) glVertex3f( 1.0f,-1.0f, 1.0f); // Bottom Right Of The Quad (Front) glColor3f(1.0f,1.0f,0.0f); // Set The Color To Yellow glVertex3f( 1.0f,-1.0f,-1.0f); // Bottom Left Of The Quad (Back) glVertex3f(-1.0f,-1.0f,-1.0f); // Bottom Right Of The Quad (Back) glVertex3f(-1.0f, 1.0f,-1.0f); // Top Right Of The Quad (Back) glVertex3f( 1.0f, 1.0f,-1.0f); // Top Left Of The Quad (Back)
رسم مربع سه بعدي - 3 glColor3f(0.0f,0.0f,1.0f); // Set The Color To Blue glVertex3f(-1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Left) glVertex3f(-1.0f, 1.0f,-1.0f); // Top Left Of The Quad (Left) glVertex3f(-1.0f,-1.0f,-1.0f); // Bottom Left Of The Quad (Left) glVertex3f(-1.0f,-1.0f, 1.0f); // Bottom Right Of The Quad (Left) glColor3f(1.0f,0.0f,1.0f); // Set The Color To Violet glVertex3f( 1.0f, 1.0f,-1.0f); // Top Right Of The Quad (Right) glVertex3f( 1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Right) glVertex3f( 1.0f,-1.0f, 1.0f); // Bottom Left Of The Quad (Right) glVertex3f( 1.0f,-1.0f,-1.0f); // Bottom Right Of The Quad (Right) glEnd();