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

مشاكل تواجهني باستمرار في نافذة الرسم (تظهر شاشة التنفيذ ثم تختفي في ثوان معدودة)

بدأه ام دانية في 2 مايو 2012 · 13 رد · 1,380 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم مساء النور.

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

glutSwapBuffers();

glutIdleFunc(draw);

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT

);

تظهر شاشة الرن ثم تختفي في ثوان معدودة لماذا ؟؟

وايضا المخروط لا يتحرك بال دوران الاول له في الرم لماذا؟؟

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

#2

السلام عليكم ...

الــ glutSwapBuffers يجب ان تكون داخل دالة display..

الــ glutIdleFunc تكون داخل الــ main .

الــ glClear غالبا داخل الــ display .

الــ glutInitDisplayMode داخل الــ Main

مثال

ممكن وضع الكود كاملا كي نعرف أين المشكلة ...

لوضع كود ملف واحد فقط الصقه Paste بالمشاركة ..

أو اضغط على "استخدام الرد المطور الكامل" الذي يتيح لك إرفاق الملفات في المشاركة ..

تم تعديل هذه المشاركة بواسطة houssam11350_11350 في 2 مايو 2012 في 20:16

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3

اشعر ان المشكلة تكمن في هذة الدالة اذا حذفتها تظهر الرسمة لكن لاتتحرك

glutIdleFunc(draw);

#4

//#include "stdafx.h"

#include<gl/glut.h>

#include <gl/glut.h>

float x=10;

float y=6.5;

void draw()

{

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glLineWidth (4);///////////////////////ÍÏæÏ ÇáØÇæáå

glBegin(GL_LINE_LOOP);

glColor3f(0.0, 0.0, 0.0);

glVertex3i(25,5,0);

glVertex3i(21,23,0);

glVertex3i(10,23,0);

glVertex3i(6,5,0);

glEnd();

///////////////////////ÇáãÑÈÚ ÇáÇæá

glBegin(GL_POLYGON);

glColor3f(0,0,0);

glVertex2i(13,19);

glVertex2i(18,19);

glVertex2i(18,23);

glVertex2i(13,23);

glEnd();

/////////////////ÇáãÑÈÚ ÇáËÇäí

glBegin(GL_POLYGON);

glColor3f(0,0,0);

glVertex2i(9,19);

glVertex2i(13,19);

glVertex2i(13,14);

glVertex2i(8,14);

glEnd();

////////////////ÇáãÑÈÚ ÇáËÇáË

glBegin(GL_POLYGON);

glColor3f(0,0,0);

glVertex3i(18,14,1);

glVertex3i(18,19,1);

glVertex3i(22,19,1);

glVertex3i(23,14,1);

glEnd();

//////////////////////ÇáãÑÈÚ ÇáÑÇÈÚ

glBegin(GL_POLYGON);

glColor3f(0,0,0);

glVertex2i(13,14);

glVertex2i(18,14);

glVertex2i(18,9);

glVertex2i(13,9);

glEnd();

//////////////////////////ÇáãÑÈÚ ÇáÎÇãÓ

glBegin(GL_POLYGON);

glColor3f(0,0,0);

glVertex2i(13,9);

glVertex2i(13,5);

glVertex2i(6,5);

glVertex2i(7,9);

glEnd();

////////////////////ÇáãÑÈÚ ÇáÓÇÏÓ

glBegin(GL_POLYGON);

glColor3f(0,0,0);

glVertex2i(18,9);

glVertex2i(18,5);

glVertex2i(25,5);

glVertex2i(24,9);

glEnd();

///SolidCone step1

glPushMatrix();

glColor3f(1,0,0);

glTranslatef(x,y,2);

glRotatef(-90,1,0,0);

glutSolidCone(2, 3, 30, 30);

glPopMatrix();

//step 2

//WireCone step

glColor3f(1,0,0);

glTranslatef(10,6.5,2);

glRotatef(-90,1,0,0);

glutWireCone(2, 3, 6, 6);

// move cone .step 3

if (y==6.5&&x==10)

{ x=x+3.5;

y=y+4.5;

}

if(y==11&&x==13.5)

{ y=11;

x=13.5;

}

glutSwapBuffers();

}

/////////////////////////////////////////////

void Initial()

{

glClearColor(1,1,1,0);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(0,30,0,30,-30,30);

}

void main()

{

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

glutInitWindowSize(500,500);

glutCreateWindow("3D_Objects_Transformations");

Initial();

glutDisplayFunc(draw );

glutIdleFunc(draw);

glutMainLoop();

}

