1 / 27

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

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

enan
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

  2. جلسه هفتم گرافیک کامپیوتری • مرور جلسه گذشته • رسم رئوس در 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;

  3. جلسه هفتم گرافیک کامپیوتری • مرور جلسه گذشته • رسم خط در OpenGL :: (GL_LINES) • رسم پاره خط های جدا از هم ( GL_LINES ) • رسم خطوط به هم پیوسته با دو سر انتهایی باز (GL_LINE_STRIP) • رسم خطوط به هم پیوسته با دو سر انتهایی به هم پیوسته (GL_LINE_LOOP) • رسم مثلث در OpenGL :: (GL_TRIANGLES) • مثلث های جدا از هم :: (GL_TRIANGLES) • مثلث های دوبه دو مشترک در یک ضلع :: (GL_TRIANGLE_STRIP) • مثلث های مشترک در یک راس واحد :: (GL_TRIANGLE_FAN)

  4. جلسه هفتم گرافیک کامپیوتری • رسم چند ضلعی :: (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(); • مثلث مشتق شده از چند ضلعی می باشد ولی برای رسم مثلث از چند ضلعی استفاده نمی کنیم.

  5. جلسه هفتم گرافیک کامپیوتری • تابع glPolygonModeدر رسم چند ضلعی ها • چند ضلعی ها بطور پیش فرض توپر رسم می شود، اما با استفاده از تابع glPolygonMode می توان آن را تغییر داد.. • آرگومانی که به پارامتر face ارسال می شود می تواند یکی از مقادیر: • GL_BACK • GL_FRONT • GL_FRONT_AND_BACK باشد، این پارامترها مشخص کننده نحوه تاثیر پارامتر mode بر چند ضلعی می باشد. void glPolygonMode(GLenum face, GLenum mode);

  6. جلسه هفتم گرافیک کامپیوتری • تابع glPolygonModeدر رسم چند ضلعی ها void glPolygonMode(GLenum face, GLenum mode); • پارامتر mode می تواند یکی از سه مقدار زیر را داشته باشد: • GL_LINE : تنها خطوط بجای نمایش توپر می شوند. • GL_POINT : نقاط ابتدا و انتهایی خطوط نمایش داده می شود. • GL_FILL: باعث نمایش توپر شکل به صورت پیش فرض می شود. • در بخش سه بعدی بیشتر بحث خواهد شد.

  7. جلسه هفتم گرافیک کامپیوتری • تابع glPolygonModeدر رسم چند ضلعی ها • در مثال زیر یک 8 ضلعی را به صورت غیر توپر می بینید. • 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();

  8. جلسه هفتم گرافیک کامپیوتری • تمرین • 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) • با توجه به مختصات زیر می خواهیم یک لوزی تو پر رسم کنیم .

  9. جلسه هفتم گرافیک کامپیوتری • نکاتی در باره رسم چند ضلعی ها • ترتیب معرفی رئوس بایستی به صورت ساعتگرد و یا پاد ساعتگرد باشد. • برهم زدن ترتیب فوق موجب رسم ناصحیح چند ضلعی می شود. • glBegin(GL POLYGON); • glVertex2f(0.50, 0.10); • glVertex2f(0.10, 0.50); • glVertex2f(0.90, 0.50); • glVertex2f(0.50, 0.90); • glEnd();

  10. جلسه هفتم گرافیک کامپیوتری • نکاتی در باره رسم چند ضلعی (GL_POLYGON) • OpenGL فقط چند ضلعی هایی را صحیح رسم می کند که شرایط زیر را داشته باشد: • ساده (Simple): لبه های جند ضلعی متقاطع نباشد. • محدب (Convex) : همه نقاط واقع بر روی خط اتصال بین دو راس داخل چند ضلعی باشد. • مسطح ( Flat) : همه رئوس بر روی یک صفحه واقع شده باشند. No simple polygon No convex polygon • مثلث ها همه شرایط فوق را دار می باشند.

  11. جلسه هفتم گرافیک کامپیوتری • رسم چهار ضلعی :: (GL_QUADS) • برای رسم چهار ضلعی دو گزینه وجود دارد: • چهارضلعی های جدا از هم (GL_QUADS) • چهارضلعی های مشترک در یک ضلع (GL_QUAD_STRIP)

  12. جلسه هفتم گرافیک کامپیوتری • رسم چهار ضلعی های جدا از هم :: (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(); • یک لوزی و یک متوازی الاضلاع جدا از هم.

  13. جلسه هفتم گرافیک کامپیوتری • رسم چهار ضلعی های مشترک در یک ضلع :: (GL_QUAD_STRIP) • برای رسم چند ضلعی های مشترک در یک ضلع کافی است ابتدا چهار راس اولیه برای چهار ضلعی اصلی را داده و سپس برای دیگر اشکال تنها 2 راس را مشخص می کنیم، چهار ضلعی بعدی بر روی آخرین ضلع چهارضلعی قبلی که رسم کرده ایم، رسم می شود. • 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(); • ترتیب نوشتن رئوس مهم می باشد

  14. جلسه هفتم گرافیک کامپیوتری • آیا تمامی اشکال هندسی را تنها با خط ( و نقطه) می توان رسم کرد؟ • بله • جهت صرفه جویی در نوشتن کد و زمان، و افزایش دقت برنامه نویسی و اشکال گرافیکی از توابع رسم اشکال پایه استفاده می کنیم.

  15. جلسه هفتم گرافیک کامپیوتری • رسم دایره در OpenGL • شکل پایه ای به نام دایره در اشکال پایه ای OpenGL وجود ندارد. • دایره مکان هندسی تقاطی است که فاصله آنها از یک نقطه ثابت (مرکز) برابر مقدار ثابتی (شعاع) است. • برای کشیدن دایره می توان از دو روش استفاده کنیم. • خطوط به هم پیوسته • چند ضلعی ها • در هر کدام از خطوط به هم پیوسته و چند ضلعی ها اگر تعداد رئوس زیاد شود ( رئوس در یک مسیر دایره ای داده شوند) شکل مورد نظر به سمت دایره میل خواهد کرد.

  16. جلسه هفتم گرافیک کامپیوتری • رسم دایره در OpenGL • روش خطوط به هم پیوست جهت رسم دایره محاسبه مختصات تمام نقاط روي دايره می باشد که بر حسب زاويه ⊖ (زاویه ای که بین شعاع و محور های مختصات تشکیل می دهد) بدست می آید. P(⊖)= ((r cos ⊖ ), (r sin ⊖))

  17. جلسه هفتم گرافیک کامپیوتری • رسم دایره در OpenGL #include <math.h #include <gl\glut.h> #define PI 3.1415926535898 GLintcircle_points = 100; void MyCircle2f(GLfloatcenterx, GLfloatcentery, GLfloat radius) { GLinti; 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(); } P(⊖)= ((r cos ⊖ ), (r sin ⊖))

  18. جلسه هفتم گرافیک کامپیوتری • رسم دایره در 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(intargc, char* argv[]) { glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (400, 400); glutCreateWindow("Circle2D"); init(); glutDisplayFunc(Display); glutMainLoop(); }

  19. جلسه هفتم گرافیک کامپیوتری • تمرینات بیشتر در 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(); • خروجی الگوریتم روبه رو را بدست آورید. جواب :

  20. جلسه هفتم گرافیک کامپیوتری • تابع اعمال الگوی خطوط در OpenGL • الگوی خطوط یک عدد 16 بیتی باینری می باشد که از راست به چب برای خطوط اعمال می شود، این الگو بایستی در متغیر Glushort ذخیره شود و یا مستقیما به تابع فرستاده شود. void glLineStipple(GLint factor, GLushort pattern);

  21. جلسه هفتم گرافیک کامپیوتری • تابع اعمال الگوی خطوط در OpenGL • الگوی خطوط یک عدد 16 بیتی باینری می باشد که از راست به چب برای خطوط اعمال می شود، این الگو بایستی در متغیر Glushort ذخیره شود و یا مستقیما به تابع فرستاده شود. void glLineStipple(GLint factor, GLushort pattern); الگوی 16 بیتی میزان تکرار بیت های 1

  22. جلسه هفتم گرافیک کامپیوتری • تابع اعمال الگوی خطوط در OpenGL • تمرین : خروجی برنامه زیر چیست؟ • glClear(GL_COLOR_BUFFER_BIT); • glEnable(GL_LINE_STIPPLE); • GLushortstPattern = 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(); جواب :

  23. جلسه هفتم گرافیک کامپیوتری • فعال یا غیر فعال کردن قابلیت ها در :: OpenGL glEnable::glDiable • اگر بخواهید قابلیتی را اضافه کنید از glEnable و در صورتی که بخواهید آن را غیر فعال کنید glDiable استفاده می کنیم، بهتر از قبل از استفاده از این دستورات وضعیت فعلی آن را تشخیص دهید در این صورت از دستور glIsEnabled استفاده می شود که مقدار GL_TRUE و یا GL_FALSE خروجی می دهد. • مثال : if( glIsEnabled(GL_LINE_SMOOTH) == GL_FALSE ) glEnable(GL_LINE_SMOOTH);

  24. جلسه هفتم گرافیک کامپیوتری • گرفتن خطاهای OpenGL glGetError( ) :: • با استفاده از تابع glGetError ( ) می توانید انواع خطاهای زمان اجرای OpenGL را بدست آورید. • GL_NO_ERROR: هیچ خطایی وجود ندارد. بهتر است قبل از فرستادن برنامه به خروجی این خطا را بگیرید. • GL_INVALID_ENUM: همان نوع متعییر ها و ثوابت از پیش تعریف شده OpenGL است، در صورتی که نوع نادرستی انتخاب کرده باشید معمولا با این خطا موجه می شوید. • GL_INVALID_VALUE: هنگامی که مقدار فرستاده شده بیش از محدود مجاز آن متغییر باشد این خطا رخ می دهد. • GL_INVALID_OPERATION: هنگامی رخ می دهد که اعمالی را بر روی نوعی از داده ها انجام دهید که غیر قابل انجام باشند مانند اعمال حسابی. • GL_STACK_OVERFLOW : هنگامی رخ می دهد که تعداد ماتریس های فرستاده شده بیش از حد ظرفیت پشته باشد.

  25. جلسه هفتم گرافیک کامپیوتری • تمرین • الگوریتم زیر جهت رسم یک دایره و یک چهار ضلعی در نظر گرفته شده است ، آن را توضیح دهید.، و خروجی را مشخص نمایید. 1#include <GL/glut.h> 2 #include <math.h> 3 intHeight=400, Width=400; 4 #define edgeOnly 0 5 void DrawCircle(double radius, intnumberOfSides) 6 { 7// if edge only, use line strips; otherwise , use polygons 8 If(edgeOnly) 9 glBegin(GL_LINE_STRIP); 10else 11 glBegin(GL_POLYGON); 12 // calculate each vertex on the circle 13 for ( int vertex = 0; vertex < numberOfSides; vertex++ ) 14 {

  26. جلسه هفتم گرافیک کامپیوتری 18glColor3f(0,0,1); // Blue Color 19 // draw the current vertex at the correct radius 20 glVertex2f(cosf(angle_c)*radius, sinf(angle_c)*radius); 21 } 22 // if drawing edge only, then need to complete the loop with first vertex 23 if(edgeOnly) 24 glVertex2f(radius, 0.0); 25 glEnd(); 26 } 27 void display(void) 28 { 29 glClear(GL_COLOR_BUFFER_BIT); DrawCircle(0.8, 100); 31glColor3f(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();

  27. جلسه هفتم گرافیک کامپیوتری 38glutSwapBuffers(); 39 } 40 intmain(intargc, 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}

More Related