در درس اول شما ياد گرفتيد که چگونه يک صفحه OpenGL بسازيد . در اين درس شما مي آموزيد که چگونه يک مثلث و يک مربع رسم کنيد . ما مثلث را با پارامترGL_TRIANGLES و مربع را با پارامتر GL_QUADS و با دستورات glVertex3f خواهيم ساخت .
از همان کد درس اول استفاده کنيد . ما به روال DrawGLScene بخشهايي را اضافه خواهيم کرد . ما تمام اين روال را از نو خواهيم نوشت . اگر مي خواهيد از همان کد درس قبل استفاده کنيد ، کد زير را جايگزين روال فوق کنيد يا در هر بخش که تغييري مي بينيد آن را اعمال کنيد .

 
   

 

function DrawGLScene():bool; // Here's Where We Do All The Drawing

begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
  glLoadIdentity(); // Reset The View
 

 

   
 

وقتي شما glLoadIdentity را صدا مي زنيد ، بدين معناست که شما به مرکز صفحه برمي گرديد . X از چپ به راست Y بالا به پايين و Z حرکت به درون و بيرون صفحه خواهند بود . مرکز صفحه OpenGL نقطه صفر براي X و Y خواهد بود . به سمت چپ عددها منفي و به سمت راست مثبت خواهد بود . همينطور حرکت به سمت بالا مثبت و به سمت پايين منفي است . حرکت به درون صفحه منفي و به سمت بيرون مثبت است .
روال
glTranslatef(x, y, z)  به اندازه x و y و z به همان صورت بالا نقطه جاري را حرکت خواهد داد . ( تمام ترسيمات از نقطه جاري شروع مي شود ) کد زير از محور X ها  1.5 واحد به سمت چپ و از محور Z ها 6 واحد به سمت درون صفحه مي رود . بايد توجه داشته باشيد که اين دستور از نقطه جاري عمل مي کند و نه از مرکز صفحه . ( يعني اگر دوباره اين روال را صدا بزنيم از همين نقطه اي که الان هستيم شروع به محاسبه مي کند و نه از مرکز اصلي صفحه ) .

 
   

 

  glTranslatef(-1.5,0.0,-6.0);
 

 

   
 

حالا ما به اندازه نصف صفحه به سمت چپ و به اندازه کافي به داخل صفحه رفته ايم تا بتوانيم مثلث خود را بسازيم . دستور glBegin(GL_TRIANGLES)  بدين معناست که ما مي خواهيم يک مثلث رسم کنيم . و دستور glEnd به OpenGL مي گويد که رسم ما تمام شده است . اگر از سه نقطه استفاده مي کنيد بايد از GL_TRIANGLES استفاده کنيد . رسم مثلث روي بسياري از کارتهاي گرافيکي بسيار سريع است . اگر چهار نقطه داريد از GL_QUADS استفاده کنيد و اگر بيش از چهار نقطه داريد از GL_POLYGON استفاده کنيد . تا آنجا که من شنيده ام کارتهاي گرافيکي همه چيز را به صورت مثلث درآورده و رسم مي کنند .
در برنامه ساده ما ابتدا يک مثلث رسم مي کنيم . اگر بخواهيم مثلث دوم را رسم کنيم مي توانيم اين کار را با اضافه کردن سه خط ديگر ( براي سه نقطه ) انجام بدهيم .
اولين خط بعد از glBegin نقطه اول مثلث را مشخص مي کند . اولين پارامتر فرستاده شده به glVertex براي محور x ها ، دومي براي محور y ها و سومي براي محور z ها استفاده مي شود . در خط اول ما مقدار x را تغيير نداده يم . ولي در محور y ها يک واحد به سمت بالا حرکت کرده يم . براي محور z ها نيز عددي نداده يم . اين اعداد مشخص کننده نقطه بالايي مثلث ما هستند . در دومين دستور glVertexدر محور x ها يک واحد به سمت چپ رفته و يک واحد هم در محور y ها به سمت پايين رفته يم . و در دستور سوم glVertex هم در محور x ها يک واحد به سمت راست و در محور y ها يک واحد به سمت پايين رفته ايم . توجه داشته باشيد که اين حرکات همواره به نسبت نقطه اي که با دستور
glTranslatef(x, y, z) مشخص شده انجام مي شود و به همين دليل است که در دستور سوم بايد عدد منفي يک را براي y ها مشخص کنيم . در حقيقت اين بخش دقيقاً مانند رسم در دستگاه مختصات است .

 
   

 

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

 

   
 

حالا که ما مثلث را در نيمه چپ تصوير رسم کرده ايم به نيمه سمت راست مي رويم تا يک مربع هم در آن قسمت رسم کنيم . براي اين منظور دوباره بايد از دستور glTranslatef(x, y, z) استفاده کنيم . توجه داشته باشيد که ما قبلاً 1.5 واحد به سمت چپ رفته يم . پس با حرکت 1.5 واحد به سمت راست تازه به مرکز تصوير مي رسيم و از اين نقطه هم بايد 1.5 واحد ديگر به سمت راست برويم تا به نيمه سمت راست تصوير برسيم . و اين يعني در مجموع حرکت به اندازه 3 واحد فقط به سمت راست .

 
   

  glTranslatef(3,0.0,0.0);

 

   
 

حالا بياييد مربع را رسم کنيم . براي اين منظور از پارامتر GL_QUADS استفاده مي کنيم . هر مربع از 4 نقطه تشکيل شده است و کد اين بخش به کد بخش رسم مثلث بسيار شبيه است با اين تفاوت که از چهار دستور glVertex3f براي مشخص کردن چهار نقطه مربع استفاده مي کنيم . بايد به خاطر داشته باشيد که جهت حرکت همانند حرکت عقربه هاي ساعت است .

 
   

 

  glBegin(GL_QUADS);
    glVertex3f(-1.0, 1.0, 0.0);
    glVertex3f( 1.0, 1.0, 0.0);
    glVertex3f( 1.0,-1.0, 0.0);
    glVertex3f(-1.0,-1.0, 0.0);
  glEnd();
  DrawGLScene:=true; // Everything Went OK
end;

 

   
 

در کتاب book ("OpenGL Programming Guide: The Official Guide to Learning OpenGL, Release 1", J. Neider, T. Davis, M. Woo, Addison-Wesley, 1993) درباره بخشي که حرکات را توضيح داديم راجع به استفاده از کلمه "واحد" توضيح جالبي داده است : اينچ و يا ميليمتر ؟ يا تنها در OpenGL معنيي دارند ؟ خير . کل پروژه و تمامي تغييرات و ترسيم ها بدون واحد هستند . شما براي تجسم فاصله بين 1 و 20 مي توانيد از ميليمتر ، اينچ ، کيلومتر و يا هر چيزي که راحتتريد استفاده کنيد . اين به انتخاب شماست . تنها قاعده اي که بايد به ياد داشته باشيد اين است که از يک واحد يکسان براي تمام پروژه استفاده کنيد

 
   

 

   
 

اگر جايي ايرادي مي بينيد و يا فکر مي کنيد با اضافه و يا کم کردن بخشهايي به خوانايي و يا افزايش عملکرد برنامه و يا سطح آموزش اضافه مي شود حتماً با من در ميان بگذاريد

 

    
  

دريافت ليست دلفي نوشته شده توسط Peter De Jaegher

 

درس سوم ->

<- درس اول