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

الدرس الأول Graphics In C++ Using OpenGL

رائج
بدأه Final Heaven في 6 مارس 2007 · 41 رد · 59,842 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

لقد تعلمت الغرافيكس في كورس طويل في الجامعة و إستفدت منه الكثير و بصراحة أحببت أن أوصل ما تعلمته فقررت البدأ بوضع دروس لما تعلمته

و أتمنى من الله التوفيق، سيكون تركيزي في هذه الدروس على غرافيكس بالمفهوم و لكن بإستخدام OpenGL فهي ما إستخدمته و لما فيها من

إمكانيات رائعة

سأحاول بقدر ما أستطيع التحدث عن:

Simple OpenGL Programs - WorldWindow and Viewports - Vector Operations + Cliping - Camera

Modeling Objects (Meshing) - Light and 3D Color In Open GL - Hiden Surface Removal

و لقد رأيت الكثير من الدروس الرائعة الموجودة في داخل المنتدى و سأستعين بها في شرحي بإذن الله

هذا مقال للأخ CompuM4n و فيه مقدمة جميلة عن OpenGL

سلسلة دروس OpenGL

هنا مقال الأخ علي الدعيج رحمه الله مقدمة عن OpenGL

الدرس رقم صفر

و هذا لموضوع فيه جميع دروسه

مجموعة دروس OpenGL

و هذه لفصول كتاب جميل أعتقد أنه مترجم من Redbook و فيه شرح رائع و جميل، جزى الله الإخوة الذي عملوا على وضعه

بذور كتاب الـ OpenGL

و سأكون معتمدا على هذه الكتب أيضاً:

Graphics In C++ Using OpenGL: Francis S Hill

Red Book For OpenGL

Blue Book For OpenGL

أما IDE الذي سأقوم بإستخدامه هو منصة Dotnet أي أن عملي هو على C++.Net

و سأعتمد بشكل رئيسي على OpenGL Utilities Toolkit و التي هي GLUT 3.7.6

و هاهية الملفات الخاصة بها مع و مكان وضعها لإستخدامها:

glut_3.7.6_bin.zip

GLUT.h File

VC\PlatformSDK\Include\gl\GLUT.h

glut32.lib File

VC\PlatformSDK\Lib\glut32.lib

glut32.dll File

WINDOWS\system32\glut32.dll

أما الآن فطريقة فتح project جديد لكتابة الكود فهناك إثنان:

newproject -> win32console application -> empty application

newproject -> CLR console application

فالأولى هي لكتابة standard c++ code على منصة دوت نت

أما الثانية فهي تتيح لنا إستخدام managed code في برنامجنا مما يتيحلنا الإستفادة من نظام دون نت و تسهيل عملنا بشكل كبير

و لكني سأعتمد على النظام الأول لإعتمادي على standard code

تم تعديل هذه المشاركة بواسطة Final Heaven في 6 مارس 2007 في 11:29

1

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#2

و الآن سأبدأ الحديث عن كيفية بداية كتابة كود يستخدم OpenGL

علينا أن نبدأ بمناداة المكتبات الخاصة

#include <windows.h>   // use as needed for your system

و سبب إحتياجي لها أن OpenGL سيقوم بمنادات الكثير من الأوامر الموجودة فيها لبناء Screen window

و ثانيا علينا منادات مكتبات OpenGL الموجودة في دوت نت مع GLUT التي وضعناها

#include <gl/Gl.h>
#include <gl/glut.h>

و الآن علينا بكتابة function لإستخدامها في عمل initialize للحجم النقط و لون الخلفية و لون الرسم و حجم و مساحة المكان الذي سأرسم فيه ... إلخ

و هذه تقريبا ستكون ذاتها في كثير كثير من البرامج مع تعديلات طفيفة بحسب ما تريد

//<<<<<<<<<<<<<<<<<<<<<<< myInit >>>>>>>>>>>>>>>>>>>>
void myInit(void)
{
	glClearColor(1.0,1.0,1.0,0.0);	   // set white background color
	glColor3f(0.0f, 0.0f, 0.0f);		  // set the drawing color 
	glPointSize(4.0);			   // a ‘dot’ is 4 by 4 pixels
	glMatrixMode(GL_PROJECTION); 
	glLoadIdentity();
	gluOrtho2D(0.0, 640.0, 0.0, 480.0);
}

