تبلیغات

نسل باران

|

بانک شماره و موبایل popup window

قالب های حرفه ای وردپرس

|

پلاگین وردپرس popup window

وب سایت دانشجویان کارشناسی و ارشد کامپیوتر خرم آباد - آموزش مقدماتی opengl
نسل باران
وب سایت دانشجویان کارشناسی و ارشد کامپیوتر خرم آباد
امام علی (ع) می فرمایند: « زکات العلم نشرهُ» زکات علم نشر آن است.
به سایت ما خوش آمدید
به نظر بایستی تا اینجا با مفاهیم نقاط در OpenGL آشنا شده باشید. امروز می خواهیم در مورد ایجاد خطوط با استفاده از مطالبی که در جلسات قبلی مطرح کردیم صحبت کنیم.

برنامه زیرا اجرا کنید:

// Includes Header Files
#include <windows.h>
#include "GL.H"
#include "GLU.H"
#include "glut.h"
// Include Library Files
#pragma comment(lib,"OPENGL32.LIB")
#pragma comment(lib,"glut32.lib")
#pragma comment(lib,"GLU32.LIB")
//****************************
//****************************
void Create_Vertex(void)
{	
    GLdouble Array_Double[] ={8.0,-8.0};
    GLint Array_Integer[] = {8,8};
	    gluOrtho2D(-10,10,-10,10);
	   glBegin(GL_LINES);
		 glVertex2f(-8.0,8.0);//1
		 glVertex2iv(Array_Integer);//1
		 glVertex2dv(Array_Double);//2
		 glVertex2i(-8,-8);//2
	   glEnd();
	   glFlush();   
}
///////////////////////////////////
void Display(void)
{    
    glClearColor(0.5,0.5,0.5,1);
    glColor3f(1.0,1.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT); 
    glPointSize(5.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    Create_Vertex();
    glFlush(); 
}
 //************* main **************
int WINAPI  WinMain(HINSTANCE hinstance,
	   HINSTANCE hPrevInstance,
	   LPSTR argv,
	   int argc) 
{ 
    glutInit(&argc, &argv);  // initialize the toolkit
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(800,600);
    glutInitWindowPosition(150,180);
    glutCreateWindow ("khoramsoft"); // Create the window 
    glutDisplayFunc (Display);// Register the "display" function 
    glutMainLoop (); // Enter the OpenGL main loop 
}


خروجی برنامه به شکل زیر می باشد:

[attachment=665]
اگر دقت کرده باشید برنامه با برنامه پست قبلی تفاوت چندانی نکرده و تنها تفاوت آنها در خط 17 می باشد که در آن آرگومان تابع glBegin از GL_POINTS به GL_LINES تغییر کرده است.قبل این موضوع را بیان کردیم که ما با استفاده از پارامتر تابع glBegin نوع ترسیم را در صحنه مشخص می سازیم . با استفاده از ثابت GL_LINES در واقع ما به OpenGL می گوییم که بعد از مشخص ساختن نقاط از آنها برای ترسیم خط استفاده نماید.
نکته:استفاده از ثابت GL_LINES باعث می شود که هر دونقطه پشت سر هم که تعریف کرده ایم یک خط را ایجاد کنند.یعنی برای ایجاد هر خط نیاز به یک زوج نقطه (2 بارفراخوانی یا استفاده ازتابع glVertex) دارد .در صورتی که ما تابع glVertex را به صورت فزد فراخوانی کنیم در هر صورت یکی از نقاط بلا استفاده و در صفحه دیده نخواهد شد.
void Create_Vertex(void)
{	
    GLdouble Array_Double[] ={8.0,-8.0};
    GLint Array_Integer[] = {8,8};
	    gluOrtho2D(-10,10,-10,10);
	   glBegin(GL_LINES);
		 glVertex2f(-8.0,8.0);//1
		  glVertex2iv(Array_Integer);//1
		  glVertex2dv(Array_Double);//2
		  glVertex2i(-8,-8);//2
	   glEnd();
	   glFlush();   
}

در تابع بالا خط های 7و8 خط اول و خط های 9 و 10 خط دوم را ترسیم می کنند.

تمرین :
1-دو خط را به موازات هم در صفحه نمایش رسم کنید.
2-با استفاده از مطالبی که تا کنون آموخته اید شکل زیر را رسم نمایید:

در پست قبلی در مورد نحوه ایجاد خطوط در OpenGL صحبت کردیم و تنها می توانستیم خطوط را تنها با استفاده از جفت نقاط به وجود بیاوریم حال اگر بخواهیم با استفاده از 3 نقطه دو پاره خط ایجاد کنیم راه حل چیست؟اگر بخواهیم توابعی مانند توابع مثلثاتی را طراحی کنیم راه حل چیست؟به طور کلی چگونه می توانیم خطوط را به صورت پیوسته ایجاد کنیم؟
برای این کار ما می توانیم از ثابت GL_LINE_STRIP برای آرگومان تابع glBegin استفاده کنیم .این ثابت باعث می شود که OpenGL تمام نقاط را به صورت پاره خط های بهم پیوسطه به یکدیگر متصل کند.در این حالت دیگر تعداد نقاط ما فرقی ندارد که زوج باشد یا فرد فقط بایستی حداقل دونقطه داشته باشیم تا خط ایجاد شود .

// Includes Header Files
#include <windows.h>
#include "GL.H"
#include "GLU.H"
#include "glut.h"
// Include Library Files
#pragma comment(lib,"OPENGL32.LIB")
#pragma comment(lib,"glut32.lib")
#pragma comment(lib,"GLU32.LIB")
//****************************
//****************************
void Create_Vertex(void)
{	
    gluOrtho2D(-10,10,-10,10);
	   glBegin(GL_LINE_STRIP);
		 glVertex2f(-8.0,8.0);
		 glVertex2f(8.0,8.0);
		 glVertex2f(8.0,-8.0);
		 glVertex2f(-8.0,-8.0);
	   glEnd();
    glFlush();   
}
///////////////////////////////////
void Display(void)
{    
    glClearColor(0.5,0.5,0.5,1);
    glColor3f(1.0,1.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT); 
    glPointSize(5.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    Create_Vertex();
    glFlush(); 
}
 //************* main **************
int WINAPI  WinMain(HINSTANCE hinstance,
	   HINSTANCE hPrevInstance,
	   LPSTR argv,
	   int argc) 
{ 
    glutInit(&argc, &argv);  // initialize the toolkit
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(800,600);
    glutInitWindowPosition(150,180);
    glutCreateWindow ("khoramsoft"); // Create the window 
    glutDisplayFunc (Display);// Register the "display" function 
    glutMainLoop (); // Enter the OpenGL main loop 
}
برنامه بالا را اجرا کنید تا نتیجه کار را مشاهده کنید.

چگونه می توان در برنامه بالا قسمتی خالی را به وسیله پاره خطی دیگه بهم متصل کرد؟

آخرین مطلب در مورد خطوط (lines) معرفی ثابت GL_LINE_LOOP می باشد .این ثابت همان کاری را می کند که ثابت GL_LINE__STRIP می کند، تنها تفاوت آنها این است که این ثابت باعث می شود اولین Vertex به آخرین Vertex متصل شود .
یکی از جوابهای سوال بالاM25


// Includes Header Files
#include <windows.h>
#include "GL.H"
#include "GLU.H"
#include "glut.h"
// Include Library Files
#pragma comment(lib,"OPENGL32.LIB")
#pragma comment(lib,"glut32.lib")
#pragma comment(lib,"GLU32.LIB")
//****************************
//****************************
void Create_Vertex(void)
{	
    gluOrtho2D(-10,10,-10,10);
	   glBegin(GL_LINE_LOOP);
		 glVertex2f(-8.0,8.0);
		 glVertex2f(8.0,8.0);
		 glVertex2f(8.0,-8.0);
		 glVertex2f(-8.0,-8.0);
	   glEnd();
    glFlush();   
}
///////////////////////////////////
void Display(void)
{    
    glClearColor(0.5,0.5,0.5,1);
    glColor3f(1.0,1.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT); 
    glPointSize(5.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    Create_Vertex();
    glFlush(); 
}
 //************* main **************
int WINAPI  WinMain(HINSTANCE hinstance,
	   HINSTANCE hPrevInstance,
	   LPSTR argv,
	   int argc) 
{ 
    glutInit(&argc, &argv);  // initialize the toolkit
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(800,600);
    glutInitWindowPosition(150,180);
    glutCreateWindow ("khoramsoft"); // Create the window 
    glutDisplayFunc (Display);// Register the "display" function 
    glutMainLoop (); // Enter the OpenGL main loop 
}





از اینجا به بعد می خواهیم در مورد polygon ها صحبت کنیم .در واقع با استفاده از Line ها ما می توانیم حالت Wire یا سیمی اشیاء رو ترسیم کنیم و برای حجم دهی به اجسام باید ابزار دیگه ایی رو به کار بگیریم .
یکی از راه ها استفاده از ثابت GL_TRIANGLES است .همانطور که میدانید این تابع به عنوان آرگومان تابع glBegin مورد استفاده قرار می گیره و باعث می شود هر سه نقطه در صفحه مختصات تشکیل یک مثلث بدهند.بدیهی است که بایستی برای ایجاد هر مثلث تعداد Vertex های ما در صحنه مضربی از 3 باشند وگرنه Vertex ها یا همون نقاط بدون استفاده باقی می مانند.

با استفاده از مثلث ما می توانیم بسیاری از اشکال هندسی دیگر رو به راحتی ترسیم کنیم در بسیاری از نرم افزارهای سه بعدی اشکال مختلف را با مثلث های بهم پیوسته به وجود می آورند.

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

// Includes Header Files
#include <windows.h>
#include "GL.H"
#include "GLU.H"
#include "glut.h"
// Include Library Files
#pragma comment(lib,"OPENGL32.LIB")
#pragma comment(lib,"glut32.lib")
#pragma comment(lib,"GLU32.LIB")
//****************************
//****************************

void Coordinate_Axis(void)//  Coordinate axis
{	
	GLfloat y_x,x_y ,i,j;

	for(j = 0; j < 2;j++)
	{
		if(j == 0)
		{
			y_x = 0;
			x_y = 0;
		}
		else
		{
			y_x = -10;
			x_y = -10;
		}
		for (i = 0;i < 10 ;i++)
			{
				if (i == 0 && j == 0)	
					glColor3f(1.0,0.0,0.0);
				else
					glColor3f(0.7,0.5,1.0);
				glBegin(GL_LINES);
					glVertex2f(10.0,y_x);// X-axis
					glVertex2f(-10.0,y_x);//X-axis 
					y_x++;
					glVertex2f(x_y,10.0);//Y-axis
					glVertex2f(x_y,-10.0);//Y-axis
					x_y++;
				glEnd();
			}
	}
	glFlush();   
}
void Create_Triangle(void)
{	
	   glBegin(GL_TRIANGLES);
		 glVertex2f(0.0,8.0);
		 glVertex2f(8.0,0.0);
		 glVertex2f(-8.0,0.0);
	   glEnd();
    glFlush();   
}
///////////////////////////////////
void Display(void)
{    
    glClearColor(0.5,0.5,0.5,1);
    glColor3f(1.0,1.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT); 
	gluOrtho2D(-10,10,-10,10);
    glPointSize(5.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    Create_Triangle();
	Coordinate_Axis();
    glFlush(); 
}
 //************* main **************
int WINAPI  WinMain(HINSTANCE hinstance,
	   HINSTANCE hPrevInstance,
	   LPSTR argv,
	   int argc) 
{ 
    glutInit(&argc, &argv);  // initialize the toolkit
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(600,400);
    glutInitWindowPosition(150,180);
    glutCreateWindow ("khoramsoft.com"); // Create the window 
    glutDisplayFunc (Display);// Register the "display" function 
    glutMainLoop (); // Enter the OpenGL main loop 
}
 

خروجی:

دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.

در خط 12 تابع Coordinate_Axis را برای رسم محور مختصات تعریف کرده ایم این تابع چیز خاصی ندارد و تنها با استفاده از دو حلقه For و مطالب گذشته آن را نوشته ایم.البته حتماً تابع را مورد بررسی قرار بدهید چون نکات مفیدی در مورد تابع glColor در آن وجود دارد.

در خط 45 تابع Create_Triangle را تعریف کرده ایم و که سه نقطه را برای ترسیم آن تعریف کرده و مقدار دهی نموده ایم.و برای آرگومان glBegin از ثابت GL_TRIANGLES استفاده کرده ایم.
void Create_Triangle(void)
{
glBegin(GL_TRIANGLES);
glVertex2f(0.0,8.0);
glVertex2f(8​.0,0.0);
glVertex2f(-8.0,0.0);
glEnd();
glFlush();
}
تنها موردی که بایستی در مورد این تابع رعایت می کردیم این بود که تعداد نقاط مضربی از سه باشد چون قبلاً مطرح کردیم که ثابت GL_TRIANGLES باعث می شود OpenGL از هر سه نقطه به صورت جداگانه برای ترسیم مثلث استفاده کند.

نکته :ترتیب استفاده از نقاط به صورتی است که ما آنها را تعریف کرده ایم .

مثال:با استفاده از دو مثلث یک متوازی الاضلاع را رسم می کنیم:

// Includes Header Files
#include <windows.h>
#include "GL.H"
#include "GLU.H"
#include "glut.h"
// Include Library Files
#pragma comment(lib,"OPENGL32.LIB")
#pragma comment(lib,"glut32.lib")
#pragma comment(lib,"GLU32.LIB")
//****************************
//****************************

void Coordinate_Axis(void)//  Coordinate axis
{    
    GLfloat y_x,x_y ,i,j;

    for(j = 0; j < 2;j++)
    {
	   if(j == 0)
	   {
		  y_x = 0;
		  x_y = 0;
	   }
	   else
	   {
		  y_x = -10;
		  x_y = -10;
	   }
	   for (i = 0;i < 10 ;i++)
		  {
			 if (i == 0 && j == 0)    
				glColor3f(1.0,0.0,0.0);
			 else
				glColor3f(0.7,0.5,1.0);
			 glBegin(GL_LINES);
				glVertex2f(10.0,y_x);// X-axis
				glVertex2f(-10.0,y_x);//X-axis 
				y_x++;
				glVertex2f(x_y,10.0);//Y-axis
				glVertex2f(x_y,-10.0);//Y-axis
				x_y++;
			 glEnd();
		  }
    }
    glFlush();   
}
void Create_Triangle(void)
{    
	  glBegin(GL_TRIANGLES);
//First triangle
	    glVertex2f(0.0,0.0);
	    glVertex2f(3.0,4.0);
	    glVertex2f(6.0,0.0);
//Second triangle
	    glVertex2f(0.0,0.0);
	    glVertex2f(3.0,4.0);
	    glVertex2f(-3.0,4.0);
	  glEnd();
    glFlush();   
}
///////////////////////////////////
void Display(void)
{    
    glClearColor(0.5,0.5,0.5,1);
    glColor3f(1.0,1.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT); 
    gluOrtho2D(-10,10,-10,10);
    glPointSize(5.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    Create_Triangle();
    Coordinate_Axis();
    glFlush(); 
}
 //************* main **************
int WINAPI  WinMain(HINSTANCE hinstance,
	  HINSTANCE hPrevInstance,
	  LPSTR argv,
	  int argc) 
{ 
    glutInit(&argc, &argv);  // initialize the toolkit
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(600,400);
    glutInitWindowPosition(150,180);
    glutCreateWindow ("khoramsoft.com"); // Create the window 
    glutDisplayFunc (Display);// Register the "display" function 
    glutMainLoop (); // Enter the OpenGL main loop 
}

در این مثال ما فقط سه نقطه دیگر را در تابع Create_Triangle تعریف کرده ایم
void Create_Triangle(void)
 {    
	   glBegin(GL_TRIANGLES);
 //First triangle
		glVertex2f(0.0,0.0);
		glVertex2f(3.0,4.0);
		glVertex2f(6.0,0.0);
 //Second triangle
		glVertex2f(0.0,0.0);
		glVertex2f(3.0,4.0);
		glVertex2f(-3.0,4.0);
	   glEnd();
	glFlush();   
 }
 
اگر به تعریف نقاط توجه کنید دو نقطه از نقاط مثلث دوم را برای مثلث اول نیز تعریف کرده ایم ،چون ثابت GL_TRIANGLES باعث می شود که هر 3 نقطه به صورت جداگانه برای رسم مثلث استفاده شوند مجبور هستیم نقاط را دوباره تعریف کنیم.البته در آینده بامعرفی ثابت دیگری تنها با تعریف یک نقطه دیگر می توانیم همین شکل را رسم نماییم.

تمرین :
یک هشت ضلعی همانند شکل زیر را رسم نمایید.






نوع مطلب : گرافیک کامپیوتری، opengl، 
برچسب ها :
لینک های مرتبط :

1396/09/17 16:16
Superb site you have here but I was curious if you knew of any forums that
cover the same topics talked about in this article?
I'd really love to be a part of community where I can get opinions from other
experienced people that share the same interest. If you
have any recommendations, please let me know. Many thanks!
1396/05/30 15:40
This is my first time pay a visit at here and i am in fact impressed to read everthing at one place.
1396/05/17 05:50
I think what you typed made a ton of sense. However, think about this, suppose
you added a little content? I am not saying your content isn't solid, however what if you
added a post title to possibly grab a person's attention? I
mean وب سایت دانشجویان کارشناسی و ارشد کامپیوتر خرم آباد - آموزش مقدماتی opengl is kinda plain. You might look at Yahoo's
front page and watch how they create news headlines to get viewers interested.
You might add a related video or a related pic or two to get readers excited about everything've written. In my opinion, it might bring your posts a
little bit more interesting.
 
لبخندناراحتچشمک
نیشخندبغلسوال
قلبخجالتزبان
ماچتعجبعصبانی
عینکشیطانگریه
خندهقهقههخداحافظ
سبزقهرهورا
دستگلتفکر


درباره وبلاگ


امام صادق(ع) می فرمایند: «اِنُّ لِکلِّ شیءٍ زکاةً و زکاةُ العِلمِ اَنْ یُعَلِّمَهُ اَهلَهُ» برای هر چیزی زکاتی است،و زکات علم آن است که آن را به اشخاص شایسته بیاموزید. (منبع: تحف.ص 364)

امام علی (ع) می فرمایند: « زکات العلم نشرهُ» زکات علم نشر آن است.

مدیر وبلاگ : s1390
مطالب اخیر
نویسندگان
صفحات جانبی
آمار وبلاگ
  • کل بازدید :
  • بازدید امروز :
  • بازدید دیروز :
  • بازدید این ماه :
  • بازدید ماه قبل :
  • تعداد نویسندگان :
  • تعداد کل پست ها :
  • آخرین بازدید :
  • آخرین بروز رسانی :
فرم تماس
نام و نام خانوادگی
آدرس ایمیل
امکانات دیگر
دریافت كد ختم صلوات
کلیه حقوق این وبلاگ برای وب سایت دانشجویان کارشناسی و ارشد کامپیوتر خرم آباد محفوظ است