با توسعه دادن درس قبل حالا مي خواهيم اشياء سه بعدي واقعي بسازيم بجاي اينكه اشياء دو بعدي را در يك محيط سه بعدي داشته باشيم . ما اين كار را با اضافه كردن صفحات چپ پشت و راست به مثلث و صفحات چپ راست پشت بالا و پايين به مربع انجام مي دهيم . با اين كار ما مثلث را به هرم و مربع را به مكعب تبديل مي كنيم . ما براي هرم از پخش رنگ و براي هر وجه از مكعب يك رنگ را استفاده خواهيم كرد . | ||
| 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در اين هرم ) . بدليل اينکه روي شيب از مرکز و بالا به سمت پايين و راست مي باشد . | ||
| 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) |
در نهايت هم ما رويه چپ را مي کشيم . رنگها براي آخرين بار تغيير مي
کنند . نقطه سمت چپ آبي خواهد بود و با نقطه سمت راست رويه پشتي ترکيب مي شود .
نقطه سمت راست هم سبز است و با نقطه سمت چپ رويه جلو ترکيب مي شود . | ||
| 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
همواره منفي يک است . اگر به زير مکعب برويم و به مربعي که قسمت زير را ساخته نگاه
کنيم ، مي بينيم که سمت بالا – راست مربع قسمتي خواهد بود که به بيننده نزديکتر است
. پس به جاي اينکه به عمق حرکت کنيم ، ابتدا نقطه اي را که به بيننده نزديکتر است
رسم مي کنيم . سپس نقطه سمت چپ ، و سپس دو نقطه انتهايي را رسم مي کنيم . | ||
| 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
| ||
|
درس ششم -> |
<- درس چهارم | |