الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكله .. في التكرار - رسم نجمة (Opengl)

مغلق
بدأه ريما الحربي في 25 مارس 2007 · 7 رد · 5,063 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم .. ورحمة الله وبركاته

حاولت اطبق موضوع تكرار الشكل في نجمة ..

وزبطت معاااي تمااام مره وحده

والمرات الثانية حلفت ماتطلع لي الا خرابيط <_<

ياليت تشوفولي المشكله انا خفت من اعدادت البرنامج نفسه بس سويت كذا برنامج تمام الا هذااا ..

#include <windows.h>
#include <gl\gl.h>
# include <gl\glu.h>
#include <gl\glut.h>

static void redraw(void);

int main (int argc, char **argv)
{

glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | 
		GLUT_DEPTH);
	glutInitWindowPosition(100,100);
	glutInitWindowSize(600,600);
	glutCreateWindow("the five-pointed star");
	glutDisplayFunc(redraw);	
	glMatrixMode(GL_PROJECTION);					
	gluOrtho2D(-600,600,-600,600);

	glutMainLoop();
	return 0; 
}

static void redraw(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);


	glColor3f(1.0, 1.0, 0.0);
	{	int i;
	glTranslatef(150.0,-160.0,10.0);
	for(i=0;i<10;i++)
	{

   glBegin(GL_LINE_LOOP);
		glVertex2f(0, 30);//
		  glVertex2f(5,4);
		glVertex2f(30, 10);
		  glVertex2f(10, -10);
	 glVertex2f(20, -28);//
		  glVertex2f(1, -14);
		glVertex2f(-20, -28);
		  glVertex2f(-10, -10);
		glVertex2f(-30, 10);//
		  glVertex2f(-5, 4);


		glEnd();
glutSwapBuffers();
	}
}
}

h.bmp

تم تعديل هذه المشاركة بواسطة ريما الحربي في 25 مارس 2007 في 18:26

#2

اتقومين بمسح الشاشة في كل مرة ؟؟؟

الشاشة تُمسح مرة واحدة فقط قبل الرسم ...

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#3

مافهمت عليك اخوي ..

هذي داله دايم نستخدمها كذا ..

لمسح اي رسمة كانت ع الذاكرة .. ..والحين جربت شلتها تطلع لي صفحة الاخراج بس معلقه <_<

تم تعديل هذه المشاركة بواسطة ريما الحربي في 25 مارس 2007 في 20:52

#4

يوجد عدة أخطاء :

1- للمرة الثانية نقع في نفس الخطأ :) .

دائما وابدا .. اذا دخلت في مصفوفة الProjection ...

  glMatrixMode(GL_PROJECTION);
	 gluOrtho2D(-600,600,-600,600);

لازم نرجع مرة ثانية الى مصفوفة المودل :

glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

عشان نقدر نشوف المجسمات

2- الخطأ الثاني هو هنا

glTranslatef(150.0,-160.0,10.0);

المحور Z يجب ان لايتعدى صفر ( صفر فأقل .. عشان تقدر تشوف الرسم .. وبما انك تستخدم الاسقاط orthographic

فضع دائما المحور z = صفر .

هناك أمر لم اعرف ماذا تريد منه وهو الfor loop

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

انت ترسم شكل نجمة 10 مرات وفي نفس الموقع .. هل تريد أن ترسم عشر نجمات وفي مواقع متنوعة !!

اذا غير الاحداثيات لكل نحمة كالتالي :

الكود بشكله النهائي :

#include <windows.h>
#include <gl\gl.h>
# include <gl\glu.h>
#include <gl\glut.h>

static void redraw(void);

int main (int argc, char **argv)
{

glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE |	  GLUT_DEPTH);
	glutInitWindowPosition(100,100);
	glutInitWindowSize(600,600);
	glutCreateWindow("the five-pointed star");
	glMatrixMode(GL_PROJECTION);
	 gluOrtho2D(-600,600,-600,600);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glutDisplayFunc(redraw);	

	glutMainLoop();
	return 0; 
}

