آشنايي با OpenGL

Preview:

DESCRIPTION

آشنايي با OpenGL. برنامه نويسي سه بعدي با استفاده از OpenGL دلفي. زهرا علیدوست. چکیده. مقدمه انواع کتابخانه های برنامه نویسی سه بعدی. OpenGL چيست ؟ OpenGL چگونه کار میکند ؟ كتابخانه هاي كمكي در OpenGL . انواع داده ها در OpenGl . ساختار توابع استفاده شده در OpenGl . - PowerPoint PPT Presentation

Citation preview

با آشناييOpenGL

بعدي سه نويسي با برنامهاز دلفي OpenGLاستفاده

علیدوست زهرا

چکیده

مقدمه. بعدی سه نویسی برنامه های کتابخانه انواع OpenGL چيست ؟OpenGL میکند کار ؟چگونه كتابخانه هاي كمكي درOpenGL. انواع داده ها درOpenGl. ساختار توابع استفاده شده درOpenGl. در .OpenGL خطاها ساختار برنامه درOpenGl.

opengl ساخت براي باال كيفيت با استاندارديبعد سه هاي مثال . ی برنامه براي باشد مي صنعتي

معروف رياضي هاي برنامه اكثر، Mathematicaمانند Matlab هاي و برنامه

مانن ، Working model 3dد صنعتي ANSYS وكه قوي تكنولوژي اين از اينها هاي امثال ويرايش

، دارد گوناگوني هاي عامل سيستم تحت نيز ديگريكنند مي .استفاده

مقدمه

نويسي برنامه استاندارد كتابخانه نوع 3D دو:Win32تحت دارد وجود

1- Direct-3D Immediate Mode2- OpenGL

برنامه های كتابخانه استاندارد3D نويسي

Open GLچر؟ا

از استفاده سادگي و موجود API طراحيOpen GLدر

خوانا و ساده کد تولید زیاد زمان ندادن اختصاصD3D نويسان برنامه به را زيادي سختي

كند مي تحميل كد از خط يك تنها موارد از بسياري GL در

كد صفحه نيم يك باشد . D3Dمعادل مي

Direct-xوِ Open GLمقایسه

GL به يك فراخواني با و دارد سروكار توابع بايافت دست نهايي نتيجه به توان مي توابع . يك

glBegin (GL_TRIANGLES);glVertex (0,0,0);glVertex (1,1,0);glVertex (2,0,0);glEnd ();

Direct-xوِ Open GLمقایسه

: 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);

Direct-xوِ Open GLمقایسه

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

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

. از استفاده با است انتقال قابل و سریعOpenGL و زیبا بعدی سه تصاویر میتوانید شما

. از استفاده فایده بزرگترین کنید طراحی جذابیOpenGL ردیاب یک از العاده فوق که اینست

است ) ray tracer (نور .سریعتر

؟ OpenGLچيست

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 خطاها

در OpenGL خطاها

بعدي سه نويسي با برنامهاز دلفي 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;

}

glVertex3f(0.0f,0.0f, 0.0f);

glVertex3f( 0.0f, -1.47f, 0.0f);

glVertex3f( 2.0f, 0.0f, 0.0f);

glTranslatef(-1.5f,0.0f,-6.0f);

glVertex3f( 2.0f, 0.0f, -12.0f);

glV

erte

x3f( 2

.0f, 0

.0f, 5

.0f);

glVertex3f(0.0f,0.0f, 0.0f);

glVertex3f( 0.0f, 0.0f, 5.0f);

glVertex3f( 0.0f, -2.47f, 0.0f);

glTranslatef(-3.0f,0.0f,-6.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 LeftglVertex3f( 1.0f, 1.0f, 0.0f); // Top RightglVertex3f( 1.0f,-1.0f, 0.0f); // Bottom RightglVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left

glEnd();return TRUE;

} نشان مي دهد كه رئوس داخل Begin تشكيل يك چهار ضلعی را

خواهند داد.

آميزي رنگبراي رنگ آميزي يك شکل دو روش وجود دارد :

- روش 1smootاول :

h

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 LeftglVertex3f( 1.0f, 1.0f, 0.0f); // Top RightglVertex3f( 1.0f,-1.0f, 0.0f); // Bottom RightglVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left

glEnd();

تنها يكبار رنگ دهي مي كنيم.

اشكال رسم شكل، دوران3D

دوران تابع

glRotatef(Angle,Xvector,Yvector,Zvector) آرگمان دوران به شكل 4اين تابع با گرفتن

اعمال مي نمايد.Angleميزان زاويه گردش شكل :Xvector ميزان دوران در راستاي محور :XYvector ميزان دوران در راستاي محور :YZvector ميزان دوران در راستاي محور :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); // RedglVertex3f( 0.0f, 1.0f, 0.0f); // Top Of Triangle (Front) glColor3f(0.0f,1.0f,0.0f); // GreenglVertex3f(-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 VioletglVertex3f( 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();

خروجي

Recommended