glVertex4d(1.25,2.75,-8,4);-3
glColor3f(2.0,0.0,2.0);//or glColor4f(2.0,0.0,2.0,0.2) 4th parameter for transparencyoption
برای رسم یک مثلث نیاز به داشتن مختصات سه نقطه داریم.
انواع مثاث های قابل ترسیم:
1- مثلثهایجداازهم
2- مثلثهایدو به دومشترکدریکضلع
3- مثلثهایمشترکدریکراسواحد
برای ترسیم مثلث نوع اول به شکل زیر عمل می کنیم:
glBegin(GL_TRIANGLES);
glVertex2f(-0.8, -0.8);
glVertex2f(-0.6, -0.4);
glVertex2f(-0.3, -0.8);
glVertex2f(0.8, 0.8);
glVertex2f(0.6, 0.4);
glVertex2f(0.3, 0.8);
glVertex2f(-0.4, 0.0);
glVertex2f(0.0, 0.5);
glVertex2f(0.4, 0.0);
که در مثال بالا سه مثلث جدا از هم را نشان می دهد.
برای ترسیم مثلث نوع دوم به شکل زیر عمل خواهیم کرد:
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBegin(GL_TRIANGLE_STRIP);
glVertex2f(-0.4, -0.5);
glVertex2f(-0.4, -0.1);
glVertex2f(0.0, -0.5);
glVertex2f(0.0, -0.1);
glVertex2f(0.4, -0.5);
در مثال بالا سه مثلث داریم که دو به دو دارای ضلع مشترک هستند برای اینکه جدا از هم تشخیص داده شوند از دستور glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); استفاده کردیم.
برای ترسیم مثلثهای مشترک در یک راس از دستورات زیر استفاده می کنیم:
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBegin(GL_TRIANGLE_FAN);
که در مثال بالا هفت مثلث را نشان می دهد که در یک راس مشترک هستند.
یک مثال را به طور کامل برایتان توضیح می دم.
رسم مثال قبل :
#pragma comment(lib,"glut32.lib")
#pragma comment(lib,"opengl32.lib")
void display(void)/* all of our code that need to see in screen should write in this function and between glClear(GL_color_BUFFER_BIT) and glutSwapBuffers()*/
glClear(GL_COLOR_BUFFER_BIT);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glColor3f(2.0,0.0,2.0);//or glColor4f(2.0,0.0,2.0,0.2) 4th parameter for transparencyoption
glBegin(GL_TRIANGLE_FAN);
int main(int argc,char **argv)
glutInitDisplayMode(GLUT_DOUBLE);
glutInitWindowSize(width, hight);// the resolution of screen
glutCreateWindow("Hello OpenGL World");//name of screen
glutDisplayFunc(display);// go to display function
رسم چند ضلعی(GL_POLYGON):
با استفاده از ویژگی چند ضلعی ها می توان انواع چند ضلعی ها را رسم کرد.مثلث ها نیز در واقع از چند ضلعی ها مشتق گرفته شده اند، اما به دلیل اینکه مثلث ها دارای تنوع سه گانه جالبی هستند و همواره محدب هستند و رئوس یک مثلث نمی توانند یک دیگر را قطع کنند، برای رسم مثلث هرگز از چند ضلعی استفاده نمی شود. بنابراین برای رسم چند ضلعی های بیشتر از 4 راس از این شیوه استفاده می کنند.
چند ضلعی ها به طور پیش فرض توپر رسم می شوند اما با دستور زیر می توان تغییراتی را اعمال کرد:
glPolygonMode(GLenum face,GLenum mode);
آرگومانی که به پارامتر face ارسال می شود می تواند به صورت GL_BACK,GL_FRONT,GL_FRONT_AND_BACK باشد.که نحوه تاثیر پارامتر mode بر چند ضلعی را مشخص می کند که این مباحث تاثیر خود را بیشتر در فضای 3بعدی که در قسمتهای بعد توضیح داده خواهد شد نمایان می کنند اما لازم به ذکر است که در فضای 3بعدی اشکال دارای سه قسمت جلو،کناره و پشت هستند که می توانیم آنها را ببینیم و هر کدام ازین قسمت ها می توانند توپر یا توخالی باشند.پارامتر mode می تواند 3 مقدار GL_LINE,GL_POINT,GL_FILL را بگیرد که در آن GL_FILLبه معنای رسم توپر شکل،GL_POINT باعث رسم نقاط ابتدایی وانتهایی خطوط نمایش داده می شود ودر آخر GL_LINE که باعث می شود تنها خطوط متصل به هم دیده شوند(حالت تو خالی).
با یک مثال درک طلب را ساده تر می کنم:
در مثال زیر یک هشت ضلعی به صورت تو خالی رسم شده است:
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);
رسم 4 ضلعی :
برای رسم 4 ضلعی نیز با دو نوع مختلف روبه رو هستیم:
1- 4ضلعی های جدا از هم((GL_QUADS
2- 4ضلعی های به هم پیوسته (GL_QUAD_STRIP)
برای رسم 4ضلعی جدا از هم کافیست که 4 راس را به OPEN GL دهیم تا برای ما یک 4 ضلعی به شکل مربع یا مستطیل یا لوزی یا هر 4 ضلهی دیگر را رسم کند.
در مثال زیر یک لوزی ویک متوازی الاضلاع توپر کشیده شده است:
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);
برای رسم 4 ضلعی های به هم پیوسته باید دقت بیشتری به کاردهیم. ابتدا 4 راس 4ضلعی اصلی را می نویسیم دقت می کنیم که 4ضلعی بعدی برروی آخرین ضلع 4ضلعی قبلی رسم می شود ترتیب نوشتن رئوس در این نوع بسیار مهم است.
برای مثال در کد زیر 3 مستطیل به هم پیوسته را کشیده ایم:
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);