بتـــــاريخ : 3/1/2011 4:16:05 AM
الفــــــــئة
  • الحـــــــــــاسب
  • التعليقات المشاهدات التقييمات
    0 1669 0


    الازاحة - التحجيم - التدوير .. في opengl سلسلة هذا اللي اعرفه (2)

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

    كلمات مفتاحية  :
    الازاحة التحجيم التدوير opengl

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

    الازاحة :
    كيف نحرك مجسم من موقع إلى آخر


    glTranslatef

    تؤدي المهمة على أكمل وجه ....

    صيغتها

    glTranslatef(Glfloat x , Glfloat y , Glfloat z );

    اذا اردت البارمترات float

    او



    glTranslated (GLdouble x, GLdouble y, GLdouble z);

    اذا اردت البارمترات من نوع double

    البارمتر الاول : الاحداثي السيني .
    البارمتر الثاني : الاحداثي الصادي .
    البارمتر الثالث : الاحداثي العيني .. العمق .. Z .


    سنفرض هنا .. اننا نتعامل مع بيئة احداثية شبية بالتالي :

    Posted Image

    اذا .. يمين المنتصف الاحداثي السيني x .. موجب .
    يسار المنتصف .. الاحداثي السيني X سالب .

    أعلى المنتصف الاحداثي الصادي موجب Y
    اسفل المنتصف الاحداثي الصادي سالب Y

    خارج الشاشة ( قل العمق ) z موجب .
    (داخل الشاشة ) قيمة الاحداثي Z سالب .

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


    الجمل السابقة تبدو بديهية .. وتذكرنا بثالث ابتدائي ..

    لكن معظم اسئلة طلبة بعض الكليات .. التي رأيت ... تدور حول تلك المحاور  ,,, يعني كأننا ابتدائي .. مع كامل احترامي ... لاتزعلون علينا ياطلبة الكلية .. : ) ,,



    دعونا نأخذ مثال :/

    glLoadIdentity(); 
      glTranslatef(2,0,-4.0);
       
      glBegin(GL_POINTS);
        glVertex3f(0,0,0);
                       glEnd();

    من المفترض ظهور النقطة منتصف الشاشة ..
    وذلك لاننا كتبنا

    glVertex3f(0,0,0);

    لكن الحقيقة هي ان النقطة ستتحرك خطوتين الى اليمين .

    glTranslatef(2,0,-4.0);
    جعلنا الاحداثي السيني 2 ..

    اعتقد الامر سهل وواضح .

    لكن لماذا كتبنا في البارمتر الثالث -4 ..

    لسبب واحد .. حتى يظهر الرسم .
    فالرسم لن يظهر هنا .. الا اذا كانت الشاشة ممكن ان تحويه..
    جرب ان تغير الرقم -4 باي عدد ... ابتداء من -5 فما دون ..
    و -4 فما فوق .. وصدقني رح تفهم : ) ,,, باذن الله .



    دعنا نرسم شكل مربع
      glLoadIdentity(); 


      glTranslatef(1,0,-8.0);

      glColor3f(1,1,0);
             glRectf(0,0,0.5,0.5);


      glTranslatef(-1,0,0.0);

      glColor3f(1,0,0);
      glRectf(0,0,0.5,0.5);
    رسمنا مربعين :
    الاول لونه اصفر ويقع في الاحداثي السيني " 1 "

    الثاني لونه احمر ويقع في الاحداثي السيني "-1 "

    يعني المربع الاول يمين نقطة المنتصف .. المربع الثاني يسار منطقة المنتصف .
    لكن المفاجأة .. أن الرسم سيظهر هكذا :

    Posted Image

    لماذا المربع الاحمر لم يظهر يسار نقطة المنتصف كما أردنا ::::
    glTranslatef(-1,0,0.0);

      glColor3f(1,0,0);
      glRectf(0,0,0.5,0.5);
    الجواب :
    نحن تحركنا خظة الى اليسار ( -1 ) .. بالنسبة لمقعنا السابق وهو " 1 "
    كان

    X =1 Y=0 Z=-8 موقع المربع السابق
    X=-1 Y=0 Z=0 موقع المربع الحالي
    --------------------------------------
    X=0 Y=0 Z=-8 موقع المربع الحالي الذي تأثر بموقع المربع السابق

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

    خلاصة الكلام ان المربع الاحمر تحرك خطوة لليسار بناء على موقع المربع الاصفر .

    لكن ألا تتفق معي ان هذا أمر مزعج ..

    انا اريد ان لا يتأثر أي شكل بالشكل السابق المرسوم .

    مالحل :

    لاحظ
            glLoadIdentity(); 


      glTranslatef(1,0,-8.0);

      glColor3f(1,1,0);
             glRectf(0,0,0.5,0.5);

      glLoadIdentity();
      glTranslatef(-1,0,-8.0);

      glColor3f(1,0,0);
      glRectf(0,0,0.5,0.5);

    اضفنا glLoadIdentity قبل ان نزيح الجسم الثاني والنتيجة :

    Posted Image


    ستلاحظ ان المربع الاصفر يمين نقطة المنتصف .. والاحمر يسارها ..
    أي لم يتأثر أي شكل بالشكل الذي قبله .


    من هذا المثال نعرف أن فائدة الدالة glLoadIdentity هي تصفير مصفوفة الازاحة .
    أي تعيدنا الى نقطة الاصل .

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


    بهذا نختم درسنا هذا ..

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

    مافعلنا أي شيء جديد ..
    وضعنا متغيرين
    x y z . ..

    الاسهم تحرك الشكل يمين ويسار وفوق وتحت .. و مفتاح End يقرب الشكل .. و مفتاح Home يبعد الشكل ..


    حمل اما تطبيق Opengl /glut
    او
    OpenGL/API

    اللي يعجبك .


    درسنا القادم عن التدوير باذن الله تعالى .
     
    ملف مرفق(ملفات)
     

    كلمات مفتاحية  :
    الازاحة التحجيم التدوير opengl

    تعليقات الزوار ()