Professional Documents
Culture Documents
Graphics (OpenGL) Session 3
Graphics (OpenGL) Session 3
الجزء العملي
3 بيانيات
هدف الجلسة
ّ
والتعرف عىل طريقة رسم المنحنيات مثل الدائرة ،وإضافة نماذج ملء إىل المضلعات. ثنائ األبعاد، ّ
إجراء التحويالت الهندسية يف الفضاء ي
شكل 1
ثنائ األبعاد .سيتم قطع الكائنات الموجودة خارج منطقة التقليم ولن
لتعيي منطقة التقليم أو القص يف الفضاء ي
ر يستخدم التابع gluOrtho2D
يمكن رؤيتها.
)void gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top
// The default clipping area is (-1.0, 1.0, -1.0, 1.0) in OpenGL coordinates,
// i.e., 2x2 square centered at the origin.
التاىل:
لتعيي منطقة التقليم ،نحتاج إىل سلسلة من األوامر عىل النحو ي
ر
ً
-نختار أوال مصفوفة اإلسقاطglMatrixMode(GL_PROJECTION) ،
ّ
تعيي مصفوفة اإلسقاط إىل المصفوفة الواحديةglLoadIdentity() ، -إعادة ر
ثنائ األبعاد مع منطقة القطع المرغوبة ،عيالتابع .gluOrtho2D
-ثم نختار النمط ي
// Set to 2D orthographic projection with the specified clipping area
glMatrixMode(GL_PROJECTION); // Select the Projection matrix for operation
glLoadIdentity(); // Reset Projection matrix
gluOrtho2D(-1.0, 1.0, -1.0, 1.0); // Set clipping area's left, right, bottom, top
لتحديد أبعادglViewport ويستخدم التابع،1 كما يف الشكلviewport عىل منفذ العرضclipping-area يتم إسقاط منطقة التقليم
.منفذ العرض
void glViewport(GLint xTopLeft, GLint yTopLeft, GLsizei width, GLsizei height)
الكاميا مثل ضبط منطقة التقليم) ومصفوفة ر (الت تتعامل مع إسقاط
يprojection مصفوفة اإلسقاط،مصفوفتي ر عىلOpenGL يحتوي
ومن الواضح أنه إذا لم تكن نسبة العرض إىل االرتفاع،)المحىل إىل فضاء العالم
ي (لتحويل الكائنات من الفضاءmodel-view عرض النموذج
. فستتشوه األشكال،لمنطقة التقليم وإطار العرض متطابقة
لضمان تناسق نسبة العرض إىل االرتفاع ربي منطقة التقليم، والذي يتم استدعاؤه كلما تغ رّي حجم النافذة،reshape يمكن استخدام تابع
. كما هو موضح يف المثال أعاله، وإطار العرض
/* Handler for window re-size event. Called back when the window first appears and
whenever the window is re-sized with its new width and height */
void reshape(GLsizei width, GLsizei height) { // GLsizei for non-negative integer
// Compute aspect ratio of the new window
if (height == 0) height = 1; // To prevent divide by 0
GLfloat aspect = (GLfloat)width / (GLfloat)height;
// Set the aspect ratio of the clipping area to match the viewport
glMatrixMode(GL_PROJECTION); // To operate on the Projection matrix
glLoadIdentity(); // Reset the projection matrix
if (width >= height) {
// aspect >= 1, set the height from -1 to 1, with larger width
gluOrtho2D(-1.0 * aspect, 1.0 * aspect, -1.0, 1.0);
} else {
// aspect < 1, set the width to -1 to 1, with larger height
gluOrtho2D(-1.0, 1.0, -1.0 / aspect, 1.0 / aspect);
}
}
:تغيي حجم نافذة العرض ّ
كتابع إستجابة لحدث رreshape عي التابع
ن رmain ضمن التابع
glutReshapeFunc(reshape); // Register callback handler for window re-size event
2
2 شكل
ثنائ األبعاد
التحويالت يف الفضاء ي
Translation & Rotation اإلزاحة والدوران
ّ
بتعيي كل شكل من األشكال عن طريق تحديد اإلحداثيات المطلقة للنقاط المشكلة لها ضمن إحداثيات فضاء ر يف األمثلة السابقة قمنا
.World-coordinate العالم
ً
local-المحىل
ي يمكن تعي ري كل شكل من األشكال عن طريق تحديد إحداثيات النقاط بما يتناسب مع مركزها ضمن الفضاء،بدال من ذلك
ّ
.الهندسية مثل اإلزاحة أو التدوير لوضع األشكال يف المواقع المطلوبة يف فضاء العالم بعد ذلك يمكن استخدام التحويالت.coordinate
:المحىل
ي وتحديد اإلحداثيات وفق الفضاءdisplay سوف نقوم بتعديل تابع الرسم
void display() {
glClear(GL_COLOR_BUFFER_BIT); // Clear the color buffer
glMatrixMode(GL_MODELVIEW); // To operate on Model-View matrix
glLoadIdentity(); // Reset the model-view matrix
3
glColor3f(0.2f, 0.2f, 0.2f); // Dark Gray
glVertex2f( 0.2f, 0.2f);
glColor3f(1.0f, 1.0f, 1.0f); // White
glVertex2f(-0.2f, 0.2f);
glEnd();
.glBegin/glEnd مت
ويجب أن يستدىع تابع اإلزاحة خارج تعلي ي
:تابع الدوران
void glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
// where angle specifies the rotation in degree, (x, y, z) forms the axis of rotation.
4
المنحنيات Curves
التاىل: ّ
الخطية كلما زادت دقة اإلنحناء ،كما يف الشكل صغية ،كلما زادت عدد المقاطع
ر المنحت بتجميع مقاطع خطوط ينتج الخط
ي ي
{ )(void drawCircle
#define PI 3.14159265
#define EDGES 30 // try to increase and decrease the EDGES
#define factor 1
;)glClear(GL_COLOR_BUFFER_BIT
};)(glFlush
5
ً ّ ّ حيث يتم ملء عنارص المصفوفة اعتبا ًرا من الزاوية اليس،لتعريف القناع يتم بناء مصفوفة تقابل النموذج
السفلية للنموذج (يؤخذ سطرا ارية
ّ
.)العملية حت إنتهاء األسطر ّ ً
التاىل وهكذا تتكرر
كامل من المربعات وبعد اإلنتهاء من السطر تتم العودة إىل بداية الزاوية اليسارية يف السطر ي
:الت تقابل نموذج الفراشة السابق
المصفوفة ي
GLubyte fly[] = { 0X00,0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X03,0X80, 0X01, 0XC0, 0X06, 0XC0, 0X03, 0X60,
0X04, 0X60, 0X06, 0X20, 0X04, 0X30, 0X0C, 0X20,
0X04, 0X18, 0X18, 0X20, 0X04, 0X0c, 0X30, 0X20,
0X04, 0X06, 0X60, 0X20, 0X44, 0X03, 0Xc0, 0X22,
0X44, 0X01, 0X80, 0X22, 0X44, 0X01, 0X80, 0X22,
0X44, 0X01, 0X80, 0X22, 0X44, 0X01, 0X80, 0X22,
0X44, 0X01, 0X80, 0X22, 0X44, 0X01, 0X80, 0X22,
0X66, 0X01, 0X80, 0X66, 0X33, 0X01, 0X80, 0Xcc,
0X19, 0X81, 0X81, 0X98, 0X0c, 0Xc1, 0X83, 0X30 };
6
0XAA,0XAA, 0XAA, 0XAA, 0X55, 0X55, 0X55, 0X55,
0XAA,0XAA, 0XAA, 0XAA, 0X55, 0X55, 0X55, 0X55,
0XAA,0XAA, 0XAA, 0XAA, 0X55, 0X55, 0X55, 0X55,
0XAA,0XAA, 0XAA, 0XAA, 0X55, 0X55, 0X55, 0X55,
0XAA,0XAA, 0XAA, 0XAA, 0X55, 0X55, 0X55, 0X55,
0XAA,0XAA, 0XAA, 0XAA, 0X55, 0X55, 0X55, 0X55,
0XAA,0XAA, 0XAA, 0XAA, 0X55, 0X55, 0X55, 0X55,
0XAA,0XAA, 0XAA, 0XAA, 0X55, 0X55, 0X55, 0X55,
0XAA,0XAA, 0XAA, 0XAA, 0X55, 0X55, 0X55, 0X55
};
glEnable(GL_POLYGON_STIPPLE);
glPolygonStipple(fly);
glRectf(-10.0, -20.0, 0.0, -10.0);
glPolygonStipple(halftone);
glRectf(0.0, -20.0, 10.0, -10.0);
glDisable(GL_POLYGON_STIPPLE);
glFlush();
}