OpenGL .. الدرس رقم 3 الدوران والتحريك في OpenGL

الناقل : elmasry | الكاتب الأصلى : AlDeaj | المصدر : www.arabteam2000-forum.com

الدرس السابق
OpenGL .. الدرس رقم 2


تعريف بالدرس ..


Posted Image

في هذا الدرس سوف نتعلم كيف نقوم بتدوير كل من المثلث والمربع .. سوف يكون دوران المثلث حول المحور Y بينما دوران المربع سوف يكون حول المحور X ( وتلك ليست قاعده .. انما اخترنا للمثلث المحور Y و للمربع المحور X كمثال أي انك تستطيع ان تجعل الدوران لأي كائن على أي محور تريده ) .

سوف نتعرف في هذا الدرس على متغيرين جديدين
rtri ويستخدم لتحريك او تدوير المثلث
rquad ويستخدم لتحريك او تدوير المربع

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


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

HDC  hDC=NULL;
HGLRC  hRC=NULL;
HWND  hWnd=NULL;
HINSTANCE       hInstance;

bool  keys[256];
bool  active=TRUE;
bool  fullscreen=TRUE;

GLfloat  rtri;
GLfloat  rquad;


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

قمنا باضافة متغيري الدوران لكل من المثلث والمربع بعد fullscreen=TRUE من الكود الأصلي
rtri مكونة من مقطعين حرف r الاول يعبر عن كلمة rotation وتعني الدوران والحروف الثلاث الباقية تعبر عن triangle وتعني المثلث .. اذا rtri تعني تدوير او دوران المثلث
rquad مثل ما سبق باستثناء ان quad تعبر عن المربع مما يعني بأن rquad تعني تدوير او دوران المربع

glRotatef(rtri,0.0f,1.0f,0.0f);


glRotatef هو المسئول عن دوران الكائن حول المحور
rtri يعبر عن ان هذا الدوران سوف يكون للمثلث
المتغيرات الثلاث بعد rtri تعبر عن كل من X للمحور الاول ، Y للمحور الثاني ، Z للمحور الثالث

نحتاج القليل من التفصيل الآن :)

لو تخيلنا ان المحور X عبارة عن خط مستقيم من اليسار الى اليمين او من اليمين الى اليسار ( وهو فعلا كذلك)
فإنه عندما نضع قيمة المتغير اكس تساوي 1( مع بقاء القيم الاخرى تساوي صفر ) فاننا سوف نقوم بتدوير المثلث حول هذا الخط المستقيم ولو وضعنا القيمة 1 بالسالب سوف نقوم بتدوير المثلث أيضا حول نفس الخط المستقيم ولكن باتجاه معاكس ( يجب يجب يجب ان تقوم بالتعديل في المثال حتى تكتمل الصورة لديك وتفهم مايجري فالقراءة وحدها لاتكفي )

ولو افترضنا بان المحور Y عبارة عن خط مستقيم من الأعلى إلى الأسفل او من الأسفل إلى الأعلى فعندما نضع قيمة المتغير Y تساوي 1 ( مع بقاء القيم الاخرى تساوي صفر ) فاننا سوف نقوم بتدوير المثلث حول هذا الخط المستقيم ولو كانت قيمة المتغير 1 بالسالب سوف نقوم بالتدوير ايضا حول نفس الخط المستقيم ولكن باتجاه معاكس .. مثال على ذلك الاعصار .. تخيل انك في وسط حقل زراعي ويوجد اعصار هائل متجه إليك ( لاتهرب قبل ان اكمل الشرح ) :) بطبيعة الحال يكون الاعصار بشكل طولي ( وهو نفس المحور Y لدينا ) والاعصار اثناء تقدمه اليك فانه يدور حول نفسه ايضا اما من اليسار الى اليمين او من اليمين الى اليسار وهذا مانريد الوصول اليه .. فاننا حين نريد تدوير المثلث حول نفسه من المحور Y فاننا سوف نرى نفس حركة الاعصار حول نفسه من اليسار لليمين او من اليمين لليسار حسب القيمة التي لدينا ان كانت سالبة او موجبه
( اكرر .. يجب يجب يجب ان تقوم بتعديل تلك القيم في المثال حتى تكتمل الصورة لديك وتفهم مايجري فالقراءة وحدها لاتكفي )

نفس الأمر ينطبق على المتغير Z بافتراض ان المحور Z عبارة عن خط مستقيم من الداخل للخارج او من الخارج للداخل ( المتغير Z يعبر عن العمق ) .. مثال على ذلك المروحة .. تخيل انك أمام مروحة وتقوم بالنظر اليها .. منتصف تلك المروحه هو المحور Z وهو يكون للداخل والخارج .. المروحه تدور حول المحور Z من اليمين لليسار او من اليسار لليمين .. عند تدوير المثلث حول المحور Z فاننا سوف نحصل على نفس حركة المروحه ويتغير اتجاه الحركة بتغير القيمة سالبة او موجبه ( مره اخرى .. يجب يجب يجب ان تقوم بتعديل تلك القيم في المثال حتى تكتمل الصورة لديك وتفهم مايجري فالقراءة وحدها لاتكفي )

اذا في الكود السابق سوف نتحرك حول المحور Y بمقدار وحده واحده .. بالطبع بامكاننا التحريك باكثر من محور الآن ولكننا لانريد الدخول في متاهات قبل تعلم الاساسيات


glBegin(GL_TRIANGLES);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glEnd();


الكود السابق موجود في الدرس السابق وقد تم شرحه هناك بالتفصيل .. لماذا اعدنا كتابته ؟ هكذا دون سبب :)

glLoadIdentity();
glTranslatef(1.5f,0.0f,-6.0f);
glRotatef(rquad,1.0f,0.0f,0.0f);


الآن قمنا بكتابة glLoadIdentity() مرة اخرى حتى نقوم بالرجوع إلى منتصف الشاشة .. اذا لم نقم بهذا العمل سوف يتحرك المربع في موضع غير الموضع الذي نريده فيجب علينا استخدام هذا المتغير حتى نعود إلى منتصف الشاشة ومن ثم نقوم بالتحرك الى اليمين بمقدار 1.5 لتحريك المربع في الجزء الايمن كما هو مبين من السطر الثاني من الكود ( حاول ان تزيل glLoadIdentity() وانظر ماسيحدث للمربع ووكيف سيتحرك ويتغير موضعه ) .. في الدروس السابقة كنا نتحرك إلى اليمين بمقدار 3 وحدات لاننا كنا نتحرك من الجهة اليسرى للشاشة ولكننا الآن بعد ان عدنا إلى منتصف الشاشة لانحتاج الى التحرك سوى 1.5 حتى نصل الى الجهة اليمنى .

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

rtri+=0.2f;
rquad-=0.15f;
return TRUE;
}


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

if (keys[VK_F1])
{
keys[VK_F1]=FALSE;
KillGLWindow();
fullscreen=!fullscreen;
if (!CreateGLWindow("NeHe's Rotation Tutorial",640,480,16,fullscreen))  
{
return 0;
    }
        }


هذا الكود موجود في الدروس السابقة ولم يتم تغيير سوى الرسالة التي ستظهر في قمة المشروع title


الكود المصدري للدرس

الدرس الأصلي لمن أراد الإطلاع

إلى هنا انتهى درسنا والذي أرجو ان يكون واضحا
:)

الدرس التالي:
http://www.arabteam2...showtopic=47617

أسألكم الدعاء