1 / 58

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

به نام خداوند هستی بخش یگانه. جلسه دهم. OpenGL برنامه نویسی گرافیکی با. A.M. Safaei. PhD candidate. جلسه دهم. گرافیک کامپیوتری. ورودی های در محیط OpenGL. جلسه هشتم. گرافیک کامپیوتری. ورودیها :: صفحه کلید :: glutKeyboardFunc.

shaw
Télécharger la présentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. به نام خداوند هستی بخش یگانه جلسه دهم OpenGLبرنامه نویسی گرافیکی با A.M. Safaei PhD candidate

  2. جلسه دهم گرافیک کامپیوتری ورودی های در محیط OpenGL

  3. جلسه هشتم گرافیک کامپیوتری • ورودیها :: صفحه کلید :: glutKeyboardFunc • GLUT دو تابع را برای وقایع مربوط به صفحه کلید هنگام فشردن یک کلید فراهم نموده است. • glutKeyboardFunc : جهت پردازش مربوط به فشردن شدن کلید های معمولی استفاده می شود ( حروف الفبا ، اعداد و تمام کلید هایی که دارای کد اسکی هستند). • یکی از کاربردهای این تابع فراهم آوردن راهی برای خروج از برنامه هنگام فشردن کلید ESCAPE می باشد، با توجه به اینکه تابع glutMainLoop یک حلقه نامتناهی تولید می کند. کد اسکی ESCAPE = 27 void keyboard(unsigned char key, int x, int y) } if( key == 27) exit(0); {

  4. جلسه هشتم گرافیک کامپیوتری • ورودیها :: صفحه کلید :: glutSpecialFunc • glutSpecialFunc : جهت پردازش مربوط به فشردن شدن کلید های خاص استفاده می شود ، بعنوان مثال با فشردن کلید F1 شکل را به رنگ قرمز و با کلید F2 به رنگ سبز و کلید F3 به رنگ آبی در بیاورد. void special( int key, int x, int y) } switch(key)} case GLUT KEY F1: r=1.0; g=0.0; b=0.0; break; case GLUT KEY F2: r=0.0; g=1.0; b=0.0; break; case GLUT KEY F3: r=0.0; g=0.0; b=1.0; break; { {

  5. جلسه هشتم گرافیک کامپیوتری • ورودیها :: کلید های پیرایشی glutGetModifiers() • جهت تعیین اینکه آیا کلید های پیرایشی (ALT, CTRL, SHIFT) فشرده شده اند از تابع بازگشتی استفاده می شود. • :GLUT_ACTIVE_SHIFT در صورت فشرده شدن Shift و روشن بودن کلید Caps Lock روشن باشد. • GLUT_ACTIVE_CTRL: در صورتی که کلید CTRL را فشار دهید. • :GLUT_ACTIVE_ALT در صورتی که کلید ALT را فشار دهید.

  6. جلسه هشتم گرافیک کامپیوتری • ورودیها :: کلید های پیرایشی glutGetModifiers() • مثال :در استفاده از کلید های پیرایشی تابع مربوطه به صفحه کلید را طوری تغییر می دهیم که در صورت فشرده شدن ALT+r رنگ قرمز غیر فعال و در غیر اینصورت فعال شود. void keyboard(unsigned char key, int x, int y) } if( key == 27) exit(0); else if (key == 'r') } int mod = glutGetModifiers(); if( mod == GLUT_ACTIVE_ALT) r = 0.0; else r = 1.0; { {

  7. جلسه هشتم گرافیک کامپیوتری • ورودیها :: ماوس :: glutMouseFunc • همانند صفحه کلید در GLUT برای ماوس تابع زیر در نظر گرفته شده است، که کلیک کردن با ماوس را کنترل می کند. • پارامتر اول این تابع جهت مشخص کردن اینکه کدام دکمه ماوس فشرده شده و یا رها شده می باشد و دارای سه حالت زیر می باشد: • GLUT_LEFT_BUTTON • GLUT_MIDDLE_BUTTON • GLUT_RIGHT_BUTTON void glutMouseFunc( void (*func) (int button, int state, int x, int y));

  8. جلسه هشتم گرافیک کامپیوتری • ورودیها :: ماوس :: glutMouseFunc • پارامتر دوم تابع، وضعیت دکمه مربوطه یعنی فشرده شدن یا رها شدن را مقدار دهی می کند. • GLUT_DOWN • GLUT_UP void glutMouseFunc( void (*func) (int button, int state, int x, int y)); void mouse(int b, int s, int x, int y) } switch(b) } case GLUT LEFT BUTTON: if( s == GLUT DOWN) r = 1.0; else r = 0.0; break; } } تشخیص فشردن دکمه های ماوس

  9. جلسه دهم گرافیک کامپیوتری برش Clipping (کوتاه سازی) • در این مبحث الگوریتم های برش خط و برش چند ضلعی بررسی می شود

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

  11. جلسه دهم بــرش خــطLine Clipping - گرافیک کامپیوتری

  12. جلسه دهم گرافیک کامپیوتری • برش خط (کوتاه سازی خط ) • رسم یک خط درون یک مستطیل با اضلاع افقی و عمودی • فرض کنید یک راس پاره خط که آن را P می نامیم درون مستطیل و راس دیگر که آن را Q می نامیم خارج از مستطیل باشد و در نظر داریم فقط پاره خط PI را رسم کنیم ( I نقطه تقاطع پاره خط PQ با مرز مستطیل است.

  13. جلسه دهم گرافیک کامپیوتری • برش خط (کوتاه سازی خط ) • مستطیل توسط چهار عدد xmin, xmax, ymin, ymax معین می شود، چون خط PQ ضلع بالای مستطیل را قطع کرده است : yO=ymax و با توجه به تشابه دو مثلث PAI و PBQ : • از طریق مقدار بالا به راحتی پاره خط PI را می توان رسم کرد.

  14. جلسه دهم Cohen-Sutherland Line Clipping گرافیک کامپیوتری • الگوریتم کوتاه سازیخط • کوهن - ساترلند

  15. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی کوهن - ساترلند • یکی از روشهای موثر برای کوتاه سازی خط الگورتیم کوهن – ساترلند می باشد، که با امتداد اضلاع مستطیل، صفحه نمایش را به نه قسمت تقسیم می کندو به هر کدام از این نه بخش یک کد چهار بیتی کد خروج اختصاص داده، هر بیت کد خروج در صورتی یک می شود که ناحیه متناظر با آن از سمت معین پنجره خارج شده باشد. 1001 1000 1010 بیت 1 : چپ بیت 2 : راست بیت 3 : پائین بیت 4 : بالا 0001 0000 0010 0101 0100 0110

  16. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی کوهن - ساترلند • اگر نقطه ای درون مستطیل قرار گیرد کد خروج آن 0000 خواهد بود، کد خروج نقطه که دقیقا بالای مستطیل قرار دارد 1000 است. • اگر فرض شود که خد خروج دو انتهای پاره خط را با c1و c2 نشان دهیم، در اینصورت داریم : • اگر c1 یا c2 = 0000 آنگاه پاره خط کاملا درون پنجره می باشد و باید بطور کامل رسم شود. • اگر c1 و c2 مخالف با مقدار 0000 باشد آنگاه پاره خط کاملا خارج از پنجره بودن و نباید رسم شود. • اگر هیچکدام از حالات اول و دوم برقرار نبود آنگاه پاره خط مزبور توسط مرز پنجره به دو بخش تقسیم می شود که برای هر دو بخش باید مراحل اول و دوم را تکرار کنیم . • برای اینکه بفهمیم پاره خط کدام مرز را قطع کرده است کافیست مرز متناظر را با بیتی را که مقدار آن یک است تعیین کنیم.

  17. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی کوهن - ساترلند (Xmin, Ymin) (Xmax, Ymin) (Xmin, Ymax) (Xmax, Ymax)

  18. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی کوهن - ساترلند • یکی از رئوس را به دلخواه انتخاب می کنیم، اگر خارج از محدوده بود، نقطه تقاطع خط با مرز پنجره دید را پیدا می کنیم و این نقطه جدیدرا جایگزین نقطه خارج از محدوده می کنیم. • برای تشخیص مرز، کافیست کدچهاربیتی راس مورد نظر را بررسی نمود. شماره بیت 1001 1010 1000 بیت 1 : چپ بیت 2 : راست بیت 3 : پائین بیت 4 : بالا منطقه 0001 0000 0010 0101 0100 0110

  19. A2 A1 جلسه دهم گرافیک کامپیوتری الگوریتم 1001 1000 1010 1. A1=0000,A2=0000 2. (both 0000) – Yes -> accept & draw 3. 3.1 3.2 3.2.1 3.2.2 3.2.3 3.2.4 1. A1=0000,A2=0000 2. (both 0000) – Yes -> accept & draw 3. 3.1 3.2 3.2.1 3.2.2 3.2.3 3.2.4 0000 0001 0010 0101 0100 0110

  20. B1 B2 A2 A1 جلسه دهم گرافیک کامپیوتری الگوریتم 1000 1001 1010 1. B1=1001,B2=1010 2. (both 0000) – No 3. AND Operation B1  1001 B2  1010 Result 1000 3.1 (not 0000) – Yes  reject 3.2 3.2.1 3.2.2 3.2.3 3.2.4 1. B1=1001,B2=1010 2. (both 0000) – No 3. AND Operation B1  1001 B2  1010 Result 1000 3.1 (not 0000) – Yes  reject 3.2 3.2.1 3.2.2 3.2.3 3.2.4 1. B1=1001,B2=1010 2. (both 0000) – No 3. AND Operation B1  1001 B2  1010 Result 1000 3.1 (not 0000) – Yes  reject 3.2 3.2.1 3.2.2 3.2.3 3.2.4 1. B1=1001,B2=1010 2. (both 0000) – No 3. AND Operation B1  1001 B2  1010 Result 1000 3.1 (not 0000) – Yes  reject 3.2 3.2.1 3.2.2 3.2.3 3.2.4 0000 0001 0010 0101 0100 0110

  21. 1. C1=0001,C2=0000 2. (both 0000) – No 3. AND Operation 0001 0000 result 0000 3.1(not 0000) - No 3.2. (0000)-Yes 3.2.1. choose C1 3.2.2. Intersection point, C1’ at LEFT 3.2.3 C1 <- C1’ C1 = 0000 3.2.4 repeat 2 1. C1=0001,C2=0000 2. (both 0000) – No 3. AND Operation 0001 0000 result 0000 3.1(not 0000) - No 3.2. (0000)-Yes 3.2.1. choose C1 3.2.2. Intersection point, C1’ at LEFT 3.2.3 C1 <- C1’ C1 = 0000 3.2.4 repeat 2 C1 A2 A1 C1’ C1’ C2 C2 جلسه دهم گرافیک کامپیوتری الگوریتم 1001 1000 1010 1. C1=0001,C2=0000 2. (both 0000) – No 3. AND Operation 0001 0000 result 0000 3.1(not 0000) - No 3.2. (0000)-Yes 3.2.1. choose C1 3.2.2. Intersection point, C1’ at LEFT 3.2.3 C1 <- C1’ C1 = 0000 3.2.4 repeat 2 1. C1=0001,C2=0000 2. (both 0000) – No 3.AND Operation 0001 0000 result 0000 3.1(not 0000) - No 3.2. (0000)-Yes 3.2.1. choose C1 3.2.2. Intersection point, C1’ at LEFT 3.2.3 C1 <- C1’ C1 = 0000 3.2.4 repeat 2 1. C1=0001,C2=0000 2. (both 0000) – No 3. AND Operation 0001 0000 result 0000 3.1(not 0000) - No 3.2. (0000)-Yes 3.2.1. choose C1 3.2.2. Intersection point, C1’ at LEFT 3.2.3 C1 <- C1’ C1 = 0000 3.2.4 repeat 2 1. C1=0001,C2=0000 2. (both 0000) – Yes -> accept & draw 3. 3.1 3.2 3.2.1 3.2.2 3.2.3 3.2.4 0000 0010 0001 0101 0100 0110

  22. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی کوهن - ساترلند • اگر نقطه تقاطع روی مرز چپ یا راست باشد و دو راس آغاز و پایان خط(x1 , y1) و (x2 , y2) باشند و شیب خط m باشد، مختصات نقطه تقاطع (xt , yt) عبارتست از: xt= Xmin (چپ) یاxt = Xmax (راست) yt= y1 + m(xt - x1 )

  23. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی کوهن - ساترلند • اگر نقطه تقاطع روی مرز بالا یا پایین باشد و دو راس آغاز و پایان خط(x1 , y1) و (x2 , y2) باشند و شیب خط m باشد، مختصات نقطه تقاطع (xt , yt) عبارتست از: yt= Ymin (بالا) یاyt = Ymax (پایین) xt= x1 + (yt - y1 )/m

  24. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی کوهن - ساترلند • Assign a region code for each endpoints. • If both endpoints have a region code 0000 --- accept these line. • Else, perform the logical AND operation for both region codes. 3.1 if the result is not 0000 - reject the line. 3.2 else – (result = 0000, need clipping) 3.2.1. Choose an endpoint of the line that is outside the window. 3.2.2. Find the intersection point at the window boundary (base on region code). 3.2.3. Replace endpoint with the intersection point and update the region code. 3.2.4. Repeat step 2 until we find a clipped line either accepted or rejected. 4. Repeat step 1 for other lines.

  25. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی کوهن - ساترلند #define LEFT EDGE 0x1 #define RIGHT EDGE 0x2 #define BOTTOM EDGE 0x4 #define TOP EDGE 0x8 unsignedchar encode (GLint x, GLint y, GLintwx1, GLint wy1, GLint wx2, GLint wy2) { unsigned char code = 0x00; if(x < wx1)code = code | LEFT EDGE; if(x > wx2)code = code | RIGHT EDGE; if(y < wy1)code = code | BOTTOM EDGE; if(y > wy2) code = code | TOP EDGE; return (code); }

  26. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی کوهن - ساترلند #define INSIDE(a) (!a) #define REJECT(a,b) (a & b) #define ACCEPT(a,b) (!(a|b)) void SwapPts(GLint *x1, GLint *y1, GLint *x2, GLint *y2) { GLinttemp; temp = *x1; *x1=*x2; *x2=temp; temp= *y1; *y1=*y2; *y2=temp; } void SwapCodes (unsigned char *c1, unsigned char * c2) { unsigned char temp; temp = *c1, *c1=*c2; *c2=temp; }

  27. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی کوهن - ساترلند voidClipLine (GLint wx1, GLintwy1,GLintwx2,GLintwy2, GLint x1, GLint y1, GLint x2, GLint y2){ unsigned char code1, code2; intdone = FALSE, draw = FALSE; GLfloatm; while (!done){ code1=encode(x1, y1, wx1, wy1, wx2, wy2); code2=encode(x2, y2, wx1, wy1, wx2, wy2); if(ACCEPT (code1, code2)) { done = TRUE; draw = TRUE; } ادامه الگوریتم اسلاید بعد

  28. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی کوهن - ساترلند ادامه الگوریتم از اسلاید قبل else if(REJECT (code1, code2)) done = TRUE; else { if(INSIDE (code1)) { SwapPts(&x1, &y1, &x2, &y2); SwapCodes(&code1, &code2); } if(x2 != x1) m = (GLfloat) (y2-y1)/(x2-x1); if(code1 & LEFT EDGE) { y1 += (wx1 - x1)*m; x1 = wx1; } else if(code1 & RIGHT EDGE) { y1 += (wx2 - x1)*m; x1 = wx2; } elseif(code1 & BOTTOM EDGE){ if(x2 != x1) x1 += (wy1 - y1)/m; y1 = wy1; } else if(code1 & TOP EDGE) { if(x2 != x1) x1 += (wy2 - y1)/m; y1 = wy2; } } } if (draw) MidpointLine(x1, y1, x2, y2); }

  29. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی چند ضلعی • ساترلند - هاجمن • Sutherland-Hodgman • Clipping

  30. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن • در این الگوریتم برای کوتاه سازی چند ضلعی ابتاد تمام اضلاع چند ضلعی را نسبت به یک ضلع مستطیل کوتاه سازی می کنیم، در واقع آن ضلع را بصورت یک خط نامتناهی در نظر گرفته و عمل کوتاه سازی انجام می دهیم . • در این روش چند ضلعی اصلی را بعنوان چند ضلعی ورودی و جند ضلعی جدید را بعنوان چند ضلعی خروجی در نظر می گیرم.

  31. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن

  32. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن

  33. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن

  34. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن

  35. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن

  36. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن

  37. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن

  38. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن

  39. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن

  40. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن

  41. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن

  42. جلسه دهم چهار حالت ممکن برای یک ضلع در الگوریتم ساترلند - هاجمن گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن outside inside outside inside outside inside outside inside v2 v2 v2 v2 v1’ v1’ v1 v1 v1 v1 Outside to inside: Output: v1’ and v2 Inside to inside: Output: v2 Inside to outside: Output: v1’ Outside to outside: Output: nothing

  43. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن Left <V1, V2, V3> V3 V2 V1

  44. V1' جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن Left <V1, V2, V3> <V1’ > V3 V2 V1

  45. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن Left <V1, V2, V3> <V1’, V2’, V3 > V3 V2’ V1' V1

  46. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن Left <V1, V2, V3> <V1’, V2’, V3 , V1 > V3 V2’ V1' V1

  47. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن Right <V1’, V2’, V3 , V1 > V3 V2’ V1' V1

  48. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن Bottom <V1’, V2’, V3 , V1 > <V1’’ > V3 V2’ V1’’ V1

  49. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن Bottom <V1’, V2’, V3 , V1 > <V1’’, V2’, V3 > V3 V2’ V1’’ V1

  50. جلسه دهم گرافیک کامپیوتری • الگوریتم کوتاه سازی ساترلند - هاجمن Bottom <V1’, V2’, V3 , V1 > <V1’’, V2’, V3, V3’ > V3 V2’ V3’’ V1’’ V1

More Related