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

 

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

 

ما کار را با اضافه کردن دو متغير آغاز خواهيم کرد که هر کدام مقدار يا زاويه چرخش را براي هر کدام از اشياء نگه خواهند داشت . ما اين کار را در ابتداي برنامه انجام خواهيم داد زير ساير متغيرها . شما بايد به دو خط پس از FullScreen:bool توجه کنيد . در اين دو خط دو متغير به صورت مميز شناور (float) تعريف شده اند تا ما بتوانيم اشياء را با دقت خوبي بچرخانيم . مميز به اعداد صحيح قدرت مي بخشد . بدين معني که ما مجبور نيستيم که از اعداد 1 يا 2 يا 3 براي زاويه استفاده کنيم . بلکه مي توانيم از اعداد 1.1 يا 1.7 يا حتي 2.3 يا 1.015 براي دقت خوب و چرخش نرم استفاده کنيم . شما درخواهيد يافت که اين اعداد مميز شناور براي برنامه نويسي OpenGL بسيار لازم و ضروري هستند . اين متغير هاي جديد به نامهاي rtri براي مثلث و rquad براي مربع هستند .

 
   

 

var
h_RC: HGLRC; // Permanent Rendering Context
h_DC: HDC; // Private GDI Device Context
h_Wnd:HWND; // Holds Our Window Handle
keys: array [0..255] of BOOL; // Array Used For The Keyboard Routine
Active:bool; // Window Active Flag
FullScreen:bool; // Fullscreen Flag
rtri: GLfloat; // Angle For The Triangle ( NEW )
rquad: GLfloat; // Angle For The Quad ( NEW )
 

 

   
 

حالا ما نياز داريم تا روال 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
  glTranslatef(-1.5,0.0,-6.0);

 

 

   
 

خط بعدي جديد است . glRotatef(Angle,Xvector,Yvector,Zvector) مسئول چرخاندن شيء دور يک محور است . زاويه يا Angle يک عدد است که معمولا در يک متغير ذخيره شده است و نشان مي دهد که شما مي خواهيد شيء را چقدر بچرخانيد . سه پارامتر بعدي هم نشان مي دهد که اين چرخش در راستاي کدام محور مختصات بايد اتفاق بيافتد . به عنوان مثال اگر شما از مقدار (1،0،0) استفاده کنيد شما يک بردار را که در جهت محور x ها يک واحد به سمت مثبت است را مشخص مي کنيد . ولي اگر از (1،0،0 - ) استفاده کنيد يک مسير يک واحدي در راستاي محور x ها ولي اينبار رو به سمت چپ را مشخص کرده ايد .

بايد توجه داشته باشيد که زاويه چرخش بر حسب درجه ( degrees ) خواهد بود .

 
   

 

    glRotatef(rtri,0.0,1.0,0.0); // Rotate The Triangle On The Y axis ( NEW )

 

 

   
 

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

 
   

  glBegin(GL_POLYGON);
    glColor3f(1.0,0.0,0.0); // Set The Color To Redd
    glVertex3f( 0.0, 1.0, 0.0);
    glColor3f(0.0,1.0,0.0); // Set The Color To Green
    glVertex3f(-1.0,-1.0, 0.0);
    glColor3f(0.0,0.0,1.0); // Set The Color To Blue
    glVertex3f( 1.0,-1.0, 0.0);
  glEnd();

 

 

   
 

اگر به کد زير توجه کنيد مي بينيد که ما يک دستور glLoadIdentity ديگر به اين بخش اضافه کرده يم . ما اين کار را به اين خاطر انجام مي دهيم که ديد را ريست کنيم . اگر اين کار را انجام ندهيم چرخش بعدي که انجام دهيم نتيجه کار خيلي غير منتظره خواهد بود . شما مي توانيد اين موضوع را با برداشتن اين دستور امتحان کنيد . و اين به دليل اين است که چون محورها چرخيده اند ( بله در حقيقت محورها مي چرخند ولي ما تصور مي کنيم که جسم مي چرخد !!! ) حالا معلوم نيست که محور x ها در چه وضعيتي قرار دارد و همينطور ساير محورهاي مختصات .

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

بعد از اينکه ما به مکان جديد در سمت راست صفحه رفتيم مربع را حول محور X ها مي چرخانيم . اين سبب خواهد شد که مربع به سمت بالا و پايين بچرخد .

 
   

 

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

 

 

   
 

خطوط بعدي تغييري نکرده اند . آنها يک مربع آبي را رسم خواهند کرد . اين مربع در سمت راست صفحه و با زاويه چرخش مورد نظر رسم خواهد شد .

 
   

 

  glColor3f(0.5,0.5,1.0); // Set The Color To Blue One Time Only
  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();

 

 

   
 

دو خط بعدي جديد هستند . دو متغير rtri و rquad را مانند دو ظرف در نظر بگيريد . ما آنها را در ابتداي برنامه ساختيم . وقتي ما آنها را مي سازيم چيزي درون آنها نيست . اولين خط به محتواي rtri به اندازه 0.2 اضافه مي کند . پس هر زمان که ما محتواي اين ظرف را بعد از اين خط چک کنيم به محتوي آن 0.2 اضافه شده است . در خط بعدي از محتواي rquad  به اندازه 0.15 کم شده است . اين مسئله باعث مي شود که شيء برعکس بچرخد .

سعي کنيد علامتهاي + و - را در خطوط زير عوض کنيد تا تعويض جهت چرخش را ببينيد . همينطور سعي کنيد مقدار کم و زياد شدنها را تغيير دهيد تا تغيير سرعت چرخش و يا پرش جسم را ببينيد . ( در صورتي که اعداد چرخش به درستي انتخاب نشوند حرکت نرمي از چرخش آنها بدست نخواهد آمد ) .

 
   

 

  rtri := rtri + 0.2; // Increase The Rotation Variable For The Triangle ( NEW )
  rquad := rquad - 0.15; // Decrease The Rotation Variable For The Quad ( NEW )
  DrawGLScene:=true; // Everything Went OK
end;

 

   
 

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


( ترجمه و آماده سازي اين درس يه مقداري زيادي طول کشيد . به همين علت يکي از دوستان پيشنهاد کرد که از مترجم هاي موجود استفاده کنم . منم استفاده کردم اينم نتيجه اش :

Play around with the code, try spinning the objects

رمز مقاربت جنسي داشته باشيد، اهداف را سعي مي‌كند بچرخد

جل الخالق !!! تمام گزينه هاي ترجمه از کامپيوتر و مقاله تخصصي و غيره رو هم زده بودم  )

 

    
  

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

 

درس پنجم ->

<- درس سوم