opengl برنامه نویسی گرافیکی با

27
OpenGL ا بی ک ی فرا گ ی س ی و ن ه م ا رب بA.M. Safaei ه گان ی ش خ ب ی! ست ه د داوب ام خ ه ب ن م! ت ف ه سه ل خ

Upload: enan

Post on 15-Jan-2016

193 views

Category:

Documents


5 download

DESCRIPTION

به نام خداوند هستی بخش یگانه. جلسه هفتم. OpenGL برنامه نویسی گرافیکی با. A.M. Safaei. جلسه هفتم. گرافیک کامپیوتری. مرور جلسه گذشته. رسم رئوس در OpenGL glVertex {234}( dfis )V( مختصات ) اختصاص رنگ ها در OpenGL (رنگ قلم) glColor {34}( bdfisubusui )V( رنگ مورد نظر ) - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: OpenGL برنامه نویسی گرافیکی با

OpenGLبرنامه نویسی گرافیکی با

A.M. Safaei

به نام خداوند هستی بخش یگانه

جلسه هفتم

Page 2: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

OpenGLرسم رئوس در •

• glVertex{234}(dfis)V(مختصات)

)رنگ قلم(OpenGLاختصاص رنگ ها در •

• glColor{34}(bdfisubusui)V(رنگ مورد نظر)

(GL_POINTSرسم نقطه )•

مرور جلسه گذشته

جلسه هفتم

glColor3f(1.0, 0.0,1.0);glBegin(GL_POINTS);glVertex2f(2.0,-0.5);glEnd;

Page 3: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

OpenGL :: (GL_LINES) رسم خط در •

(GL_LINESرسم پاره خط های جدا از هم ) 1.

(GL_LINE_STRIPرسم خطوط به هم پیوسته با دو سر انتهایی باز )2.

(GL_LINE_LOOPرسم خطوط به هم پیوسته با دو سر انتهایی به هم پیوسته )3.

OpenGL :: (GL_TRIANGLES) رسم مثلث در •

( GL_TRIANGLES مثلث های جدا از هم :: )1.

( GL_TRIANGLE_STRIP مثلث های دوبه دو مشترک در یک ضلع :: )2.

( GL_TRIANGLE_FAN مثلث های مشترک در یک راس واحد :: )3.

مرور جلسه گذشته

جلسه هفتم

Page 4: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

:: رسم چند ضلعی (GL_POLYGON)

glBegin(GL_POLYGON);

glVertex2f(-0.7, -0.4);

glVertex2f(-0.7, 0.4);

glVertex2f(-0.4, 0.7);

glVertex2f(0.4, 0.7);

glVertex2f(0.7, 0.4);

glVertex2f(0.7, -0.4);

glVertex2f(0.4, -0.7);

glVertex2f(-0.4, -0.7);

glEnd();

مثلث مشتق شده از چند ضلعی می باشد ولی برای رسم مثلث از

چند ضلعی استفاده نمی کنیم.

جلسه هفتم

Page 5: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

چند ضلعی ها بطور پیش فرض توپر رسم می شود، اما با

می توان آن را تغییر داد..glPolygonModeاستفاده از تابع

آرگومانی که به پارامترface ارسال می شود می تواند یکی از

مقادیر:

GL_BACK

GL_FRONT

GL_FRONT_AND_BACK باشد، این پارامترها مشخص کننده

بر چند ضلعی می باشد.modeنحوه تاثیر پارامتر

تابع glPolygonModeدر رسم چند ضلعی ها

void glPolygonMode(GLenum face, GLenum mode);

جلسه هفتم

Page 6: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

پارامترmode می تواند یکی از سه مقدار زیر را داشته باشد:

GL_LINE : تنها خطوط بجای نمایش توپر میشوند.

GL_POINT : نقاط ابتدا و انتهایی خطوط نمایشداده می شود.

GL_FILL : باعث نمایش توپر شکل به صورت پیشفرض می شود.

.در بخش سه بعدی بیشتر بحث خواهد شد

تابع glPolygonModeدر رسم چند ضلعی ها

void glPolygonMode(GLenum face, GLenum mode);

جلسه هفتم

Page 7: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

ضلعی را به صورت غیر توپر می بینید.8در مثال زیر یک

تابع glPolygonModeدر رسم چند ضلعی ها

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

glBegin(GL_POLYGON);

glVertex2f(-0.7, -0.4);

glVertex2f(-0.7, 0.4);

glVertex2f(-0.4, 0.7);

glVertex2f(0.4, 0.7);

glVertex2f(0.7, 0.4);

glVertex2f(0.7, -0.4);

glVertex2f(0.4, -0.7);

glVertex2f(-0.4, -0.7);

glEnd();

جلسه هفتم

Page 8: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

. با توجه به مختصات زیر می خواهیم یک لوزی تو پر رسم کنیم

تمرین

void myDisplay(void)

{

glClear(GL COLOR BUFFER BIT) ;

glColor3f(1.0, 0.0, 0.0);

glBegin(GL_POLYGON);

glVertex2f(0.90, 0.50);

glVertex2f(0.50, 0.90);

glVertex2f(0.10, 0.50);

glVertex2f(0.50, 0.10);

glEnd();

glutSwapBuffers() ;

}

(0.90, 0.50)

(0.50, 0.90)

(0.10, 0.50)

(0.50, 0.10)

جلسه هفتم

Page 9: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

ترتیب معرفی رئوس بایستی به صورت ساعتگرد و یا پاد ساعتگردباشد.

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

نکاتی در باره رسم چند ضلعی ها

glBegin(GL POLYGON);

glVertex2f(0.50, 0.10);

glVertex2f(0.10, 0.50);

glVertex2f(0.90, 0.50);

glVertex2f(0.50, 0.90);

glEnd();

جلسه هفتم

Page 10: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

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

را داشته باشد:

( سادهSimple.لبه های جند ضلعی متقاطع نباشد :)

( محدبConvex همه نقاط واقع بر روی خط اتصال بین دو راس : )

داخل چند ضلعی باشد.

( مسطحFlat.همه رئوس بر روی یک صفحه واقع شده باشند : )

( نکاتی در باره رسم چند ضلعی GL_POLYGON)

No convex polygonNo simple polygon

.مثلث ها همه شرایط فوق را دار می باشند

جلسه هفتم

Page 11: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

:برای رسم چهار ضلعی دو گزینه وجود دارد

چهارضلعی های جدا از هم(GL_QUADS)

( چهارضلعی های مشترک در یک ضلعGL_QUAD_STRIP)

:: رسم چهار ضلعی (GL_QUADS)

جلسه هفتم

Page 12: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

لLای قبلی عمLه هLد رویLدا از هم ماننLای جLلعی هLم چهارضLبرای رسبLرای هLر چهLار ضLلعی چهLار راس جداگانLه در نظLر می می کLنیم. گLیرم کLه می توانLد تشLکیل یLک مسLتطیل، مربLع ، لLوزی ، متLوازی

االضالع و یا هر چهار ضلعی دیگری را بنماید.

:: رسم چهار ضلعی های جدا از هم (GL_QUADS)

glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);glBegin(GL_QUADS);