static void redraw(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
	glColor3f(1.0, 1.0, 0.0);
	{	int i;
	for(i=0;i<10;i++)
	{

	  glTranslatef(40+(i*2),10,0.0);

   glBegin(GL_LINE_LOOP);
		glVertex2f(0, 30);//
		  glVertex2f(5,4);
		glVertex2f(30, 10);
		  glVertex2f(10, -10);
	 glVertex2f(20, -28);//
		  glVertex2f(1, -14);
		glVertex2f(-20, -28);
		  glVertex2f(-10, -10);
		glVertex2f(-30, 10);//
		  glVertex2f(-5, 4);


		glEnd();
	}
	glutSwapBuffers();

}
}

تم تعديل هذه المشاركة بواسطة الشمري في 26 مارس 2007 في 13:53

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#5
الشمري كتب:
يوجد عدة أخطاء :

1- للمرة الثانية نقع في نفس الخطأ :) .

دائما وابدا .. اذا دخلت في مصفوفة الProjection ...

  glMatrixMode(GL_PROJECTION);
	 gluOrtho2D(-600,600,-600,600);

لازم نرجع مرة ثانية الى مصفوفة المودل :

معليش بس مافهمت هذي النقطه .. <_<

glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

عشان نقدر نشوف المجسمات

2- الخطأ الثاني هو هنا

glTranslatef(150.0,-160.0,10.0);

المحور Z يجب ان لايتعدى صفر ( صفر فأقل .. عشان تقدر تشوف الرسم .. وبما انك تستخدم الاسقاط orthographic

فضع دائما المحور z = صفر .

اهاااا .. معليش بس أول كوس هذااا وكل ساعه اخبص رسمه واسألكم ^^..

هناك أمر لم اعرف ماذا تريد منه وهو الfor loop

ايه هذا اللي ابغى اسويه ..

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

انت ترسم شكل نجمة 10 مرات وفي نفس الموقع .. هل تريد أن ترسم عشر نجمات وفي مواقع متنوعة !!

اذا غير الاحداثيات لكل نحمة كالتالي :

الكود بشكله النهائي :

#include <windows.h>
#include <gl\gl.h>
# include <gl\glu.h>
#include <gl\glut.h>

static void redraw(void);

int main (int argc, char **argv)
{

glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE |	  GLUT_DEPTH);
	glutInitWindowPosition(100,100);
	glutInitWindowSize(600,600);
	glutCreateWindow("the five-pointed star");
	glMatrixMode(GL_PROJECTION);
	 gluOrtho2D(-600,600,-600,600);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glutDisplayFunc(redraw);	

	glutMainLoop();
	return 0; 
}

static void redraw(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
	glColor3f(1.0, 1.0, 0.0);
	{	int i;
	for(i=0;i<10;i++)
	{

	  glTranslatef(40+(i*2),10,0.0);

   glBegin(GL_LINE_LOOP);
		glVertex2f(0, 30);//
		  glVertex2f(5,4);
		glVertex2f(30, 10);
		  glVertex2f(10, -10);
	 glVertex2f(20, -28);//
		  glVertex2f(1, -14);
		glVertex2f(-20, -28);
		  glVertex2f(-10, -10);
		glVertex2f(-30, 10);//
		  glVertex2f(-5, 4);


		glEnd();
	}
	glutSwapBuffers();

}
}

شكراً .. ويعطيك الف عافيه ..

بس معليش ممكن سؤال ..

الحين لو رسمت مثلا زي هذي النجمة .. بس كبيرة من غير تكرار ولا شيء

بس ابي وهي في نفس موضعهااا تتلون كل شوي بلووون .. يعني هنا انا كنت ابغى اسوي فضاااء واخلي هذي النجوم زي الشهب .. وبلعب الين تجي معي ..

وابي الحين داله تلون لي الشكل كل شوي ؟؟؟ فيه زي كذا ؟؟

