الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية الاستجابة للمفاتيح في ال OpenGL

مغلق
بدأه ahmed996 في 22 أبريل 2002 · 4 رد · 540 مشاهدة · في ارشيف قسم C/C++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

الى خبراء الفيجوال سي ++ ساعدوني اني اغرق

يااخوان واخوات الرجاء المساعدة !!! طلبت مساعدة قبل اسبوع ولم اجد معينا

عندي كود يقوم بعمل تدوير لمكعب اريد فقط جعله يتحرك مع حركة الاسهم الاربعة ، يعني اذا ضغطت سهم يسار يروح المكعب يسار اذا ضغطت سهم فوق يروح المكعب لأعلى ،وهكذا ...

صعبه هذه ياشباب !!! اكيد لا !! اجل ساعدوني

الرجاء المساعدة !!!!!!!!!

أحمد

/* 

  cube.cpp 
*/ 
#include "stdlib.h" 
#include "GL/glut.h" 


/* 
define vertices {x,y,z} and colors {r,g,b} 

*/ 
GLfloat vertices[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0}, 
                        {1.0,1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,1.0}, 
                        {1.0,-1.0,1.0},{1.0,1.0,1.0},{-1.0,1.0,1.0}}; 

GLfloat normals[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0}, 
                        {1.0,1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,1.0}, 
                        {1.0,-1.0,1.0},{1.0,1.0,1.0},{-1.0,1.0,1.0}}; 

GLfloat colors[][3] = {{0.0,0.0,0.0},{1.0,0.0,0.0}, 
                        {1.0,1.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0}, 
                        {1.0,0.0,1.0},{1.0,1.0,1.0},{0.0,1.0,1.0}}; 

/* 

  draw polygon 

*/ 
void polygon (int a, int b, int c, int d) 
{ 
    /* draw a polygon via list of vertices */ 
    glBegin(GL_POLYGON); 
    glColor3fv(colors[a]); 
    glNormal3fv(normals[a]); 
    glVertex3fv(vertices[a]); 

    glColor3fv(colors); 
    glNormal3fv(normals); 
    glVertex3fv(vertices); 

    glColor3fv(colors[c]); 
    glNormal3fv(normals[c]); 
    glVertex3fv(vertices[c]); 

    glColor3fv(colors[d]); 
    glNormal3fv(normals[d]); 
    glVertex3fv(vertices[d]); 
    glEnd(); 

} 

/* 
draw cube 

*/ 
void colorcube(void) 
{ 
    /* draw 6 faces of cube */ 
    polygon(0,3,2,1); 
    polygon(2,3,7,6); 
    polygon(0,4,7,3); 
    polygon(1,2,6,5); 
    polygon(4,5,6,7); 
    polygon(0,1,5,4); 
} 



static GLfloat theta[] = {0.0,0.0,0.0}; 
static GLint axis = 0; 


/* 
rotate angle (theta) and display cube 
*/ 
void display (void) 
{ 
    /* display callback*/ 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 

    glRotatef(theta[0],1.0,0.0,0.0); 
    glRotatef(theta[1],0.0,1.0,0.0); 
    glRotatef(theta[2],0.0,0.0,1.0); 

    /* draw cube */ 
    colorcube(); 

    glFlush(); 
    glutSwapBuffers(); 

} 

/* 
increment angle (theta) 
*/ 
void SpinCube() 
{ 
    theta[axis] +=2.0; 
    if (theta[axis] > 360.0) theta[axis] -=360.0; 
    display(); 
} 

/* 
use mouse to choose axis of rotation 
*/ 
void mouse (int btn, int state, int x, int y) 
{ 
    if(btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN)axis=0; 
    if(btn == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN)axis=1; 
    if(btn == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)axis=2; 
} 