و الإسم لهذه function أضعه كما أريد لأني سأقوم بمناداتها من main

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

نعلم بنظام RGBA و الذي هو Red Green Blue Alpha و هو في عديد من إستخداماته أضع الألوان بإختيار رقم بين 0 و 255 أما هنا

فبين 0 و 1 و اللون المطلوب ليكون خليفة هو اللون الأبيض

السطر الثاني لتحديد اللون الذي سأستخدمه في الرسم و هو بنظام RGB فقط و أيضا من 0 إلى 1 و لكن لاحظوا في نهاية الأمر نرى 3f و هي تعني

عدد المرسلات و نوعها فعنما نرى 3i فهذا يعني بأن عدد المرسلات هو 3 و نوعها Integer و أما f فتعني float

أما السطر الثالث فأقوم به بتحديد حجم النقطة التي أرسم بها في البرنامج و أقول له له بأن النقط تعني كم pixel على الشاشة

السطر الرابع و الخامس أقوم بتحديد نظام الرسم و التحويل من buffer إلى الشاشة مع تفعيله و سنرى إستخدامها و المعنى الخاص بها بالضبط في

دروس قادمة إن شاء الله

أما السطر الأخير فهو لتحديد مساحة الرسم و تأخذ أربعة أمور و هي أطراف مكان الرسم أي بمعنى آخر:

gluortho2D

(فوق, تحت , يمين , يسار )

و عندما أرسل مثلا

gluortho2D

( -5 , 5 , -5 , 5 )

فمعناها بأن مساحة الرسم ما بين -5 و 5 في العرض و ما بين -5 و 5 في الطول و لكن دعونا من هذه الآن و أن نستخدم الأرقام التي في الأعلى حتى أقوم بشرح viewport

و التي تؤخذ هنا default و التي هي نفس مساحة الرسم التي وضعتها و هذه الميزة تستخدم للتحويل الآلي لمجال مساحة الرسم إلى الشاشة بالحجم و المكان الذي أريده عليها

و لا أريد إكمال الشرح في هذا الموضوع الآن كي لا تشعروا بالضياع

أما الآن فعلينا بوضع function و هي التي تكون مسؤولة عن الرسم في بداية البرنامج و إعادة الرسم بعد حالتي minimize و clipping

و تقدر أن تضع أية إسم لها لأنني سأعطيها لل OpenGL في main كي يستخدمها و لكن عليها أن تكون void و تأخذ void و سنرى كيف يمكنني معرفة

ما يجب أن تأخذ أو ترجع أي function أريد إعطائها لل OpenGL ليعتمدها في عمل معين و هو عن طريق رؤية Header File الخاص ب GLUT

//<<<<<<<<<<<<<<<<<<<<<<<< myDisplay >>>>>>>>>>>>>>>>>
void myDisplay(void)
{
	glClear(GL_COLOR_BUFFER_BIT);	 // clear the screen 
	glBegin(GL_POINTS);
	glVertex2i(100, 50); // draw three points

	glVertex2i(100, 130);

	glVertex2i(150, 130);
	glEnd();	
	glFlush();						 // send all output to display 
}

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

أما السطر الثاني فهذا أمر في OpenGL أرسل له نوع الرسم الذي أريده من النقط التي سأكتبها بعده

و أما السطور الثلاثة الأخرى فقمت بإرسال نقاط ثلاث لرسمها كنقاط لأنني أرسلت ل glBegin ما يعني له بأن الرسم سيكون نقط

و لا حظوا glVertex2i فهذا الأمر أرسل له النقاط المطلوبة فهو يأخذ نقطتان معتمداعلى مساحة الرسم التي حددت في الأعلى و التي هي gluortho2d

فكما قلنا سابقا 2 تعني مرْسَلان و i تعني integer

و بعد إنتهائي من رسم النقاط المطلوبة علي إغلاق مجال رسم النقط و أضع glEnd و التي تعني بأن النقاط المكتوبة ما بين glBegin و glEnd سترسم بنظام

المطلوب منها و المرسل إلى glbegin في الأعلى، فإن قمنا بإرسال GL_LINES فإنها ستقوم بأخذ كلّ نقطتين على حده و ترسم بينهما خطاً و أما GL_LINE_STRIP

