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

ماهو معنى الدوال الأتيه ....ارجو المساعده من فضلكم الكريم

بدأه ahla elm في 14 ديسمبر 2008 · 7 رد · 5,545 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

ماهو معنى ووظيفه الداله

glMatrixMode();

ولماذا يجب استدعاء داله

glMatrixMode()

مع المعامل

GL_MODELVIEW

قبل تنفيذ تحويلات

viewing or modeling

ثانيا: ماهو معنى ووظيفه الداله

glLoadIdentity();

ولماذا يجب ان نضعها بعد الداله

glMatrixMode()

ثالثا: ماهو معنى داله

glPushMatrix(); و glPopMatrix();

وماهو الفرق بينهم وبين داله

glLoadIdentity();

لأني احسن كأنم لهم نفس المهمه

لأنه في بعض الحالات نضع داله glLoadIdentity();

قبل الإزاحه او الدوران او التحجيم

مالفرق بينهما

احتاج الرد على اسألتي بالتفصيل من فضلكم

وجزاكم الله عني كل خير

#2

معقوله مافي رد ومساعده من الأخوان

بليز محتاجه للمعلومات

في اسرع وقت ممكن

#3

السلام عليكم

والله أنا أعرف بس شيء بسيط جدا عن الدالتين glMatrixMode() وكذلك الدالة glLoadIdentity()، وهو أن هاتان الدالتان تستخدمان لتحديد نظام الرسم والتحويل من الbuffer إلى الشاشة مع تفعيله،

هذا فقط كل مالدي عنهما، إن شاء الله اكون اضفت لك حاجة

#4

مشكور اخوي

lug

على المعلومه الي اعطتيني هيا

وجزاك الله كل خير

واتمنى من باقي الأخوان المساعده العاجله من فضلهم

تم تعديل هذه المشاركة بواسطة ahla elm في 15 ديسمبر 2008 في 23:12

#5

الدوال المذكورة هي خاصة بالمصفوفات في OpenGL وسبق أن تكلمنا عنها في هذا القسم ,

راجع مثلا :

/index.ph...3&hl=matrix

باختصار :

يوجد عدة مصفوفات في OpenGL , كل مصفوفة تستطيع أن تغيرها بعدة دوال وهي :

glTranslatef : تقوم بالازاحة ( يعني التحريك )

glRotate :تقوم بالتدوير .

glScale : تغير الحجم .

glLoadIdentity : تحول المصفوفة الى مصفوفة الوحدة ( الاقطار =1 ) وهذا مفيد حتى يعود كل شيء لأصله .

glPushMatrix : تقوم بحفظ المصفوفة في stack وبالتالي أي عمليات على المصفوفة مثل التحريك أو التدوير , لن يؤثر على المصفوفة الاصلية ,

glPopMatrix : تقوم بازالة المصفوفة من الستاك ونعود لمصفوفتنا الاصلية .. عملية ال push و pop مفيدة حتى لا تؤثر بعض العمليات على البعض الاخر ,

يوجد ثلاث أنواع من المصفوفات في OpenGL ( والان صارت أربع .. في الاصدارات الاخيرة ) .

1- Projection Matrix : مصفوفة الاسقاط ( اسقاط عمودي للتطبيقات الثنائية الابعاد , واسقاط منظوري للتطبيقات الثلاثية الابعاد , يعني ممكن نقول للتحكم بالاحداثيات ) .

2- ModelView Matrix : وهي مصفوفة تؤثر على Vertex و ال View .. فأي نقطة رح ترسمها .. سيتم ضربها (متجه) في المصفوفة ModelView .. وبالتالي ستتحرك للموقع الذي حددت ,

3- Texture Matrix : مصفوفة الاكساء ,

غالبا ما نعمل identity بعد تغيير نوع المصفوفة الى ModelView أو Projection .. لاننا نريد تهيئتها .. لاجراء تعديلات عليها ,

فمثلا , لو لم تعملها مع ModelView .. وأنت تقوم بعمل ازاحة , فانه في كل مرة تقوم بتحديث النافذة , رح تعمل ازاحة .. وبالتالي لن ترى شيء على النافذة , لذلك .. تعمل identity .. حتى تعود الى نقطة الاصل , ومن نقطة الاصل نعمل الازاحة ,

مثال :