/* 
define orthographic projection 
*/ 
void myReshape (int w, int h) 
{ 
    glViewport(0, 0, w, h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    if (w <= h) 
        glOrtho(-2.0,2.0,-2.0 * (GLfloat) h / (GLfloat) w, 
        2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0); 
    else 
        glOrtho(-2.0 * (GLfloat) h / (GLfloat) w, 
        2.0 * (GLfloat) h / (GLfloat) w, -2.0, 2.0, -10.0, 10.0); 

    glMatrixMode(GL_MODELVIEW); 
} 

/* 
main program loop 
*/ 
void main (int argc, char** argv) 
{ 
    glutInit(&argc, argv); 

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowSize(500,500); 
    glutCreateWindow("Use Left-Right-Middel buttons to rotate"); 

    glutReshapeFunc(myReshape); 
    glutDisplayFunc(display); 
    glutIdleFunc(SpinCube); 
    glutMouseFunc(mouse); 
    glEnable(GL_DEPTH_TEST); 

    glutMainLoop(); 

}
#2

هذا فقط من أجل ال OpenGL ..

كم فعلت في تسجيل الفأرة يجب أن تفعل في لوحة المفاتيح .. قم بتسجيلها باستخدام التابع .. glutKeyboardFunc ..

والذي معرف كالتالي :

void glutKeyboardFunc(void (*func)(unsigned char key,
                                   int x, int y));

لاحظ أن التابع الذي سوف تمرره يجب أن يكون على الشكل التالي ..

void mykeyHandler(unsigned char key, int x, int y);

سوف تقوم ال OpenGL باستدعاء التابع السابق عند الضغط على أي زر وسوف تحصل على قيمة هذا الزر بال ASCII ومنه سوف تقوم بتحريك بيانات الرسمة ..

إذا لم يمشي الحال التابع السابق فجرب glutSpecialFunc

Coding on the Cloud and for the Cloud!

My Blog

#3

حسنا أضفت التابع keyboard الذي يتم استدعائه عند الضغط على أي زر في الكيبورد ويتم تحليل نوع الزر المكبوس فيه واظهار عبارة سوف تقوم أنت بتغيرها على حسب ما تريد ...

طبعا استدعيت التابع glutSpecialFunc في ال main حتى أسجل التابع keyboard ..

ملاحظة يمكنك الاستغناء عن الملف windows.h عندما تحذف السطر MessageBox في التابع keyboard

/* 

  cube.cpp 
*/ 
#include 
#include "stdlib.h" 
#include "GL/glut.h" 


/* 
define vertices {x,y,z} and colors {r,g,b} 

*/ 
GLfloat vertices[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0}, 
                        {1.0,1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,1.0}, 
                        {1.0,-1.0,1.0},{1.0,1.0,1.0},{-1.0,1.0,1.0}}; 

GLfloat normals[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0}, 
                        {1.0,1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,1.0}, 
                        {1.0,-1.0,1.0},{1.0,1.0,1.0},{-1.0,1.0,1.0}}; 

GLfloat colors[][3] = {{0.0,0.0,0.0},{1.0,0.0,0.0}, 
                        {1.0,1.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0}, 
                        {1.0,0.0,1.0},{1.0,1.0,1.0},{0.0,1.0,1.0}}; 

/* 

  draw polygon 

*/ 
void polygon (int a, int b, int c, int d) 
{ 
    /* draw a polygon via list of vertices */ 
    glBegin(GL_POLYGON); 
    glColor3fv(colors[a]); 
    glNormal3fv(normals[a]); 
    glVertex3fv(vertices[a]); 

    glColor3fv(colors); 
    glNormal3fv(normals); 
    glVertex3fv(vertices); 

    glColor3fv(colors[c]); 
    glNormal3fv(normals[c]); 
    glVertex3fv(vertices[c]); 

    glColor3fv(colors[d]); 
    glNormal3fv(normals[d]); 
    glVertex3fv(vertices[d]); 
    glEnd(); 

} 

/* 
draw cube 

*/ 
void colorcube(void) 
{ 
    /* draw 6 faces of cube */ 
    polygon(0,3,2,1); 
    polygon(2,3,7,6); 
    polygon(0,4,7,3); 
    polygon(1,2,6,5); 
    polygon(4,5,6,7); 
    polygon(0,1,5,4); 
} 



static GLfloat theta[] = {0.0,0.0,0.0}; 
static GLint axis = 0; 