فإنها ستوصل كل النقاط ببعضها البعض حتى تصل إلى آخر نقطة موجوة ما بين glbegin و glend و أما إن قمنا بإرسال GL_LINE_LOOP فإنها ستوصل كل النقاط ببعضها

البعض و توصل أيضا النقطة الأخير بالنقطة الأولى

و أخيراً السطر الأخير و الذي يعني أرسل ما رسم في buffer إلى الشاشة كي يشاهد

و هنا سنرى ثلاث نقط باللون الأسود

و أخيرا علينا الآن بكتابة Main للبرنامج

و سنرى تغييرا عما تعلمناه في برمجة c++ العادية

//<<<<<<<<<<<<<<<<<<<<<<<< main >>>>>>>>>>>>>>>>>>>>>>
void main(int argc, char** argv)
{
	glutInit(&argc, argv);		  // initialize the toolkit
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // set display mode
	glutInitWindowSize(640,480);	 // set window size
	glutInitWindowPosition(100, 150); // set window position on screen
	glutCreateWindow("my first attempt"); // open the screen window
	glutDisplayFunc(myDisplay);	 // register redraw function
	myInit(); 
	glutMainLoop(); 			 // go into a perpetual loop
}

فهنا نرى بأن ال main تأخذ مرسلين يحتاجهما لإستخدام مكتبة OpenGL

و في السطر الأول أرسل هذين المرسلين ل function خاصة ب OpenGL لتفعيلها

في السطر الثاني أحدد نوع Buffer المستخدم و الألوان

في السطر الثالث أحدد حجم الشاشة screen التي سأظهر الرسوم عليها

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

من اليسار تبعد 100 pixel و من الأعلى تبعد 150 pixel

السطر الخامس أرسل أمر لإنشاء Screen Window و التي ستظهر عليها الرسوم و أرسل لها Title أي عنوان للForm الذي سيظهر

السطر السادس علي الآن تحديد function التي سيستخدمها OpenGL للرسم و إعادة الرسم و أرسلة له إسم function التي كتبتها ليستخدمها

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

أما السطر الأخير فهو كي تبقى main تعمل و إلا فستظهر الصورة و تختفي بسرعة لإنتهاء البرنامج إن أزيل هذا السطر

و هذا الملف الذي قمت بشرحه في المرفقات:

threeDots.CPP

و هذه صورة للنتيجة:

post-84360-1173176904.jpg

و الله وليّ التوفيق

تم تعديل هذه المشاركة بواسطة Final Heaven في 6 مارس 2007 في 13:29

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#3

السلام عليكم

ألف شكر لك أخي العزيز على الدرس

شرح جميل و واضح

و السلام

#4

شكرا لك يا أخ عمار

و الآن يا إخوتي سنقوم بالعمل على رسم بعض الأشكال لفهم عملية الرسم بشكل جيد في OpenGL

فالكود الموجود في الأعلى هو ذاته ما سنستخدم و الشئ الوحيد الذي سيكون عليه التغيير هو function myDisplay

أما باقي الأوامر فسبتقى ذاتها تقريباً، و إن أردت تغييرا آخر غير إسم title ل screen window في main

كما رأينا سابقاً بأننا حددنا مساحة الرسم و التي هي gluortho2d و هذه تستخدم لعمل رسومات 2D و سنرى لاحقاً

كيف نقوم بعمل رسومات 3D و عندها سيكون تحدي لمن يستطيع عمل برنامج 3D Robot يتحرك و ذا ألوان ثلاثية الأبعاد

مع منزل يدخل إليه و أهم شئ أن يكون لدينا Hidden Surface Removal بصراحة هذا البرنامج كان أحد Assignments

التي قمنا بها بالجامعة و لا أخفيكم كان أرحمها :wacko:

لنعد إلى موضوعنا، فكما قلنا حددنا مساحة الرسم بخط العرض من 0 إلى 640 و خط الطول من 0 إلى 480

أي أن النقاط التي سأقوم برسمها عليها أن تقوم بين هذه الأرقام و أي رقم أضعه في نقطة لترسم فإن برنامج سيقوم