#5

السلام عليكم ...

هذه محاولة مني ..

//#include "stdafx.h"

#include<gl/glut.h>

#include <gl/glut.h>
float x=10;
float y=6.5;

float m = 0.0;
void draw()
{
	glViewport(10,25,    500 ,    500);

	glMatrixMode(GL_PROJECTION);    
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glClearColor(1.0, 1.0, 1.0, 1.0);

	glPushMatrix();
	glLoadIdentity();
	glOrtho(0,30,0,30,-30,30);



	//glLineWidth (4);///////////////////////ÍÏæÏ ÇáØÇæáå
	glBegin(GL_LINE_LOOP);
	glColor3f(0.0, 0.0, 0.0);
	glVertex3i(25,5,0);
	glVertex3i(21,23,0);
	glVertex3i(10,23,0);
	glVertex3i(6,5,0);

	glEnd();

	///////////////////////ÇáãÑÈÚ ÇáÇæá
	glBegin(GL_POLYGON);
	glColor3f(0,0,0);
	glVertex2i(13,19);
	glVertex2i(18,19);
	glVertex2i(18,23);
	glVertex2i(13,23);


	glEnd();
	/////////////////ÇáãÑÈÚ ÇáËÇäí
	glBegin(GL_POLYGON);
	glColor3f(0,0,0);
	glVertex2i(9,19);
	glVertex2i(13,19);
	glVertex2i(13,14);
	glVertex2i(8,14);


	glEnd();
	////////////////ÇáãÑÈÚ ÇáËÇáË

	glBegin(GL_POLYGON);
	glColor3f(0,0,0);
	glVertex3i(18,14,1);
	glVertex3i(18,19,1);
	glVertex3i(22,19,1);
	glVertex3i(23,14,1);

	glEnd();
	//////////////////////ÇáãÑÈÚ ÇáÑÇÈÚ
	glBegin(GL_POLYGON);
	glColor3f(0,0,0);
	glVertex2i(13,14);
	glVertex2i(18,14);
	glVertex2i(18,9);
	glVertex2i(13,9);


	glEnd();
	//////////////////////////ÇáãÑÈÚ ÇáÎÇãÓ
	glBegin(GL_POLYGON);
	glColor3f(0,0,0);
	glVertex2i(13,9);
	glVertex2i(13,5);
	glVertex2i(6,5);
	glVertex2i(7,9);

	glEnd();
	////////////////////ÇáãÑÈÚ ÇáÓÇÏÓ

	glBegin(GL_POLYGON);
	glColor3f(0,0,0);
	glVertex2i(18,9);
	glVertex2i(18,5);
	glVertex2i(25,5);
	glVertex2i(24,9);

	glEnd();
	//glPopMatrix();
	///SolidCone step1
	//glPushMatrix();
	glColor3f(1,0,0);
	//glTranslatef(x,y,2);
	//glRotatef(-90,1,0,0);
	//glutSolidCone(2, 3, 30, 30);
//    glViewport(10,25,    500 ,    500);
	//gluOrtho2D( -1,1 ,-0.4 ,1);
	//glutSolidCone(0.6 , 1 , 3 , 20);
	//glutSolidCone(0.6 , 1 , 3 , 20);
	//glPopMatrix();
	//step 2
	//WireCone step
	glColor3f(1,0,0);
	//glTranslatef(10,6.5,2);
	//glRotatef(-90,1,0,0);
	//glutWireCone(3, 3, 6, 6);
	//glutWireCone(0.6 , 1 , 3 , 20);
	// move cone .step 3

	glPopMatrix();

	glViewport(300 ,300 ,    200,    200);
	glPushMatrix();
	//gluOrtho2D( -1,1 ,-1 ,1);

	glColor3f(1.0f ,0.0f,0.0f);
	//glutSolidCone(20 , 1 , 3 , 20);
	m = m + 0.008;
	glTranslatef(m,0,0);
	glutWireCone(20, 1, 3, 6);

	glPopMatrix();


	if (y==6.5&&x==10)
	{ 
	    x=x+3.5;
	y=y+4.5;
	}
	if(y==11&&x==13.5)
	{ y=11;
	x=13.5;
	}
//glPopMatrix();
glutSwapBuffers();
}
/////////////////////////////////////////////
void Initial()
{
	glClearColor(1,1,1,0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(0,30,0,30,-30,30);
}
void idle(void) {
	glutPostRedisplay();
}
int main(int argc,char **argv)
{
	glutInit(&argc,argv);
	glutInitWindowSize(500,500);
	glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE| GLUT_DEPTH); 
	glutCreateWindow("3D_Objects_Transformations");
	Initial();
	glutDisplayFunc(draw);
	glutIdleFunc(idle);
	glutMainLoop();
	return 0;

}