glVertex2f(-0.8, 0);glVertex2f(-0.4, 0.4);glVertex2f(0.0, 0.0);glVertex2f(-0.4, -0.4);glVertex2f(0.9, 0.5);glVertex2f(0.2, 0.5);glVertex2f(0.1, 0.0);glVertex2f(0.8, 0.0);

glEnd(); .یک لوزی و یک متوازی االضالع جدا از هم

جلسه هفتم

Page 13: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

ارLدا چهLت ابتLافی اسLلع کLک ضLترک در یLای مشLلعی هLد ضLم چنLبرای رسراس اولیLه بLرای چهLار ضLلعی اصLلی را داده و سLپس بLرای دیگLر اشLکال

راس را مشLخص می کLنیم، چهLار ضLلعی بعLدی بLر روی آخLرین 2تنهLا ضلع چهارضلعی قبلی که رسم کرده ایم، رسم می شود.

:: رسم چهار ضلعی های مشترک در یک ضلع (GL_QUAD_STRIP)

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);glBegin(GL_QUAD_STRIP);

glVertex2f(-0.8, 0.4);glVertex2f(-0.8, -0.4);glVertex2f(0.0, 0.4);glVertex2f(0.0, -0.4);

glVertex2f(0.2, 0.4);glVertex2f(0.2, -0.4);

glVertex2f(0.5, 0.4);glVertex2f(0.5, -0.4);

glEnd(); ترتیب نوشتن رئوس مهم می باشد

جلسه هفتم

Page 14: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

بله

و زمcان، و کcد نوشcتن در جcویی صcرفه جهت

