السلام عليكم
مطلوب عند الضغط على رز الماوس الأيمن او اليسر ان يتغير اللون ,, وهذا يشتغل في الكود فعليا
ولكن اللي موراضي يشتغل .. اني عملت انو المفروض الأوبحكت يتحرك إلى اليمين او اليسار او الأعلى او الأسفل عند ضغط المستخدم على احد هذه المفاتيح الموجودة على الكيبورد
الشي الآخر هو عندما يضغط المستخدم على حرف r : يدور الأوبجكت على اليمين
وعندما يضغط L : يدور الاوبحكت نحو اليسار
وعند i : يعمل زووم تكبير على الأوبجكت ,, O : يعمل تصغير للاوبجكت
انا عملت هادا الشي ولكن موعارفة ايش المشكلة ليش موراضي
.gif)
#include <stdio.h>
#include <windows.h>
#include <GL/gl.h>
#include <GL/glut.h>
#define KEY_ESCAPE 27
typedef struct {
int width;
int height;
char* title;
float field_of_view_angle;
float z_near;
float z_far;
} glutWindow;
glutWindow win;
float Rotation;
float angle = 0.1f;
bool colorchange = false;
void display(bool bo)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(10, 3, 0, 0, 0, 0, 0, 1, 0);
glColor3f(0.1, 0.3, 0.8);
if (bo == true)
{
glColor3ub(247, 179, 184);
}
//BLUE
glPushMatrix();
glTranslatef(0, 2.2, 0);
glRotatef(Rotation, 2, 20, 10);
glRotatef(90, 0, 1, 0);
glScalef(0.5f, 2.0f, 0.6f);
// Draw the teapot
glutSolidTeapot(1);
glPopMatrix();
glColor3ub(229, 171, 127);
if (bo == true)
{
glColor3ub(161, 85, 109);
}
//moof 6afi
glPushMatrix();
glTranslatef(0, 0, -2);
glRotatef(Rotation, 0, 1, 0);
glRotatef(90, 0, 1, 0);
glutWireTeapot(1);
glPopMatrix();
glColor3f(0, 1, 0);
if (bo == true)
{
glColor3ub(241, 128, 43);
}
//GREEN
glPushMatrix();
glTranslatef(0, 0, 2);
glRotatef(Rotation, 2, 20, 5);
glRotatef(90, 0, 1, 0);
glutSolidTeapot(1);
glPopMatrix();
glColor3f(1.0, 0.25, 0.25);
if (bo == true)
{
glColor3ub(187, 19, 55);
}
//PInKY
glPushMatrix();
glTranslatef(-0.9, -2, 0);
glRotatef(Rotation, 2, 5, 20);
glRotatef(90, 0, 1, 0);
glScalef(0.5f, 2.0f, 0.6f);
// Draw the teapot
glutSolidTeapot(1);
glPopMatrix();
Rotation++;
glutSwapBuffers();
}
void Keyboard_keys(unsigned char keyboard, int mouseX, int mouseY)
{
switch (keyboard){
case 'r':
glRotatef(360.0, 0.0, 0.0, 0.0); break;//to rotate right
case 'l':
glRotatef(180.0, 0.0, 10.0, 0.0); break;//to rotate left
case 'i':
glScalef(4.0f, 4.0f, 4.0f); break;//to increase
case 'o':
glScalef(0.4f, 0.4f, 0.4f); break;//to decrease
}
glutPostRedisplay();
}
void renderScene(void)
{
display(colorchange);
}
void processSpecialKeys(int key, int xx, int yy)
{
float fraction = 0.08f;// step of movement
switch (key) {
case GLUT_KEY_LEFT:
xx -= fraction; // move along x axes
break;
case GLUT_KEY_RIGHT:
angle += 0.01f;
xx += fraction;
break;
case GLUT_KEY_UP:
yy += fraction;// move along y axes
break;
case GLUT_KEY_DOWN:
yy -= fraction;
break;
}
}
void processMouse(int button, int state, int x, int y) {
if (state == GLUT_DOWN)
{
if (button == GLUT_LEFT_BUTTON) {
colorchange = true;
}
else if (button == GLUT_RIGHT_BUTTON) {
colorchange = false;
}
}
}
void initialize()
{
glClearColor(0.74, 0.88, 0.91, 0.0);
glMatrixMode(GL_PROJECTION);
glViewport(0, 0, win.width, win.height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat aspect = (GLfloat)win.width / win.height;
gluPerspective(win.field_of_view_angle, aspect, win.z_near, win.z_far);
glMatrixMode(GL_MODELVIEW);
glShadeModel(GL_SMOOTH);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
GLfloat amb_light[] = { 0.1, 0.1, 0.1, 1.0 };
GLfloat diffuse[] = { 0.6, 0.6, 0.6, 1 };
GLfloat specular[] = { 0.7, 0.7, 0.3, 1 };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, amb_light);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glShadeModel(GL_SMOOTH);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}
void keyboard(unsigned char key, int mousePositionX, int mousePositionY)
{
switch (key)
{
case KEY_ESCAPE:
exit(0);
break;
default:
break;
}
}
int main(int argc, char **argv)
{
win.width = 640;
win.height = 480;
win.title = "OpenGL user interaction ";
win.field_of_view_angle = 45;
win.z_near = 1.0f;
win.z_far = 500.0f;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(win.width, win.height);
glutCreateWindow(win.title);
glutDisplayFunc(renderScene);
glutIdleFunc(renderScene);
glutMouseFunc(processMouse);
glutSpecialFunc(processSpecialKeys);
glutKeyboardFunc(keyboard);
initialize();
glutMainLoop();
return 1;
}وشكككرااا