بعمل بما يسمى Clipping سأقوم بشرحه لاحقا و لكن في مفهومه البسيط عدم العمل على رسم أي نقطة خارج إطار الرسم

دعونا نرى الآن كيف نقوم برسم عدة أشكال، التعديل سيكون فقط على Function myDisplay

لنرسم خطاً مستقيما بإستخدام GL_LINE_STRIP و كما رأينا شرحها سابقا بأنها توصل جميع النقاط بخط واحد حتى تصل إلى

النقطة الأخيرة و تقف عندها:

void myDisplay(void)
{
	glClear(GL_COLOR_BUFFER_BIT);	 // clear the screen 
	glBegin(GL_LINE_STRIP); 
	glVertex2i(50, 100);	// draw the chimney 
	glVertex2i(50, 120);
	glVertex2i(60, 120);
	glVertex2i(60, 110);
	glEnd();
	glFlush();						 // send all output to display 
}

لا حظوا بأن النقاط أخذت في المساحة المطلوبة ما بين 0 إلى 640 عرض و ما بين 0 إلى 480 طول

بأننا إستخدمنا glVertex2i و كما تذكرون بأن i تعني بأنها ستأخذ Integer values

(نقطة على خط الطول, نقطة على خط العرض)

glVertex2i

2f

3i

3f

و أما في حالة 3i أو 3f فإنها تأخذ نفس المعنى مع زيادة النقطة على الخط الثالث و الذي هو Z-Axis و

الذي نستخدمه في العمل على 3D Objects

و هذه صورة الرسم:

post-84360-1173243750.jpg

و إستخدام GL_LINE_LOOP هو ذاته لافرق و تستطيع رؤية عملها من تطبيقه على البرنامج نفسه فقط

تقوم بتغيير ما بداخل glBegin من GL_LINE_STRIP إلى GL_LINE_LOOP

و الآن دعونا نرى كيف نرسم مربعا أو شكلا رباعي الأضلاع و هو إستخدام glRecti و التي تأخذ نقطتان

و الذان هما طرفا المربع أو المستطيل المعاكسان، أي النقطة التي في أقصى اليسار السفلي و النقطة

التي في أقصى اليمين العلوي و طبعا نقدر على عكس النقطتين و لكن سيحدث تغيير في الرسم بأن الشكل الرباعي

بدلا من رسمه من النقطة السفلى صعودا إلى النقطة العليا، سينعكس عملها و يبدأ من النقطة العليا إلى السفلى

و لكن لا مشكلة فيها و أنظروا إلى سهولة إستخدامها:

//<<<<<<<<<<<<<<<<<<<<<<<< myDisplay >>>>>>>>>>>>>>>>>
void myDisplay(void)
{
	 glClearColor(1.0,1.0,1.0,0.0); // white background 
	 glClear(GL_COLOR_BUFFER_BIT);  // clear the window
	 glColor3f(0.6,0.6,0.6);		  // bright gray
	 glRecti(20,20,100,70);
	 glColor3f(0.2,0.2,0.2);		  // dark gray
	 glRecti(70, 50, 150, 130);
	 glFlush(); 
}

و هذا هو الشكل:

post-84360-1173244405.jpg

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#5
اقتباس
سأحاول بقدر ما أستطيع التحدث عن:

Simple OpenGL Programs - WorldWindow and Viewports - Vector Operations + Cliping - Camera

Modeling Objects (Meshing) - Light and 3D Color In Open GL - Hiden Surface Removal

رائع ..

انا اريد ان افهم برمجة الجرافكس وليس OpenGL .. :) .,,,

تابع .. ليصبح الموضوع مرجع ,

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#6

إن شاء الله أخيّا و لكن صبراً حتى أنهي الأساس

كما تحدثنا سابقاً عن الأوامر التي أستطيع من خلالها الرسم، و هذه الصورة ترينا جميع الأوامر التي نقدر على

إستخدامها في glBegin و التي أخذتها من أحد الأجزاء من الكتاب المترجم في الأعلى:

post-84360-1173273884.png

و التي نرى من خلالها شروحات لما أقدر على إستخدامه، و تستطيع رؤية التطبيق لهذه الأوامر في Redbook

و الكتاب المترجم أيضاً فتطبيقها سهل جدا كما رأينا سابقا