افcزایش دقت برنامcه نویسcی و اشcکال گcرافیکی

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

)آیا تمامی اشکال هندسی را تنها با خط ) و نقطه

می توان رسم کرد؟

جلسه هفتم

Page 15: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

شکل پایه ای به نام دایره در اشکال پایه ایOpenGL.وجود ندارد

ابتLه ثLک نقطLا از یLله آنهLه فاصLت کLاطی اسLی تقLان هندسLره مکLدای)مرکز( برابر مقدار ثابتی )شعاع( است.

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

خطوط به هم پیوسته 1.

چند ضلعی ها2.

دادLر تعLا اگLلعی هLد ضLته و چنLه هم پیوسLوط بLدام از خطLر کLدر هرئLوس زیLاد شLود ) رئLوس در یLک مسLیر دایLره ای داده شLوند( شLکل

مورد نظر به سمت دایره میل خواهد کرد.

رسم دایره در OpenGL

جلسه هفتم

Page 16: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

بهLمحاس دایLره رسLم جهت پیوسLت هم بLه خطLوط روش مختصLات تمLام نقLاط روي دايLره می باشLد کLه بLر حسLب زاويLه ⊖ )زاویLه ای کLه بین شLعاع و محLور هLای مختصLات تشLکیل می دهLد(

بدست می آید.

رسم دایره در OpenGL

جلسه هفتم

P( )= ((r cos ), (r sin ))⊖ ⊖ ⊖

Page 17: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

رسم دایره در OpenGL

جلسه هفتم

P( )= ((r cos ), (r sin ))⊖ ⊖ ⊖

#include <math.h

#include <gl\glut.h>

#define PI 3.1415926535898

GLint circle_points = 100;

void MyCircle2f(GLfloat centerx, GLfloat centery, GLfloat radius)

{

GLint i;

GLdouble theta;

glBegin(GL_POLYGON);

for (i = 0; i < circle_points; i++)

{

theta = 2*PI*i/circle_points;

glVertex2f(centerx+radius*cos(theta), centery+radius*sin(theta));

}

glEnd();

}

Page 18: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

رسم دایره در OpenGLادامه -

جلسه هفتم

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0,0.8,0.1);

MyCircle2f(0.0,0.0, 0.5);

glFlush();

}

void init(void)

{

glClearColor(1.0,1.,1.0,1.0);

}

void main(int argc, char* argv[])

{

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize (400, 400);

glutCreateWindow("Circle2D");

init();

glutDisplayFunc(Display);

glutMainLoop();

}

Page 19: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

تمرینات بیشتر در OpenGL

جلسه هفتم

.خروجی الگوریتم روبه رو را بدست آوریدglClear(GL_COLOR_BUFFER_BIT);

float Size = 1.0;

for(float pos=-0.9; pos < 0.9 ; pos+=0.2)

{

glPointSize(Size);

glBegin(GL_POINTS);

glVertex2f(pos, 0.0);

glEnd();

Size += 2.0;

}

glutSwapBuffers();

: جواب

تغییر اندازه نقاط بصورت پویا ::

Page 20: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

تابع اعمال الگوی خطوط در OpenGL

جلسه هفتم

ددLک عLوط یLوی خطLت 16الگLه از راسLد کLاینری می باشLتی بLبی در بایسLتی الگLو این اعمLال می شLود، بLرای خطLوط بLه چب

تLابع فرسLتاده GlushortمتغLیر بLه یLا مسLتقیما و ذخLیره شLود شود.

void glLineStipple(GLint factor, GLushort pattern);

Page 21: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

تابع اعمال الگوی خطوط در OpenGL

جلسه هفتم

ددLک عLوط یLوی خطLه چب 16الگLت بLه از راسLد کLاینری می باشLتی بLبی

GlushortبLرای خطLوط اعمLال می شLود، این الگLو بایسLتی در متغLیر

ذخیره شود و یا مستقیما به تابع فرستاده شود.

void glLineStipple(GLint factor, GLushort pattern);

1میزان تکرار بیت های بیتی16الگوی

Page 22: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

تابع اعمال الگوی خطوط در OpenGL

جلسه هفتم

تمرین : خروجی برنامه زیر چیست؟

glClear(GL_COLOR_BUFFER_BIT);glEnable(GL_LINE_STIPPLE);GLushort stPattern = 0xFAFA;glLineStipple(5, stPattern);glLineWidth(5.0);glBegin(GL_LINES);