تم تعديل هذه المشاركة بواسطة houssam11350_11350 في 3 مايو 2012 في 00:02

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#6

شكرا..

عندي مشكلة ببرنامج الفيجوال اجرب لاحقا

لكن لو تفضلت توضح لي ما التغييرات ولماذا

#7

السلام عليكم ..

اعتقد أني وضعت الــ Push و Pop بشكل صحيح و كذلك الــ SwapBufers , و لرسم المخروط في مكانه المناسب , استخدمت الــ viewport .. و وضعت الدالة IdleFunction

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#8

اخي لم افهم لماذا غيرت موقع البوش والبوب ثم المطلوب مني عمله غير الشكل الذي ظهر لي

كذا لك لم تظهر الحركة

ولماذا المخروط الواير لن يظهر كاملا

ولماذا اخترت الدالة هذة وما عملهاIdleFunction

#9

السلام عليكم ..

نقوم أولا بالــ Push ثم نرسم ثم الــ Pop ثم Swap ..

glutWireCone(20, 1, 3, 6);

بالنسبة للحركة , تم تعديل الكود في المشاركة السابقة ..

الــ Idle هو التابع الذي يتم استعاؤه بشكل دوري عندما لا يكون هناك أحداث أو نقرة مفاتيح ..

المخروط ربما لم يظهر بشكل كامل بسبب الــ ViewPort أو بسبب الأبعاد في دالة المخروط ..

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#10

#include<gl/glut.h>

#include <gl/glut.h>

float x=10;

float y=6;

static int f=0;

void draw()

{

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glPushMatrix();

glPushMatrix();

glLineWidth (4);///////////////////////ÍÏæÏ ÇáØÇæáå

glBegin(GL_LINE_LOOP);

glColor3f(0.0, 0.0, 0.0);

glVertex3i(25,5,0);

glVertex3i(21,23,0);

glVertex3i(10,23,0);

glVertex3i(6,5,0);

glEnd();

///////////////////////ÇáãÑÈÚ ÇáÇæá

glBegin(GL_POLYGON);

glColor3f(0,0,0);

glVertex2i(13,19);

glVertex2i(18,19);

glVertex2i(18,23);

glVertex2i(13,23);

glEnd();

/////////////////ÇáãÑÈÚ ÇáËÇäí

glBegin(GL_POLYGON);

glColor3f(0,0,0);

glVertex2i(9,19);

glVertex2i(13,19);

glVertex2i(13,14);

glVertex2i(8,14);

glEnd();

////////////////ÇáãÑÈÚ ÇáËÇáË

glBegin(GL_POLYGON);

glColor3f(0,0,0);

glVertex3i(18,14,1);

glVertex3i(18,19,1);

glVertex3i(22,19,1);

glVertex3i(23,14,1);

glEnd();

//////////////////////ÇáãÑÈÚ ÇáÑÇÈÚ

glBegin(GL_POLYGON);

glColor3f(0,0,0);

glVertex2i(13,14);

glVertex2i(18.5,14);

glVertex2i(18.5,9);

glVertex2i(13,9);

glEnd();

//////////////////////////ÇáãÑÈÚ ÇáÎÇãÓ

glBegin(GL_POLYGON);

glColor3f(0,0,0);

glVertex2i(13,9);

glVertex2i(13,5);

glVertex2i(6,5);

glVertex2i(7,9);

glEnd();

////////////////////ÇáãÑÈÚ ÇáÓÇÏÓ

glBegin(GL_POLYGON);

glColor3f(0,0,0);

glVertex2i(18,9);

glVertex2i(18,5);

glVertex2i(25,5);

glVertex2i(24,9);

glPopMatrix();

glEnd();

///SolidCone step1

if(f==1){

glPushMatrix();

glColor3f(1,0,0);

glTranslatef(x,y,2);

glRotatef(-90,1,0,0);

glutSolidCone(2, 3, 30, 30);

glPopMatrix();

}

//step 2

//WireCone step ==

if(f==2){

glColor3f(1,0,0);

glTranslatef(10,6,2);

glRotatef(-90,1,0,0);

glutWireCone(2, 2.5, 6, 6);

// move cone .step 3

{

if (y<10&&x<15.5)

{ x=x+1.375;

y=y+1;

}

if(y==10&&x==15.5)

{ y=10;

x=15.5;

}

}

}

//step 3 draw sphere

//glMatrixMode(GL_MODELVIEW);

glutSwapBuffers();

}