و الآن سأتحدث من Mouse Events و Keyboard Events

و الجميل أننا سنتعامل معها كما تعاملنا مع myDisplay بحيث أقوم بتعريف أي function أحتاجها و أطلب

من OpenGL إستخدامها للغرض المراد و لكن بشروط و سنرى ما هي، كما و أنك إن أردت رؤية أموامر أخرى

تريدها تستطيع الوصول إليها و ترى الشروط لها عن طريق البحث في ملف glut.h

أو الذهاب من خلال IDE عبر right click على include الخاصة بها و الضغط على الإختيار الذي يقوم بفتح الملف

و هكذا نكتب function ل mouse و هناك عدة functions غيرها نجدها في header file و لها إستخدامات عديدة

و ها هي function mouse و هي لبرنامج يقوم بأخذ نقطتين من mouse و يرسم Rectangle بينها

//<<<<<<<<<<<<<<<<<<<<<<<< myMouse >>>>>>>>>>>>>>>>>
void myMouse(int button, int state, int x, int y)
{
	static GLintPoint corner[2];
	static int numCorners = 0;				// initial value is 0
	if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
		corner[numCorners].x = x;
		corner[numCorners].y = screenHeight - y;	// flip y coordinate
		numCorners++;					// have another point
		if(numCorners == 2){
			glRecti(corner[0].x, corner[0].y, corner[1].x, corner[1].y);
			numCorners = 0;				// back to 0 corners
		}
	}
	else if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN){
		glClear(GL_COLOR_BUFFER_BIT);			// clear the window
	}
	glFlush();
}

و كما نرى عليها أن ترجع void و تأخذ أربع:

الأولى و هي button و هي لنتأكد من أن الزر الذي ضغط هو المطلوب (الأيمن أم الأيسر أم الأوسط)

و الثانية للتأكد من أنها ضغطت

أنظر إلى if statement لترى كيف إستخدمناهما

و الثالثة و الرابعة هما النقطة على خط العرض و هي X و الأخرى هي النقطة على خط الطول و هي Y

و لكن علي التنويه بأن Y في حالة الرسم العادية أرصد مكانها من حيث أن الجهة اليسرى السفلى هي (0,0)

أما في Mouse فإن الجهة العليا اليسرى هي (0,0) و لذا عند الرسم علينا طرح طول Screen من Y التي أتت

من Mouse و ترون في المكود screenHeight-Y و هذه كما حددنا الطول من البرنامج الأول أي Y - ي480

لأن Y قيمتها عند Mouse ترصد من أعلى إلى أسفل و في حالة الرسم كرسم Rectangle أحددها كأني أقرأ

من أسفل إلى أعلى

فهنا عند الضغط على الرز الأيسر يأخذ البرنامج X و Y ثم يسجلها في array من رقمين لكلاس GLintPoint

كتبت من قبل المبرمج و هاهية:

class GLintPoint{
 public:
	 GLint x,y;
 };

و من ثمّ بتأكد من أن النقطتان أخذتا ليقوم برسم rectangle

و نجد أيضا بأننا عندما نضغط على الرز الأيمن للmouse نقوم بمسح الشاشة من ما قمنا برسمه

و علينا أن ننوه إلى أن هذا الكود كي يعمل علينا إضافة هذا الكود إلى Main و هو لإخبار OpenGL

عن function المسؤولة عن Mouse Events

glutMouseFunc(myMouse);

و ها هو كود البرنامج:

FIG2_38_Mouse.CPP

تم تعديل هذه المشاركة بواسطة Final Heaven في 7 مارس 2007 في 19:13

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#7

و الآن علينا أن نكمل بالعمل على Keyboard Events و التي نتبع فيها الطريقة ذاتها بالتعامل ل Mouse Events

أنظروا إلى الكود:

//<<<<<<<<<<<<<<<<<<<<<<<< myKeyboard >>>>>>>>>>>>>>>>
void myKeyboard(unsigned char theKey, int mouseX, int mouseY){
	GLint x = mouseX;
	GLint y = screenHeight - mouseY; // flip the y value as always
	switch(theKey)
	{
	case 'p':
		drawDot(x, y);	// draw a dot at the mouse position
		glFlush();	
		break;
	case GLUT_KEY_LEFT: List[++last].x = x; // add a point
		List[  last].y = y;
		break;
	case 'e':
		exit(-1);		//terminate the program		
	default: 
		break;			  // do nothing
	}
}