glMatrixMode(GL_PROJECTION); // اخترنا مصفوفة الاسقاط
glLoadIdentity();// الان نحولها الى مصفوفة الوحدة .. لنعيد كل شيء الى أصله بدون أي تأثير..

glTranslatef(-1,0,0);حركنا الاحداثيات الى اليسار بمقدار سالب واحد

glMatrixMode(GL_MODELVIEW); // انتقلنا الى مصفوفة الموديل فيو
glLoadIdentity();//عدنا الى نقطة الاصل

glTranslatef(1,0,0);// رسمنا المجسم في يمين النافذة
glScalef(0.08,0.08,1);// غيرنا حجم المجسم

DrawCircle();//رسمنا الدائرة


glPushMatrix();// ننشئ نسخة من المصفوفة حتى نحافظ على المصفوفة الاصلية
glTranslatef(-1,0,0);// الى اليسار
DrawTriangle();//ارسم مثلث
glPop();// عدنا لمصوفتنا السابقة

DrawRectangle();//رسمنا المستطيل في نفس مكان الدائرة لاننا لم نغير الموقع

glLoadIdentity();// صارت مصفوفة الوحدة ورجعنا الى نقطة الاصل

هذه لمحة عامة , أما بالنسبة للفرق بين push و pop و loadidentity .. فسأشرحها بدون تعمق , فقط لتتضح الصورة .

- glLoadIdentity : تلغي تأثير الازاحة والتدوير .. لانها تحول المصفوفة الى مصفوفة الوحدة .. لذلك هي تؤثر على كل ما بعدها .

Push - Pop : تنسخ المصفوفة .. وبالتالي اي تدوير او ازاحة تعملها داخل pop - push لن تؤثر على الخارج .. ولكن .. اي ازاحة حدثت قبل push و pop فانها تؤثر على ما بداخل ال push و pop ..

بمعنى ان push و Pop .. تضمن لنا عدم التأثير على ما بعدها من أسطر .. ولكن تتأثر بما قبلها ..

loadIdentity .. تؤثر على ما بعدها وتلغي تأثير ما قبلها ,

مثال توضيحي ,

//  الشكل التالي سيتم تدويره  فقط  
glTranslatef(1,0,0);
glLoadIdentity();// الغينا تاثير الازاحة
glRotatef(45, 0 , 0 ,1); 
glBegin(GL_QUADS);
glVertex2f(0,0);
glVertex2f(1,0);
glVertex2f(1,1);
glVertex2f(0,1);
glEnd();

// هذا سيدور أيضا
glBegin(GL_QUADS);
glVertex2f(0,0);
glVertex2f(1,0);
glVertex2f(1,1);
glVertex2f(0,1);
glEnd();

//  الشكل التالي سيتم تدويره وستحرك الى اليمين
glTranslatef(1,0,0);
glPushMatrix();
glRotatef(45, 0 , 0 ,1); 
glBegin(GL_QUADS);
glVertex2f(0,0);
glVertex2f(1,0);
glVertex2f(1,1);
glVertex2f(0,1);
glEnd();
glPop();
// هذا الشكل لن يدور لان الدوران حدث داخل 
// push , pop
// ولكن سيتحرك .. لان التحريك خارج 
// pop , push
glBegin(GL_QUADS);
glVertex2f(0,0);
glVertex2f(1,0);
glVertex2f(1,1);
glVertex2f(0,1);
glEnd();

اقرأ عن المصفوفات ... وكيفية عملها حتى تتضح الصورة كاملة ,

http://www.morrowland.com/apron/tutorials/gl/gl_matrix.php

http://gpwiki.org/index.php/OpenGL:Tutorials:Theory

تم تعديل هذه المشاركة بواسطة الشمري في 16 ديسمبر 2008 في 19:51

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#6

مشكور اخوي الشمري على اجابتك وردك الأكثر من رائع

ماشاء الله تبارك الرحمن

الله سعدك ويفرج عليك كربك مثل ماساعدتني

ماني عارفه كيف اشكرك

الله يكثر من امثالك

جزاك الله عنا كل خير

#7

اخوي الشمري عندي تستفسار بخصوص المصفوفه

Matrix

عندما يكون الشكل ثنائي الأبعاد تكون المصفوفه

2x2

سؤالي هوا لماذا تمثل بثلاث صفوف ويكتب في الصف الأخير رقم واحد..كما في الشكل التالي

| y 0 0 |

