با توسعه دادن درس قبل حالا مي خواهيم اشياء سه بعدي واقعي بسازيم بجاي اينكه اشياء دو بعدي را در يك محيط سه بعدي داشته باشيم . ما اين كار را با اضافه كردن صفحات چپ پشت و راست به مثلث و صفحات چپ راست پشت بالا و پايين به مربع انجام مي دهيم . با اين كار ما مثلث را به هرم و مربع را به مكعب تبديل مي كنيم . ما براي هرم از پخش رنگ و براي هر وجه از مكعب يك رنگ را استفاده خواهيم كرد .

 
   

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
  glTranslatef(-1.5,0.0,-6.0);  
  glBegin(GL_POLYGON);  

 

   
 

با ايجاد تغييراتي در كد درس قبل براي خود اشياء سه بعدي خواهيم ساخت . چيزي كه بايد به خاطر داشته باشيد اين است كه اشيائي كه مي سازيد بايد يك نقطه مركزي داشته باشند كه بدور آن خواهند چرخيد . به خاطر داشته باشيد كه اين نقطه مركزي همواره بايد در نقطه صفر براي محور xها و yها و zها باشد .
كد زير هرم را حول نقطه مركزي رسم خواهد كرد . بالاي هرم يك واحد بالاتر از مركز خواهد بود و پايين آن يك واحد پايينتر از مركز .
توجه داشته باشيد كه تمام مثلث ها در جهت عقربه هاي ساعت رسم خواهند شد . اين مهم است و در درسهاي بعدي توضيح داده خواهد شد . اينكه شما بتوانيد اشياء را در جهت حركت عقربه هاي ساعت و يا خلاف آن رسم كنيد چيز خوب و جالبي است ولي شما نمي توانيد اين دو حالت را با هم تركيب كنيد بدون اينكه ديد كاملي نسبت به آن داشته باشيد .
ما با رسم صفحه جلويي كار خود را آغاز خواهيم كرد. بخاطر اينكه تمام صفحات در نقطه بالايي مشترك هستند ما اين نقطه را براي تمام مثلث ها با رنگ قرمز رسم مي كنيم . رنگ دو راس ديگر مثلث ها متغير است . براي صفحه جلويي راس سمت چپ را سبز و سمت راست را آبي در نظر مي گيريم . سپس مثلث سمت راست را با راس سمت چپ آبي و راس راست سبز رسم مي كنيم . با ... نقاط پايين هر صفحه ما مي توانيم يك رنگ مشترك براي نقاط هر وجه پيدا كنيم .

 
   

  glColor3f(1.0,0.0,0.0); // Red
  glVertex3f( 0.0, 1.0, 0.0); // Top Of Triangle (Front)
  glColor3f(0.0,1.0,0.0); // Green
  glVertex3f(-1.0,-1.0, 1.0); // Left Of Triangle (Front)
  glColor3f(0.0,0.0,1.0); // Blue
  glVertex3f( 1.0,-1.0, 1.0);// Right Of Triangle (Front)

 

   
 

حالا ما وجه سمت راست را رسم مي كنيم . توجه داشته باشيد كه دو نقطه پاييني در سمت راست مركز رسم مي شوند . و نقطه راس با مختصات يك در محور y ها رسم مي شود . و در ميانه محور xها به سمت راست . ( در حقيقت بين کمترين و بيشترين مقدار xدر اين هرم ) . بدليل اينکه روي شيب از مرکز و بالا به سمت پايين و راست مي باشد .
در اين بخش از ترسيم سمت چپ آبي خواهد بود . با اين کار ، رنگ اين بخش مانند رنگ بخش پايين – سمت راست صفحه جلويي هرم خواهد بود . با اين کار گوشه اي از هرم بين صفحه جلو و راست به رنگ آبي در خواهد آمد .
توجه کنيد که ترسيم هر سه وجه بعدي هرم را نيز مانند وجه اول در يک بخش و بين
glBegin ( GL_POLYGON ); نوشتيم . چون ما تمام اين شيء را از ترکيب مثلث ساختيم ، پس OpenGL مي داند که هر سه نقطه اي که ما مشخص مي کنيم براي رسم يک مثلث است و آن مثلث رارسم مي کند . يکبار که سه نقطه را رسم مي کند ، اگر سه نقطه ديگر هم به آن بدهيم ، شروع به رسم يک مثلث جديد خواهد کرد . اگر چهار نقطه را مشخص کنيد ، OpenGLبا سه تاي اول يک مثلث رسم خواهد کرد و چهارمي را به عنوان نقطه شروع مثلث بعدي در نظر خواهد گرفت . و يک مربع رسم نخواهد کرد . پس مراقب باشيد که نقاط بيشتري را (به اشتباه) مشخص نکنيد .

 
   

  glColor3f(1.0,0.0,0.0); // Red
  glVertex3f( 0.0, 1.0, 0.0);// Top Of Triangle (Right)
  glColor3f(0.0,0.0,1.0); // Blue
  glVertex3f( 1.0,-1.0, 1.0);// Left Of Triangle (Right)
  glColor3f(0.0,1.0,0.0); // Green
  glVertex3f( 1.0,-1.0, -1.0);// Right Of Triangle (Right)

 

   
 