#6

الامر بسيط متى مافهمت طريقة الرسم .. وطريقة تعيين الاحداثيات ..

سيتم رسم عدة نجوم ..

كل نجمة لها ( موقع - وحجم معين .. او لنقول مصفوفة matrix model خاصة بكل رسمة .

تستطيع ان تتحكم بموقع الرسمة عن طريق الازاحة glTranslatef

وتتحكم بحجم الرسمة (التحجيم ) عن طريق glScalef

وتتحكم بدوران الرسمة عن طريق glRotatef

وتحكم بلون الرسمة عن طريق الدالة glColor3f واخواتها .

وتستطيع ان تجعل الرسمة مجوفة( اي النجمة تكون بحدود دون تظليل داخلها بالالوان عن طريق الرسم بطريقة GL_LINE_LOOP وترسم نجمة مصمته عن طريق GL_POLYGON بشرط ان ترسم بشكل صحيح ,,,

مثال :

هذا المثال يوضح رسم 10 نجوم .. كل نجمة لها لون .. موقع .. حجم .. ودوران أيضا ...

#include <windows.h>
#include <gl\gl.h>
# include <gl\glu.h>
#include <gl\glut.h>

static void redraw(void);

int main (int argc, char **argv)
{

glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE |	  GLUT_DEPTH);
	glutInitWindowPosition(100,100);
	glutInitWindowSize(600,600);
	glutCreateWindow("the five-pointed star");
	glViewport(0,0,600,600);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0,600,0,600);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glutDisplayFunc(redraw);  
	glutIdleFunc(redraw);

	glutMainLoop();
	return 0; 
}
float j=0;
int i;
float rot=0;

static void redraw(void)
{
	rot+=0.16;
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	for(i=0;i<10;i++)
	{
		j+=50;
		glLoadIdentity();
		glTranslatef(40+j,40+j,0.0);
		glRotatef(rot,0,0,1);
		glScalef(1+(i*.1),1+(i*0.1),1);
	   		glColor3ub(rand()%255,rand()%255,rand()%255);

		glBegin(GL_LINE_LOOP);
		glVertex2f(0, 30);//
		glVertex2f(5,4);
		glVertex2f(30, 10);
		glVertex2f(10, -10);
		glVertex2f(20, -28);//
		glVertex2f(1, -14);
		glVertex2f(-20, -28);
		glVertex2f(-10, -10);
		glVertex2f(-30, 10);//
		glVertex2f(-5, 4);
		glEnd();

	}
	j=0;
	if(rot>360)rot=0;
	glutSwapBuffers();


}

لاحظ أني استخدمت الدالة glutIdleFunc عشان استدعي دالة الرسم عدة مرات ( تسوي loop للدالة)

ولاحظ أني عدلت قليلا في الview port و glOrtho2d ..

لاحظ أني استخدمت قيم عشوائية لانتاج تأثير يبدو لي أنه مقبول ..

		glColor3ub(rand()%255,rand()%255,rand()%255);

لاحظ اني اخترت مدى الالوان يكون واحد بايت .. ( 255 قيمة ممكنة) .. وهذا اسهل لانه يتيح لنا مجال اكبر من الارقام.

حاول تراجع المواضيع المثبة ..فيها دروس كافية ووافية ان شاء الله .. لشرح الاسس .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#7

مشكور اخوي الشمري

انت مافهمت قصدي .. اوك النجمة الوحده اكررهاا واغير لونهااا ..

لكن أبغى أرسم نجمة وحده واخلي لونها يتغير كل مثلا دقيقة .. نفس النجمه

هل في داله تسوي هذا الشيء ؟؟

أو من نفس البرمجه ...؟

ومشكوووووووووور

#8

مشكور اخوي الشمري

لقيت الحل حركة برمجية <<< غبيه بس غااابت عني

مشكوور ع جهودك ^^

هذا الموضوع مغلق.

مواضيع مشابهة