| 0 x 0 |

| 0 0 1 |

وايضاً عندما يكون الشكل ثلاثي الأبعاد تكون المصفوفه

3x3

سؤالي هوا لماذا تمثل بأربعه صفوص ويكتب في الصف الأخير رقم واحد ..كمافي الشكل التالي

| 1 0 0 X |

| 0 1 0 Y |

| 0 0 1 Z |

| 0 0 0 1 |

وممكن تعطيني تعريف للـ Matrix بصوره مفصله

واعذررررني على الإزعاج

تم تعديل هذه المشاركة بواسطة ahla elm في 17 ديسمبر 2008 في 22:46

#8

- كلامك صحيح , بشكل نظري اذا كان عندنا متجه ثنائي الابعاد x,y يمكن ضربه بمصفوفة 2*2 .

- واذا كان لدينا متجه ثلاثي البعد , نضربه في مصفوفة 3*3 .

- في OpenGL نتعامل دائما مع متجه ثلاثي البعد لذلك يجب أن يكون المتجه هو x y z .. ونستطيع الغاء البعد بوضح z=0 .

- ولكن OpenGL في الحقيقة تقول أن المتجه هو يتكون من أربع مركبات x y z w .. حيث w دائما يساوي 1 .

- ما فائدة المركب الرابع W ؟

سبق أن سألت عن هذا في القسم ,

الاجابة هنا :

/index.php?showtopic=110521

- لذلك , وبشكل ما .. يجب أن تكون المصفوفة 3*3 ( في حال البعد الثنائي ) و 4*4 في حال البعد الثلاثي , والسبب هو وجوب تحقيق قانون ضرب المصفوفات ( عدد أعمدة المصفوفة الأولى = عدد صفوف المصفوفة الثانية ).

بشكل عام :

C			B			A
[ newX]		[ m0	m4	m8	m12 ]  [ x]
[ newY] 	=	[ m1	m5	m10	m13 ]  [ y]
[ newZ] 		[ m2	m7	m11	m14 ]  [ z]
[   1   ] 		[ m3	m8	m12	m15 ]  [ 1]

B columns = A rows

تقوم OpenGL بضرب النقاط ( كل Vertex ) في مصفوفة Model View .. حتى تتحرك هذه النقاط الى الاتجاه الذي نريده

مثال :

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

void changeSize(int w, int h)
{
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(-w/2,w/2,-h/2,h/2);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}
void renderScene(void) {

 	glClear(GL_COLOR_BUFFER_BIT );
	glLoadIdentity();
	glPointSize(5);

	glTranslatef(100 ,200 , 0 );

	glBegin(GL_POINTS);
	glVertex4f(50,20,0,1);
	glEnd();

	glutSwapBuffers();
}
int main(int argc, char **argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA);
	glutInitWindowPosition(100,100);
	glutInitWindowSize(600,600);
	glutCreateWindow("OpenGL");
	glutDisplayFunc(renderScene);
 	glutReshapeFunc(changeSize);
	glutMainLoop();

	return(0);
}

في المثال السابق ستقوم مكتبة OpenGL بضرب المصفوفتين التاليتين :

post-42837-1229880317_thumb.jpg

تستطيع أن تكتب ذلك بطريقة أخرى :

	float   m[]={ 1	,	0	,	0	,   0 ,
				  0	,	1	,	0	,   0 ,
				  0	,	0	,	1	,	0 ,
				  0 ,	0	,	0	,	1
				};
void renderScene(void) {

 	glClear(GL_COLOR_BUFFER_BIT );
	glPointSize(5);

	m[12] = 100;
	m[13] = 200;
	m[14] = 0;
	glLoadMatrixf(m);
	glBegin(GL_POINTS);
	glVertex4f(50,20,0,1);
	glEnd();

	glutSwapBuffers();
}

post-42837-1229880335_thumb.jpg

ولكن يجب أن تلاحظ أن اوبنجل تعتمد نظامcolumn-major في ترتيب عناصر المصفوفة كما في الصورة السابقة , ولكن السي بلس , تخزن المصفوفة بشكل متسلسل , لذلك تستطيع استخدام ما يسمى بمنقول المصفوفة , اذا أردت تغيير نظام تخزين العناصر ,

تم تعديل هذه المشاركة بواسطة الشمري في 21 ديسمبر 2008 في 20:32

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

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