حالا رويه پشت را رسم مي کنيم . نقطه سمت چپ حالا دوباره سبز است ، زيرا گوشه آن با رويه سمت راست مجاور است .

 
   

  glColor3f(1.0,0.0,0.0); // Red
  glVertex3f( 0.0, 1.0, 0.0);// Top Of Triangle (Back)
  glColor3f(0.0,1.0,0.0);// Green
  glVertex3f( 1.0,-1.0,-1.0); // Left Of Triangle (Back)
  glColor3f(0.0,0.0,1.0); // Blue
  glVertex3f( 1.0,-1.0, -1.0);// Right Of Triangle (Back)

 

   
 

در نهايت هم ما رويه چپ را مي کشيم . رنگها براي آخرين بار تغيير مي کنند . نقطه سمت چپ آبي خواهد بود و با نقطه سمت راست رويه پشتي ترکيب مي شود . نقطه سمت راست هم سبز است و با نقطه سمت چپ رويه جلو ترکيب مي شود .
ما رسم هرم را تمام کرديم . زيرا هرم حول محور y ها مي چرخد و ما هرگز زير هرم را نخواهيم ديد . پس نيازي به رسم آن نداريم . اگر به دنبال کسب تجربه هستيد مي توانيد يک مربع در قسمت زير هرم رسم کنيد و هرم را حول محور x ها بچرخانيد تا ببينيد که آيا کارتان را درست انجام داده ايد يا خير . مطمئن شويد که رنگهايي را که براي گوشه هاي مربع انتخاب کرده ايد با رنگهاي چهار گوشه مجاور از هرم يکي است .

 
   

  glColor3f(1.0,0.0,0.0); // Red
  glVertex3f( 0.0, 1.0, 0.0);// Top Of Triangle (Back)
  glColor3f(0.0,0.0,1.0); // Blue
  glVertex3f( -1.0,-1.0,-1.0); // Left Of Triangle (Back)
  glColor3f(0.0,1.0,0.0); // Green
  glVertex3f( -1.0,-1.0,1.0); // Right Of Triangle (Back)

 

   
 

حالا مکعب را رسم مي کنيم . مکعب با شش مربع ساخته مي شود . تمام مربع ها در خلاف جهت حرکت عقربه هاي ساعت رسم مي شوند . بدين معني که اولين نقطه ، بالا سمت راست ، دومين نقطه بالا سمت چپ ، سومين نقطه پايين سمت چپ و آخرين نقطه پايين سمت راست خواهد بود . وقتي شما داريد وجه پشت مکعب را رسم مي کنيد ممکن است تصور کنيد که داريد در جهت عقربه هاي ساعت حرکت مي کنيد ولي توجه داشته باشيد که زماني که در پشت مکعب قرار مي گيريد ، سمت راست وجه پشت سمت چپ وجه جلو و برعکس مي باشد .
ما در اين درس مکعب را بيشتر به سمت داخل خواهيم برد تا حدوداً به اندازه هرم به نظر برسد . اگر اين کار را نکنيم و همان شش واحد را به سمت داخل برويم ، مربع بسيار بزرگتر به نظر خواهد رسيد و ممکن است قسمتهايي از آن در حال چرخش از صفحه بيرون بزند . شما مي توانيد اين موضوع را امتحان کنيد و ببينيد که وقتي مکعب را به داخل مي بريد کوچکتر به نظر مي رسد و نزديکتر کردن آن ، آنرا بزرگتر به نظر مي رساند . اين خاصيت پرسپکتيو است : اجسام دورتر ( آنهايي که فاصله بيشتري دارند ) کوچکتر به نظر مي رسند .

 
   

  glLoadIdentity();  
  glTranslatef(1.5,0.0,-6.0);  
  glRotatef(rquad,1.0,1.0,1.0); // Rotate The Quad On The X axis ( NEW )
  glBegin(GL_QUADS); // Start Drawing The Cube

 

   
 

