در درس قبل من به شما ياد دادم که چگونه رنگ را به مثلث و مربع اضافه کنيد . در اين درس من به شما خواهم آموخت که چگونه اين اجسام رنگ شده را حول يک محور ( مختصات ) بچرخانيد .
از همان کد درس قبل استفاده کنيد . ما چند بخش کوچک به آن اضافه خواهيم کرد .من بخش زير را دوباره و به طور کامل مي نويسم تا پيدا کردن قسمتهاي اضافه شده و همينطور قسمتهايي که بايد جايگزين شوند براي شما آسان باشد .
ما کار را با اضافه کردن دو متغير آغاز خواهيم کرد که هر کدام مقدار يا زاويه چرخش را براي هر کدام از اشياء نگه خواهند داشت . ما اين کار را در ابتداي برنامه انجام خواهيم داد زير ساير متغيرها . شما بايد به دو خط پس از 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); اگر به کد زير توجه کنيد مي بينيد که ما يک دستور glLoadIdentity ديگر به اين بخش
اضافه کرده يم . ما اين کار را به اين خاطر انجام مي دهيم که ديد را ريست کنيم .
اگر اين کار را انجام ندهيم چرخش بعدي که انجام دهيم نتيجه کار خيلي غير منتظره
خواهد بود . شما مي توانيد اين موضوع را با برداشتن اين دستور امتحان کنيد . و اين
به دليل اين است که چون محورها چرخيده اند ( بله در حقيقت محورها مي چرخند ولي ما
تصور مي کنيم که جسم مي چرخد !!! ) حالا معلوم نيست که محور x ها در چه وضعيتي قرار
دارد و همينطور ساير محورهاي مختصات .
وقتي يکبار منظره ريست شد ، پس x به چپ و راست ، y به
بالا و پايين و z به داخل و خارج در حالت اصلي خود اشاره مي کنند . شما بايد توجه
کنيد که ما فقط بايد 1.5 واحد به سمت راست برويم و نه 3 واحد . زيرا وقتي منظره را
ريست مي کنيم کانون ( مرکز ) ما به مرکز صفحه مي آيد و اين بدين معني است که ما 1.5
واحد به سمت چپ نيستيم تا مجبور باشيم که 3 واحد به سمت راست بياييم . پس از مرکز
1.5 واحد به سمت راست مي آييم .
بعد از اينکه ما به مکان جديد در سمت راست صفحه رفتيم
مربع را حول محور X ها مي چرخانيم . اين سبب خواهد شد که مربع به سمت بالا و پايين
بچرخد .
glLoadIdentity(); // ( NEW ) خطوط بعدي تغييري نکرده اند . آنها يک مربع آبي را رسم خواهند کرد . اين مربع در
سمت راست صفحه و با زاويه چرخش مورد نظر رسم خواهد شد .
glColor3f(0.5,0.5,1.0); // Set The Color To
Blue One Time Only دو خط بعدي جديد هستند . دو متغير
rtri و rquad
را مانند دو ظرف در نظر بگيريد . ما آنها را در ابتداي برنامه ساختيم . وقتي ما
آنها را مي سازيم چيزي درون آنها نيست . اولين خط به محتواي
rtri
به اندازه 0.2 اضافه مي کند . پس هر زمان که ما محتواي اين ظرف را بعد از اين خط چک
کنيم به محتوي آن 0.2 اضافه شده است . در خط بعدي از محتواي
rquad
به اندازه 0.15 کم شده است . اين مسئله باعث مي شود که شيء برعکس بچرخد .
سعي کنيد علامتهاي + و - را در خطوط زير عوض کنيد تا
تعويض جهت چرخش را ببينيد . همينطور سعي کنيد مقدار کم و زياد شدنها را تغيير دهيد
تا تغيير سرعت چرخش و يا پرش جسم را ببينيد . ( در صورتي که اعداد چرخش به درستي
انتخاب نشوند حرکت نرمي از چرخش آنها بدست نخواهد آمد ) .
rtri := rtri + 0.2; // Increase The Rotation Variable For The Triangle (
NEW ) در اين درس تا آنجا که
امکان داشت جزئيات را شرح دادم تا مفهوم چرخش اجسام حول محورهاي مختصات را
دريابيد . سعي کنيد کد را تغيير دهيد تا اجسام شما حول محورها ديگر
يا ترکيبي از آنها بچرخند . تمرين را فراموش نکنيد . اگر جايي ايرادي مي
بينيد و يا فکر مي کنيد با اضافه و يا کم کردن بخشهايي به خوانايي و يا افزايش
عملکرد برنامه و يا سطح آموزش اضافه مي شود حتماً با
من در ميان بگذاريد
Play around with the code, try spinning the objects
رمز مقاربت جنسي داشته
باشيد، اهداف را سعي ميكند بچرخد
جل الخالق !!! تمام گزينه هاي ترجمه از
کامپيوتر و مقاله تخصصي و غيره رو هم زده بودم )
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();
glTranslatef(1.5,0.0,-6.0);
glRotatef(rquad,1.0,0.0,0.0); // Rotate The Quad On The X axis ( NEW )
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();
rquad := rquad - 0.15; // Decrease The Rotation Variable For The Quad (
NEW )
DrawGLScene:=true; // Everything Went OK
end;
( ترجمه و آماده سازي اين درس يه مقداري زيادي طول کشيد . به همين علت يکي
از دوستان پيشنهاد کرد که از مترجم هاي موجود استفاده کنم . منم استفاده کردم
اينم نتيجه اش :
| دريافت ليست دلفي نوشته شده توسط Peter De Jaegher
| ||
|
درس پنجم -> |
<- درس سوم | |