/* 
rotate angle (theta) and display cube 
*/ 
void display (void) 
{ 
    /* display callback*/ 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 

    glRotatef(theta[0],1.0,0.0,0.0); 
    glRotatef(theta[1],0.0,1.0,0.0); 
    glRotatef(theta[2],0.0,0.0,1.0); 

    /* draw cube */ 
    colorcube(); 

    glFlush(); 
    glutSwapBuffers(); 

} 

/* 
increment angle (theta) 
*/ 
void SpinCube() 
{ 
    theta[axis] +=2.0; 
    if (theta[axis] > 360.0) theta[axis] -=360.0; 
    display(); 
} 

/* 
use mouse to choose axis of rotation 
*/ 
void mouse (int btn, int state, int x, int y) 
{ 
    if(btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN)axis=0; 
    if(btn == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN)axis=1; 
    if(btn == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)axis=2; 
} 

/* 
use keyboard to move the object
*/ 
void keyboard(int key, int x, int y)
{
    switch (key) {
    case 0x64:
            // left arrow
            MessageBox(NULL, "Left", "Message", 0);
        break;
    case 0x65:
            // up arrow
            MessageBox(NULL, "Up", "Message", 0);
        break;
    case 0x66:
            // right arrow
            MessageBox(NULL, "Right", "Message", 0);
        break;
    case 0x67:
            // down arrow
            MessageBox(NULL, "Down", "Message", 0);
        break;
    default:;
    };
}

  /* 
define orthographic projection 
*/ 
void myReshape (int w, int h) 
{ 
    glViewport(0, 0, w, h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    if (w <= h) 
        glOrtho(-2.0,2.0,-2.0 * (GLfloat) h / (GLfloat) w, 
        2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0); 
    else 
        glOrtho(-2.0 * (GLfloat) h / (GLfloat) w, 
        2.0 * (GLfloat) h / (GLfloat) w, -2.0, 2.0, -10.0, 10.0); 

    glMatrixMode(GL_MODELVIEW); 
} 

/* 
main program loop 
*/ 
void main (int argc, char** argv) 
{ 
    glutInit(&argc, argv); 

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowSize(500,500); 
    glutCreateWindow("Use Left-Right-Middel buttons to rotate"); 

    glutReshapeFunc(myReshape); 
    glutDisplayFunc(display); 
    glutIdleFunc(SpinCube); 
    glutMouseFunc(mouse); 
    glutSpecialFunc(keyboard);
    glEnable(GL_DEPTH_TEST); 

    glutMainLoop(); 

}

Coding on the Cloud and for the Cloud!

My Blog

#4

وهذا هو التعديل اللازم من أجل تحريك الصندوق .. ببساطة تم استدعاء glTranslatef من أجل نقل المستوى إلى احداثيات جديدة قبل عملية الدوران ...

/* 

  cube.cpp 
*/ 
#include "stdlib.h" 
#include "GL/glut.h" 


/* 
define vertices {x,y,z} and colors {r,g,b} 

*/ 
GLfloat vertices[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0}, 
                        {1.0,1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,1.0}, 
                        {1.0,-1.0,1.0},{1.0,1.0,1.0},{-1.0,1.0,1.0}}; 

GLfloat normals[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0}, 
                        {1.0,1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,1.0}, 
                        {1.0,-1.0,1.0},{1.0,1.0,1.0},{-1.0,1.0,1.0}}; 

GLfloat colors[][3] = {{0.0,0.0,0.0},{1.0,0.0,0.0}, 
                        {1.0,1.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0}, 
                        {1.0,0.0,1.0},{1.0,1.0,1.0},{0.0,1.0,1.0}}; 

/* 

  draw polygon 

*/ 
void polygon (int a, int b, int c, int d) 
{ 
    /* draw a polygon via list of vertices */ 
    glBegin(GL_POLYGON); 
    glColor3fv(colors[a]); 
    glNormal3fv(normals[a]); 
    glVertex3fv(vertices[a]); 

    glColor3fv(colors); 
    glNormal3fv(normals); 
    glVertex3fv(vertices); 

    glColor3fv(colors[c]); 
    glNormal3fv(normals[c]); 
    glVertex3fv(vertices[c]); 

    glColor3fv(colors[d]); 
    glNormal3fv(normals[d]); 
    glVertex3fv(vertices[d]); 
    glEnd(); 

} 