ما کار را با رسم بالاي مکعب ادامه مي دهيم . ما از مرکز مکعب يک واحد به بالا مي رويم . توجه اشته باشيد که مقدار y هميشه يک است و ما در يک نما از محور z ها مربع را رسم مي کنيم . در حقيقت در داخل صفحه . ( اگر از روبرو نگاه کنيم ، اين مربع به صورت يک خط به نظر مي رسد ) . از نقطه بالا- راست از وجه بالايي مکعب شروع مي کنيم . نقطه بالا – راست با يک واحد به سمت راست و يک واحد به سمت داخل صفحه مشخص مي شود . نقطه دوم ، يک واحد به سمت راست و يک واحد به سمت داخل صفحه خواهد بود . حالا بايد انتهاي مربع را رسم کنيم . يعني قسمتي که به بيننده نزديکتر است . براي اينکار ، به جاي اينکه به داخل صفحه برويم به بيرون صفحه حرکت مي کنيم . مي توانيد تصور کنيد ؟ ( اين بخش اگه ديد پرسپکتيو خوبي نداشته باشيد يه کمي گنگ به نظر مي رسه . اگه هيچ سروکاري با نقشه کشي و autocad و امثالهم نداريد ، از يک نفر وارد بخوايد براتون توضيح بده ) .

 
   

    glColor3f(0.0,1.0,0.0);// Set The Color To Blue
    glVertex3f( 1.0, 1.0,-1.0);// Top Right Of The Quad (Top)
    glVertex3f(-1.0, 1.0,-1.0); // Top Left Of The Quad (Top)
    glVertex3f(-1.0, 1.0, 1.0); // Bottom Left Of The Quad (Top)
    glVertex3f( 1.0, 1.0, 1.0); // Bottom Right Of The Quad (Top)

 

   
 

وجه زير مکعب مانند وجه بالا رسم مي شود با يک تفاوت . به جاي اينکه يک واحد به سمت بالا برويم يک واحد از مرکز مکعب به سمت پايين مي آييم . پس توجه داشته باشيد که y همواره منفي يک است . اگر به زير مکعب برويم و به مربعي که قسمت زير را ساخته نگاه کنيم ، مي بينيم که سمت بالا – راست مربع قسمتي خواهد بود که به بيننده نزديکتر است . پس به جاي اينکه به عمق حرکت کنيم ، ابتدا نقطه اي را که به بيننده نزديکتر است رسم مي کنيم . سپس نقطه سمت چپ ، و سپس دو نقطه انتهايي را رسم مي کنيم .
اگر مطمئن نيستيد که جهت رسم چند صلعي چگونه است ( در جهت عقربه هاي ساعت يا خلاف آن ) ، مي توانيد همان کدي را که با آن قسمت بالاي مکعب را رسم کرديم ، براي قسمت زيري استفاده کرده و فقط مقدار y را به منفي يک تغيير دهيد . و اين هم به درستي عمل خواهد کرد . البته فعلاً ، زيرا زماني که به بحث "درج طرح "
( texture mapping ) برسيم ، نتيجه کار مطئمن و هميشگي نخواهد بود ( معلوم نيست چي مي شه ) .

 
   

    glColor3f(0.0,1.0,0.0);// Set The Color To Orange
    glVertex3f( 1.0,-1.0, 1.0);// Top Right Of The Quad (Bottom)
    glVertex3f(-1.0,-1.0, 1.0); // Top Left Of The Quad(Bottom)
    glVertex3f(-1.0,-1.0,-1.0); // Bottom Left Of The Quad (Bottom)
    glVertex3f( 1.0,-1.0,-1.0); // Bottom Right Of The Quad (Bottom)

 

   
 

حالا مربع جلو را رسم مي کنيم . ما يک واحد به سمت بيرون از صفحه مي آييم ( از مرکز مکعب ) و مقدار z هميشه يک خواهد بود . در هرم مقدار z هميشه يک نبود . در بالا z صفر بود . اگر در اينجا شما مقار صفر به z بدهيد ، گوشه اي که مقدار آنرا عوض کرده ايد ، به حالت شيب دار بر روي صفحه رسم خواهد شد . و اين کاري نيست که ما الان بخواهيم انجام دهيم .

 
   

    glColor3f(1.0,0.5,0.0); // Set The Color To Red
    glVertex3f( 1.0, 1.0, 1.0);// Top Right Of The Quad (Front)
    glVertex3f(-1.0, 1.0, 1.0); // Top Left Of The Quad (Front)
    glVertex3f(-1.0,-1.0, 1.0); // Bottom Left Of The Quad (Front)
    glVertex3f( 1.0,-1.0, 1.0); // Bottom Right Of The Quad (Front)

 

   
 