/////////////////////////////////////////////

void Initial()

{

glClearColor(1,1,1,0);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(3,30,3,30,-30,30);

}

void keyboard(unsigned char key,int x,int y)

{

switch(key)

{

case '1':

f=1;

break;

case '2':

f=2;

break;

}

glutPostRedisplay();

}

void main()

{

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

glutInitWindowSize(500,500);

glutCreateWindow("3D_Objects_Transformations");

Initial();

glutDisplayFunc(draw );

glutIdleFunc(draw);

glutKeyboardFunc(keyboard);

glutMainLoop();

}

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

لكن عندي مشكلة عندما طورت البرنامج الى التفاعل مع المستخدم عند الضغط على المفتاح 2 نفس المشكلة تظهر الشاشة وتختفي

#11

المشكلة انحلت نفس فكرة الحل الاولى

شكرا

#12

ياليت احد يوضح بالتفيصل فوائد بوب والبوش لكل جزء من البرنامج

وشكرا مقدما

#13

السلام عيلكم...

إذا كان التحريك أعلى دالة بوش فإن كل ما هو مرسوم بين الداليتين بوش و بوب سيطبق عليه التحريك....

أما إذا كان التحريك أسفل دالة بوب فإن كل ما هو مرسوم بين الداليتين بوش و بوب لن يحدث له شيء من التحريك..

مثال0 :

بوش

رسم

بوي

تحريك

دوران

في هذا المثال 0, كل ما هو مرسوم بين دالتي "بوش" و "بوب" سيبقى ساكنا.

مثال1 :

تحريك

دوران

بوش

رسم

بوب

في هذا المثال 1 , كل ما هو مرسوم بين دالتي "بوش" و "بوب" سيتم تحريكهما بالدالتين "تحريك" و "دوران".

مثال2 :

تحريك

دوران

بوش

رسم 1

بوب

بوش

رسم 2

بوب

في هذا المثال 2 , كل ما هو مرسوم بين دالتي "بوش" و "بوب" لدى كل من "رسم "1 و "رسم 2" سيتم تحريكهما بالدالتين "تحريك" و "دوران".

مثال3 :

تحريك 1

دوران 1

بوش

رسم 1

بوب

تحريك 2

دوران 2

بوش

رسم 2

بوب

في هذا المثال 3 , كل ما هو مرسوم بين دالتي "بوش" و "بوب" عند "رسم 1" سيطبق عليها "التحريك 1" و "الدوران 1" , و تماما مثلما قلنا في المثال الثاني , فهنا "رسم 2 " سيتطبق عليها أيظا "التحريك 1" و "الدوران 1" .

و من ناحية ثانية أي إضافة إلى التحريك و الدوران "التحريك 1" و "الدوران 1" هنا تحريك آخر و الذي هو "التحريك 2" و "الدوران 2" و الذي سيعمل على تحريك و دوران "الرسم 2 ".

مثال4 :

بوش 1

التحريك 1

الدوران 1

الرسم 1

بوب 1

في هذا المثال 4 , سيعمل " التحريك 1 " و " الدوران 1 " على تحريك " الرسم 1" , أما خارج " بوب 1" و " بوش 1" فلن يعمل التحريك..

مثال5 :

بوش 1

التحريك 1

الدوران 1

الرسم 1

بوب 1

بوش 2

التحريك 2

الدوران 2

الرسم 2

بوب 2

في هذا المثال 5 , سيعمل " التحريك 1 " و " الدوران 1 " على تحريك " الرسم 1" , داخل " بوب 1" و " بوش 1" و سيعمل " التحريك 2 " و " الدوران 2 " على تحريك " الرسم 2" , داخل " بوب 2" و " بوش 2" .

مثال6 :

تحريك 1

دوران 1

بوش 1

رسم 1

بوش 2

رسم 2

بوب 2

تحريك 2

دوران 2

بوب 1

في هذا المثال 6 , كل ما هو مرسوم بين دالتي "بوش 1" و "بوب 1" سيتم تحريكهما بالدالتين "تحريك 1" و "دوران 1". و "تحريك 2 " و " دوران 2 " فلن يأثر على " رسم 2 ".

تخيل, هل سيكون مستقبل الأوبن جي أل مع البشرية هكذا

future.jpg
#14

شكرا اخي الفاضل

على الشرح الوافي

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…