glVertex2f(-0.2, -0.5);glVertex2f(0.3, 0.8);glVertex2f(-0.8, -0.8);glVertex2f(0.8, -0.8);

glEnd();glutSwapBuffers();

: جواب

Page 23: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

فعال یا غیر فعال کردن قابلیت ها در ::OpenGL

جلسه هفتم

از کنیLد اضLافه را قLابلیتی بخواهیLد کLه glEnableاگLر در صLورتی و

اسLتفاده می کLنیم، بهLتر از قبLل glDiableبخواهیLد آن را غLیر فعLال کنیLد

از اسLتفاده از این دسLتورات وضLعیت فعلی آن را تشLخیص دهیLد در

دسLتور از صLورت مقLدار glIsEnabledاین کLه شLود می اسLتفاده

GL_TRUE و یا GL_FALSE.خروجی می دهد

if( glIsEnabled(GL_LINE_SMOOTH) == GL_FALSE )

glEnable(GL_LINE_SMOOTH);

مثال :

glEnable:: glDiable

Page 24: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

گرفتن خطاهای OpenGL

جلسه هفتم

ابعLتفاده از تLبا اسglGetError رایLان اجLای زمLواع خطاهLد انLمی توانی ) (

OpenGL.را بدست آورید

GL_NO_ERROR تادنLل از فرسLت قبLتر اسLدارد. بهLود نLایی وجLهیچ خط :برنامه به خروجی این خطا را بگیرید.

GL_INVALID_ENUM دهLف شLوابت از پیش تعریLا و ثLیر هLوع متعیLان نLهم :OpenGL والLید معمLرده باشLاب کLتی انتخLوع نادرسLه نLورتی کLت، در صLاس

با این خطا موجه می شوید.

GL_INVALID_VALUE دودLده بیش از محLتاده شLدار فرسLه مقLامی کLهنگ :مجاز آن متغییر باشد این خطا رخ می دهد.

GL_INVALID_OPERATION ر رویLالی را بLه اعمLد کLامی رخ می دهLهنگ :اعمLال ماننLد باشLند انجLام قابLل غLیر کLه دهیLد انجLام هLا داده از نLوعی

حسابی.

GL_STACK_OVERFLOW ایLاتریس هLداد مLه تعLد کLامی رخ می دهLهنگ : فرستاده شده بیش از حد ظرفیت پشته باشد.

glGetError( ) ::

Page 25: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری

تمرین

جلسه هفتم

دهLه شLر گرفتLلعی در نظLار ضLک چهLره و یLک دایLم یLر جهت رسLوریتم زیLالگ

است ، آن را توضیح دهید.، و خروجی را مشخص نمایید.

1 #include <GL/glut.h>2 #include <math.h>3 int Height=400, Width=400;4 #define edgeOnly 05 void DrawCircle(double radius, int numberOfSides)6 {

7 // if edge only, use line strips; otherwise , use polygons8 If (edgeOnly)9 glBegin(GL_LINE_STRIP);10 else11 glBegin(GL_POLYGON);12 // calculate each vertex on the circle13 for ( int vertex = 0; vertex < numberOfSides; vertex++ )14 {

Page 26: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری جلسه هفتم

18 glColor3f(0,0,1); // Blue Color19 // draw the current vertex at the correct radius20 glVertex2f(cosf(angle_c)*radius, sinf(angle_c)*radius);21 }22 // if drawing edge only, then need to complete the loop with first vertex23 if(edgeOnly)24 glVertex2f(radius, 0.0);25 glEnd();26 }27 void display(void)28 {29 glClear(GL_COLOR_BUFFER_BIT);30 DrawCircle(0.8, 100);31 glColor3f(1, 1, 0);32 glBegin(GL_QUADS);33 glVertex2f(-0.2, 0.2);34 glVertex2f(-0.2, -0.2);35 glVertex2f(0.2, -0.2);36 glVertex2f(0.2, 0.2);37 glEnd();

Page 27: OpenGL برنامه نویسی گرافیکی با

گرافیک کامپیوتری جلسه هفتم

38 glutSwapBuffers();39 }40 int main(int argc, char **argv)41 {42 glutInit(&argc, argv);43 glutInitDisplayMode(GLUT_DOUBLE);44 glutInitWindowSize(Width, Height);45 glutCreateWindow("Circle Example");46 glutDisplayFunc(display);

47 glutMainLoop();48 }