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

استفسارات حول دوال في Opengl

بدأه *cpu* في 12 يناير 2010 · 2 رد · 2,525 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اتمنى توضيح هذه الدوال و متى تستخدم ؟؟..يبدو ان هناك لبس في فهمي لها

glutTimerFunc( 1000, Timer, 1 );

glutPostRedisplay();

glutSwapBuffers () ;

glFlush();

و ما الفرق بين

void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);

و

void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);

وكيف احدد الاستخدام الانسب؟؟

و لدي سؤال وهو هل هناك دالة لإلغاء تفعيل الزر الأيمن مثلا

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

glutAttachMenu(GLUT_RIGHT_BUTTON);

في الموضع المطلوب ولكن سيظل الزر مفعل في كل مكان من النافذه

فكيف الغي تفعيله

جربت

glDisable(GLUT_RIGHT_BUTTON);

و لم تجدي

فهلا افدتموني؟

وفقكم الله لكل خير

تم تعديل هذه المشاركة بواسطة *cpu* في 12 يناير 2010 في 00:13

#2

الدرس التالي يحتوي على شرح "معظم" هده الدوال

دروس حول مكتبة glut للأخ الشمري

تحياتي

تم تعديل هذه المشاركة بواسطة OsamaHosamEldeen في 12 يناير 2010 في 13:24

#3

حسنا سأحاول مساعدتك بشكل مقتضب فيما أعرف

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

glutTimerFunc( 1000, Timer, 1 );

لا أعرف صراحة!

اقتباس

ببساطة تطلب هذه الدالة من ال OpenGL أن يقوم بتنفيذ عملية الرسم الآن، طبعا نحن نعرف أن ال OpenGL هي من تقرر متى تتم عملية الرسم، ولكن عندما تستدعي هذه الدالة أنت تجبر ال OpenGL أن تقوم بعملية الرسم الآن.

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

glutSwapBuffers () ;

Double Buffers، تقوم هذه الدالة بتبديل الذاكرة "Buffer" الخلفية بالأمامية،

بشكل بسيط: ال في حالة ال Double Buffering يكون لدينا ذاكرة أمامية يتم رسم محتوياتها على الشاشة، و ذاكره خلفية يتم كتابة التعديلات المطلوبة على المشهد فيها، عند الإنتهاء من عملية الكتابة على الذاكرة الخلفية يتم تبديل الذاكرة الأمامية بالخلفية لكي يتم رسم المحتويات الجديدة.

فائدة هذه التقنية تساعد على إزالة الرمش التي قد تشاهدها أثناء تنفيذ برنامج ال OpenGL.

glFlush();

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

طبعا عند إستخدام ال Double Buffering لن تحتاج لإستخدامها. لأن عملية ال SwapBuffers تقوم بهذه المهمة.

اقتباس
الفرق بين

void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);

و

void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);

الدالتين تؤديان وظيفتان متشابهتين، وهي تحديد ال Clipping Volume الذي من خلاله يتم تحديد المشهد الذي تستطيع الكاميرا تصويره.

الدالة الأولى تعطينا Clipping Volume متعامد (متوازي متسطيلات) و يكون العمق غير موجود في النتيجة النهائية (العناصر الخلفية لن تبدو أصغر من الأمامية).

في المقابل الدالة الثانية، تعطينا Clipping Volume واقعي يكون على شكل هرم تقريبا، و تكون الصورة النهائية تحتوي على العمق.

لاحظ الفرق بين الخيارين من خلال الصور التالية، الصورة اليمنى تمثل ال Clipping Volume لل glOrtho ، و الصورة اليسرى تمثل ال Clipping Volume لل gluPerspective.

post-133895-12632948232468_thumb.jpg post-133895-1263294949225_thumb.jpg

في المقابل لاحظ نتيجة كل من الخيارين في الصورة التالية

حيث الصورة في الجهه اليسرى هي نتيجة ال Ortho و اليمنى نتيجة ال Perspective

post-133895-12632951474138_thumb.jpg

*الصور مقتبسة من الكتاب الأحمر

اقتباس
وكيف احدد الاستخدام الانسب؟؟

إذا أردت المشهد أقرب ما يكون للواقعية إستخدم ال gluPerspective و إلا إستخدم ال Ortho (من وجهة نظري، قد يكون هنالك إعتبارات أخرى!)

اقتباس
و لدي سؤال وهو هل هناك دالة لإلغاء تفعيل الزر الأيمن مثلا

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

glutAttachMenu(GLUT_RIGHT_BUTTON);

في الموضع المطلوب ولكن سيظل الزر مفعل في كل مكان من النافذه

فكيف الغي تفعيله

جربت

glDisable(GLUT_RIGHT_BUTTON);

و لم تجدي

لا أعرف هل يوجد طريقة مباشرة لعمل ذلك أم لا، ولكن بشكل عام

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

بإمكانك الإستفادة من طريقة الأخ الشمري في هذا السؤال /index.php?showtopic=211854

أرجو أن أكون قد أفدتك

بالتوفيق

عندما يكون لديك

3

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