و كما نرى بأنها تأخذ الحرف الذي ضغط على Keyboard مع مكان وجود Mouse

و لاحظوا معي أنني هنا أيضا قمت بطرح طول Screen من Y التي تخص Mouse لنفس السبب السابق

و نرى فيها بأن كاتب البرنامج يستخدم switch لمعرفة الرز الذي ضغط و بهذه البساطة نستخدم هذه Events

ثمّ علينا تعريف OpenGl بها من خلال إعطائه إياها في Main و هي:

glutKeyboardFunc(myKeyboard);

و لكن علينا أن نعلم بأن هذه function التي تخص Keyboard Events لا تعمل سوى على بعض المفاتيح

على Keyboard و تهتم بالأحرف و لكن هناك أخرى نستطيع إستخدامها موجودة في Header File و تعمل

على جميع أزرار Keyboard سأتركها لكم لتبحثوا عنها (بصراحة خلال ثوان ستجدونها في Header )

و هذا كود البرنامج:

FIG2_41_keyboard.CPP

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#8

و إليكم هذا الكود المفيد ايضا عن إستخدام glBegin

rb2_1.cpp

و التحدي الآن هو عمل برنامج Paint و ما تعلمناه كافٍ و وافٍ، و صدقوني لو قرأتم و قرأتم لن تستفيدوا شيئا

حتى تقوموا بتطبيق ما تعلّمتم و صدقوني كان هذا كله جزءاً من محاضرة (المحاضرة الأولى) سلمنا بناءً عليه في

محاضرتنا التالية برنامج Paint ك Assignment ، و صدقوني ليست بالصعوبة التي قد تتصوّرون فأروني

همّتكم إن رغبتم

و هذا هو البرنامج الذي قمت به وقتها:

(تحتاج لتشغيله وجود Dotnet framework 2.0 مع وجود ملف glut32.dll في windows\system32)

Paint.zip

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#9

وصلة الدرس الثاني

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#10

نظرا لكثرة السؤال عن أكواد جاهزة للدرس إرتأيت إلى وضع كتاب Red Book مع الأمثلة الخاصة به

مع بعض الأمثلة من كتاب F.Hill و التي لم تكن كاملة في أصلها

كتاب Red Book

OpenGl_Redbook_Addison_Wesley.zip

أمثلة الكتاب Red Book Code Examples

Red_Book_Examples.zip

أمثلة بسيطة من كتاب F.Hill

L2_Examples.zip

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#11

لو سمحت ممكن تشرح لنا دالة تغير اللون بعد مرور فترة من الزمن في نفس الشكل يعني مثلا الشكل المربع لونه احمر بعد ثانية صار لونه ازرق الدالة او الطريقة

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

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

وشكرااااااااااااااا

#12

هناك مكتبة إسمها ctime

حيث تكتبين

#include <ctime>

مما يمكنك من إستخدام

time_t  told = (unsigned int) time(NULL);

حيث يقوم بإرجاع عدد الثوان من سنة 1970

و الطريقة التي قمت بإستخدامها في برنامج لي هي أن أقوم بتسجيل هذه الثوان في أول البرنامج

و أقوم بأخذ الثوان مرة أخرى و أطرحها من الثوان الأولى التي سجلتها و أرى إن كان التوقيت

الذي أريد قد مر أم لا و لزيادة المفهوم هذه دالة تقوم بعمل ما بداخل if كل خمس ثوان

time_t told = (unsigned int) time(NULL);
time_t tnew;

while( CONDITION ){
	 tnew = (unsigned int) time(NULL);
	 if( tnew - told >= 5 ){
		 //do here ur work then


		  told=tnew;
	 }
}

هذا الكود سيفيد في وضع أوقات محددة لتغيير شئ ما و هناك طريقة أخرى بإستخدام function إسمها glutTimerFunc

إقرئي عنها و هي تقوم بعمل إعادة مناداة function معينة كل فترة من الزمن

و الآن لتغيير اللون عليك بإستخدام كود glColor3f قبل الرسم كي يرسم باللون الذي تريدين و إن أردت تغيير اللون