حالا نوبت وجه پشت است . اين مربع مانند وجه جلو است با اين تفاوت که مقدار Z براي تمام نقاط منفي يک خواهد بود .

 
   

    glColor3f( 1.0, 1.0,0.0); // Set The Color To Yellow
    glVertex3f( 1.0,-1.0,-1.0);// Top Right Of The Quad Back)
    glVertex3f(-1.0,-1.0,-1.0); // Top Left Of The Quad (Back)
    glVertex3f(-1.0, 1.0,-1.0); // Bottom Left Of The Quad (Back)
    glVertex3f( 1.0, 1.0,-1.0); // Bottom Right Of The Quad (Back)

 

   
 

حالا ما تنها دو مربع ديگر داريم که بايد رسم شوند و اينکار را خواهيم کرد . همانطور که ديديد در رسم هر مربع يکي از اعداد براي محورهاي مختصات تغيير نکرد و ثابت ماند . در اين بخش مقدار xهمواره منفي يک خواهد بود . اين بدين خاطر است که ما ترسيمات مان در سمت چپ مرکز خواهد بود ، زيرا اين قسمت رويه چپ خواهد بود .

 
   

    glColor3f(0.0,0.0,1.0);// Set The Color To Blue
    glVertex3f(-1.0, 1.0, 1.0);// Top Right Of The Quad (Left)
    glVertex3f(-1.0, 1.0,-1.0); // Top Left Of The Quad (Left)
    glVertex3f(-1.0,-1.0,-1.0); // Bottom Left Of The Quad (Left)
    glVertex3f(-1.0,-1.0, 1.0); // Bottom Right Of The Quad (Left)

 

   
 

اين آخرين روبه خواهد بود تا مکعب ما کامل شود . مقدار x همواره يک خواهد بود . رسم در جهت حرکت عقربه هاي ساعت خواهد بود . مي توانيد اين وجه را رسم نکنيد تا يک حعبه بدست آوريد .
يا اينکه مي توانيد رنگهاي هر نقطه را تغيير بدهيد تا مانند هرم يک پخش رنگ داشته باشيد .

 
   

    glColor3f( 1.0, 0.0, 1.0); // Set The Color To Violet
    glVertex3f( 1.0, 1.0,-1.0);// Top Right Of The Quad (Right)
    glVertex3f( 1.0, 1.0, 1.0); // Top Left Of The Quad (Right)
    glVertex3f( 1.0,-1.0, 1.0); // Bottom Left Of The Quad (Right)
    glVertex3f( 1.0,-1.0,-1.0); // Bottom Right Of The Quad (Right)
 glEnd(); // Done Drawing The Quad

 

   
 

حالا در پايان اين درس شما درک بهتري از نحوه رسم اجسام در دنياي سه بعدي داريد . شما مي توانيد صفحه OpenGL را مانند يک کاغذ رسم بسيار بزرگ تصور کنيد که لايه هاي مختلط آن شفاف هستند . ( لايه هاي زيري قابل رويت يا transparent هستند ) . يک مکعب بزرگ از تعدادي نقاط تشکيل شده است . بعضي از اين نقاط از چپ به راست هستند . بعضي از بالا به پايين و بعضي هم در پشت مرکعب قرار مي گيرند . اگر مي توانيد مفهوم عمق را به خوبي درک کنيد ، پس مشگلي در طراحي و ساخت اجسام سه بعدي نخواهيد داشت .
اگر زمان زيادي را صرف فهميدن مفاهيم و تجسم دنياي سه بعدي کرده ايد ، ناراحت نباشيد زيرا اين کار بي حاصل نخواهد بود . شکلي مانند مکعب بهترين مثال براي تجسم دنياي سه بعدي خواهد بود . و اگر مفهوم دنياي سه بعدي را درک نکرديد ...... بهتر است برنامه نويسي گرافيکي را کنار بگذاريد . زيرا زمان گرافيکهاي دو بعدي خيلي وقت است که سپري شده است . سعي کنيد کد را تغيير دهيد تا مفاهيم و اشکالات همينجا کامل شوند و اگر نتوانستيد دليل ايرادي را بفهميد و يا مشگل خاصي داشتيد با من تماس بگيريد .  

 
   

  

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

 

درس ششم ->

<- درس چهارم