/* 
draw cube 

*/ 
void colorcube(void) 
{ 
    /* draw 6 faces of cube */ 
    polygon(0,3,2,1); 
    polygon(2,3,7,6); 
    polygon(0,4,7,3); 
    polygon(1,2,6,5); 
    polygon(4,5,6,7); 
    polygon(0,1,5,4); 
} 



static GLfloat theta[] = {0.0,0.0,0.0}; 
static GLint axis = 0; 
static GLfloat x_shift = 0.0;
static GLfloat y_shift = 0.0;


/* 
rotate angle (theta) and display cube 
*/ 
void display (void) 
{ 
    /* display callback*/ 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 

    glTranslatef(x_shift, y_shift, 0);

    glRotatef(theta[0],1.0,0.0,0.0); 
    glRotatef(theta[1],0.0,1.0,0.0); 
    glRotatef(theta[2],0.0,0.0,1.0); 

    /* draw cube */ 
    colorcube(); 

    glFlush(); 
    glutSwapBuffers(); 

} 

/* 
increment angle (theta) 
*/ 
void SpinCube() 
{ 
    theta[axis] +=2.0; 
    if (theta[axis] > 360.0) theta[axis] -=360.0; 
    display(); 
} 

/* 
use mouse to choose axis of rotation 
*/ 
void mouse (int btn, int state, int x, int y) 
{ 
    if(btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN)axis=0; 
    if(btn == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN)axis=1; 
    if(btn == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)axis=2; 
} 

void ShiftVertics(GLfloat x, GLfloat y)
{
    x_shift += x;
    y_shift += y;
}

/* 
use keyboard to move the object
*/ 
void keyboard(int key, int x, int y)
{
    switch (key) {
    case 0x64:
        // left arrow
        ShiftVertics(-0.1, 0.0);
        break;
    case 0x65:
        // up arrow
        ShiftVertics(0.0, 0.1);
        break;
    case 0x66:
        // right arrow
        ShiftVertics(0.1, 0.0);
        break;
    case 0x67:
        // down arrow
        ShiftVertics(0.0, -0.1);
        break;
    default:;
    };
}

  /* 
define orthographic projection 
*/ 
void myReshape (int w, int h) 
{ 
    glViewport(0, 0, w, h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    if (w <= h) 
        glOrtho(-2.0,2.0,-2.0 * (GLfloat) h / (GLfloat) w, 
        2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0); 
    else 
        glOrtho(-2.0 * (GLfloat) h / (GLfloat) w, 
        2.0 * (GLfloat) h / (GLfloat) w, -2.0, 2.0, -10.0, 10.0); 

    glMatrixMode(GL_MODELVIEW); 
} 

/* 
main program loop 
*/ 
void main (int argc, char** argv) 
{ 
    glutInit(&argc, argv); 

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowSize(500,500); 
    glutCreateWindow("Use Left-Right-Middel buttons to rotate"); 

    glutReshapeFunc(myReshape); 
    glutDisplayFunc(display); 
    glutIdleFunc(SpinCube); 
    glutMouseFunc(mouse); 
    glutSpecialFunc(keyboard);
    glEnable(GL_DEPTH_TEST); 

    glutMainLoop(); 

}

Coding on the Cloud and for the Cloud!

My Blog

#5

الأخ هاني وفقه الله

لايوجد للأسف عندي أي كلمة أقولها في حقك ، لقد ساعدتني كثيرا

ولا يسعني إلا أن أدعو لك بالتوفيق وان يجعل مساعدتك لآخوانك في ميزان حسناتك ، انت صنف نادر في هذا الزمن ،

محبك ابوابراهيم99

الولايات المتحدة الآمريكية - الينوي

:o وفقك الله يا هاني وانشاد الله قريبا د.هاني ،،،، آمين

هذا الموضوع مغلق.

مواضيع مشابهة