تلقائيا و بشكل عشوائي إستخدمي كمرسلات لها

( rand() % 256 ) / 255.0

فهذه المعادلة سوف تعطيك رقما عشوائيا ما بين 0 و 1

أما للرسم بشكل دائري قومي بقراءة circle conversion في الدرس الثاني إن فهمت مقصدك

بالتوفيق

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#13

الف شكر صراحة استفدت لكن ممكن تعطينا مثال اجربوا في جهازي عشان اشوف يطلع رن ولا لاء لاني عملتوا وموا راضي يطلع رن اخاف يكون من نفس الجهاز حقي وابغي اتاكد .

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

#14

كتبت لك هذا المثال الذي يقوم برسم دائرة و تحريكها و يتغير لونها كل 3 ثوان بشكل عشوائي

Executable File

randomClor_Timer_Executable.zip

Code

randomClor_Timer_Code.zip

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#15

الف شكر يااخ حقيقة انت انسان متميز والف شكر علي المساعدة

#16

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

لو سمحت يا لخ final heaven

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

وشكرااااا

#17

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

لدي رجاء منك يا أختي

أولا أتمنى منك عدم جعل أي سؤال يخص شخصا محددا في المنتدى كي يقوم آخرون بإجابتك أيضا و المساعدة

ثانيا أتمنى منك وضع مواضيعك ذات الأسئلة من هذا القبيل في موضوع جديد ليكون بين المواضيع الجديدة و يقوم

كل من يدخل المنتدى العزيز برؤيته و يرى إن كانت لديه المقدرة على المساعدة

ثالثا أتمنى أن يكون الرد على هذا الموضوع فقط في إطار الدرس الذي فيه

رابعاً أتمنى منك وضع الكود الذي قمت به كي نرى أخطائك و نساعدك على فهمها بإذن الله

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#18

مشكور علي ذوقك ومعليش علي الازعاج وانا لوماكنت واثقة من اجابتك ما خصيتك ولك جزيل الشكر

#19

أختي مشكورة على هذه الثقة و لكن هناك من في المنتدى من هو أكثر مني خبرة في هذا المجال و تخصيصك

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

و كما و أني مشغول و علي درس كثير و ضغط كبير لأنني في الأسابيع الأخيرة في الجامعة

مما يمنعني من التواجد و المساعدة لفترة من الزمن

و صدقيني أنا تلميذ لدى أصحاب الخبرة في هذا المنتدى الرائع

بالتوفيق

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#20

(h) عزيزي الكريم لو سمحت أريد كود بإستخدام open gl

يحرك المستخدم الفأرة فيرسم البرنامج خط ويرسم كذلك البرنامج خط عكس اتجاة الفأرة (h)

#21

(h) أخي العزيز لو سمحت أريد كود بإستخدام open gl يحرك المستخدم الفأرة فيرسم ويرسم كذلك في الإتجاة المعاكس :huh:

#22

لأخFinal Heaven تفضلت مشكوراً بشرح وافي ل Graphics In C++ Using OpenGL وكان من التطبيقات اللافته للنظر هو تطبيق Paint فهل من الممكن أن تعطيني الكود لهذا التطبيق أو على الأقل الطريقة لعمله أو ترشيدني لما يعينني على كتابته ثم ما هو الDotnet framework 2.0 لأن البرنامج لا يعمل بشكل كامل عندي وجزاك الله خيراً

#23

إن شاء الله سأشرح طريقة عمله إن شاء الله و لكن إصبر علي أسبوعين حتى أنهي إمتحاناتي

Dotnet Framework 2.0 هو Runtime Environment خاص بالبرامج المكتوبة بلغة Dotnet

تقدر على تحميله مجانا من موقع Microsoft

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#24

كنت عايزة ارسم شجرة بحيث اعطية النودذ وبتدى يوصل بينهم ممكن تساعدنى

#25

على ما فهمت تقدرين رسم عدّة دوائر على الشاشة و في نفس الوقت

تضعين نقطة الوسط لكل دائرة في array و من ثمّ تصلينهم ببعضهم البعض

من خلال Loop لا أعلم إن أفدتك لأنني لم أرسم شيئا مماثلا قبلا

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

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