Professional Documents
Culture Documents
Session 5
Session 5
Engineering
جامعة حلب
University of Aleppo قسم هندسة احلواسيب
Computer Engineering Department
الجلسة الخامسة
مق ـدمة
سنتعلم في هذه الجلسة كيفية استخدام OpenGLللقيام بالوظائف التالية:
-توضيع وتوجيه اجملسمات يف الفضاء ثالثي األبعاد.
-مالئمة املوقع لعني الناظر.
يجب تذكر أن هدف رسوميات الحاسب يتمثل في خلق صورة ثنائيةة البعةد سجسةام ثةثيةة البعةد بلدةا بعةدين
فقط سندا سترسم على الشاشة).
مبدأ عمل الكاميرا
يمكةةن تشةةبي ه عمليةةة التحويةةل فةةي الحاسةةب للحصةةول علةةى المشةةدد المطلةةوب ر يتةةه بعمليةةة التقةةاط صةةورة
بالكاميرا .والخطوات هي:
-تثبيت حامل الكامريا وتوجيه الكامريا إىل املشهد (حتويالت .)viewing
-تنظيم املشهد ووضع عناصره يف املكان املناسب (حتويالت .)modeling
-اختيار عدسة الكامريا وتعديل التقريب والتبعيد ( zoomحتويالت .)projection
-حتديد حجم الصورة النهائية (حتويالت .)viewport
بعد تنفيذ هذه الخطوات يمكن التقاط الصورة بواسطة الكاميرا وبشكل مشابه يمكن رسم المشةدد علةى شاشةة
الحاسب.
هناك ترتيب لدذه العمليات ،فتحةويةت viewingيجةب أن تسةبق تحةويةت modelingفةي شةيفرة البرنةام ،
أما تحويةت projectionو viewportفيمكن تحديدها في أي مكةان ببةل حةدول الرسةم .يبةين الشةكل التةالي
الترتيب الذي تنفذ فيه هذه العمليات على الحاسب.
لتحقيق تحويةت projectionو modelingو viewingسنبني مصفوفة Mأبعادها 4x4يتم ضربدا بإحداثيات
كل رأس Vفي المشدد لتحقيق التحويل المطلوب.
V` = MV
مث ـال:
يرسم هذا المثال مكعبا يتم تحجيمهبتكبيره إلى الضعف وفق المحور ) yونقله مسافة بسيطة عكةس المحةور
Zعن طريق تحويل .modelingكذلك يتم تحديد تحويل إسقاط وتحويل .viewport
>#include<GL/glut.h
>#include <stdlib.h
>#include<math.h
آخةةر تحويةةل يسةةتدعى فةةي برنامجةةك هةةو فعليةةا أول.4x4 تمثةةل بمصةةفوفةmodeling وviewing تحةةويةت
.تحويل يطبق على الر وس
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMultMatrixf(N); /* apply transformation N */
glMultMatrixf(M); /* apply transformation M */
glMultMatrixf(L); /* apply transformation L */
glBegin(GL_POINTS);
glVertex3f(v); /* draw transformed vertex v */
glEnd();
النات )).N(M(LV
لنكتب الشيفرة البرمجية للشكل السابق على افتراض أن الدوران يتم أوال ثم التحريك:
;)glMatrixMode(GL_MODELVIEW
;)(glLoadIdentity
;)glMultMatrixf(T /* translation */
;)glMultMatrixf(R /* rotation */
;)(draw_the_object
تصدر أوامر التحويل viewingأوال ثم modeling
تحويالت modeling
هناك ثةثة تحويةت modelingوهي )(*.glScale*() ،glRotate*() ،glTranslate
هةةةةذه التحةةةةويةت الثةثةةةةة مكافئةةةةة لتشةةةةكيل مصةةةةفوفة النقةةةةل ،والةةةةدوران ،وتغييةةةةر الحجةةةةم ثةةةةم اسةةةةتدعاء
)(* glMultMatrixم المصفوفة المةئمة كوسيط.
تحويل النقل Translate
;)void glTranslate{fd}(TYPEx, TYPE y, TYPEz
تضرب المصفوفة الحالية بمصفوفة تنقل الجسم بمقدار بيم x,y,zكما هو مبين في الشكل التالي:
يضرب المصفوفة الحالية بمصفوفة تدور الجسم بعكس عقارب الساعةب )+أو م عقارب الساعة ب )-حةول
محور معين وبزاوية تقدر بالدرجات.
تبين اسشكال التالية الدوران الموجب والسالب للمحاور الثةثة.
إحةةداثي x,y,zلكةةل نقطةةة بالمعامةةل الموافةةق . x,y,zوالجسةةم المةةرتبط يتمةةدد معدةةا .يظدةةر الشةةكل التةةالي تةةأثير
التحويل )glScalef (2.0,-0.5,1.0
القيم أكبر من 1تكبير وأصغر من 1تصغير .القيم -1تعني عكس الجسم على المحور.
تحويالت viewing
تسةةتخدم لتغييةةر موبة ووجدةةة نظةةر المشةةدد بالكةةاميرا) .يشةةبه ذلةةك وض ة أرجةةل الكةةاميرا وتوجيددةةا باتجةةاه
الجسم .تتألف عادة تحويةت viewingمن نقل ودوران.
يكافئ تحويل modelingالذي يةدور جسةم عكةس عقةارب السةاعة تحويةل viewingالةذي يةدور الكةاميرا مة
عقارب الساعة.
تستطي تحريك الكاميرا بعيدا عن اسجسام إلى الوراء وهذا له نفس تأثير تحريك اسجسام بعيدا عن الكاميرا
لألمام .اسمر المستخدم )glTranslatef(0.0,0.0,-5.0
إذا أردنةا ر يةة العناصةر مةن الجانةب يجةب تةدوير الجسةم ثةم تحريكةه بعيةدا عةن الكةاميرا حتةى يمكةن ر يةة
الجانب المطلوب من العنصر بتكتب اسوامر بعكس الترتيب التحريك ثم الدوران)
)glTranslatef(0.0,0.0,-5.0 (مجلة االحداثيات احمللية)
;)glRotate(90.0,0.0,1.0,0.0
مثال:
;) gluLookAt( 0.0, 0.0, 50.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0
;) gluLookAt( 0.0, 0.0, -50.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0
القسم العملي
:) (هرم ومكعب3D إلى2D تحويل المربع والمثلث من:1 تطبيق
#include<GL/glut.h>
#include <stdlib.h>
#include<math.h>