новичок в OpenGL: glutMouseFunc

m пытается изменить положение сферы после щелчка мышью, но это не работает при использовании x и y из glutMouseFunc ,, вот код:

//

   #include "stdafx.h"
    #include 
    #include 


    bool Cone=false , ConeSelected=false,
    Cube=false, CubeSelected=false,
    Sphere=false, SphereSelected=false,
    Teapot=false, TeapotSelected =false,
    Torus=false, TorusSelected=false;
    static float XSphere=0, YSphere=-1.5 ,ZSphere=0;

    void init(void) 
    {
    GLfloat blankMaterial[] = {1.0, 0.0, 0.0};
    GLfloat whiteDiffuseLight[] = {30}; 
    glClearColor (0.0, 0.1, 0.2, 0.0);
    glClearDepth(1.0);
    glShadeModel (GL_FLAT);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, blankMaterial);
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, blankMaterial);
    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS,  whiteDiffuseLight);
     }


    void display(void)
    {
      glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
      glEnable(GL_DEPTH_TEST);

      //Drawing Cube
       if(Cube)
        {
        glPushMatrix();
        glColor3f(0, 1, 0);
        glTranslatef(-3,0,-3);
        glRotatef(20, 1,0,0);
        glutSolidCube(2);
        glPopMatrix() ;
        }

      //drawing cone
       if(Cone)
      {
        glPushMatrix();
        glColor3f (1.0, 0.0, 1.0);
        glTranslatef(0,2,0);
        glRotatef(50, 1,0,0);
        glutSolidCone(.5,1,10,10);
        glPopMatrix() ;
       }

      //Drawing Solid Sphere
      if(Sphere)
      { 
       glPushMatrix();
       glTranslatef(XSphere,YSphere,ZSphere);
       glutSolidSphere(.5, 20, 20);
       glPopMatrix();
       glDisable(GL_DEPTH_TEST);
   }
   glColor3f (1.0f, 1.0f, 1.0f);

   //drawing Torus
   if(Torus)
   {
        glPushMatrix();
        glColor3f (1.0, 1.0, 1.0);
        glTranslatef(2,2,0);
        glRotatef(60, 1,0,0);
        glutSolidTorus(.2,.5,40,30);
        glPopMatrix() ;
   }

   //Drawing teapot
   if(Teapot)
   {
       glPushMatrix ();
       glTranslatef (2.0, 0.0, 0.0);
       glutSolidTeapot(.5);
       glPopMatrix ();
   }


glFlush();
glutSwapBuffers();



}

void reshape (int w, int h)
{
   glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);

   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}

void keyboard (unsigned char key, int x, int y)
{int modifiers = glutGetModifiers();

   switch (key) {
       case 'A':
               Teapot=Cone=Sphere=Cube=Torus=true;
               glutPostRedisplay();
               break;
        case 'D':
               Teapot=Cone=Sphere=Cube=Torus=false;
               glutPostRedisplay();
               break;
        case 'S':
                Teapot=Cone=Cube=Torus=false;
                Sphere=true;
                TeapotSelected=ConeSelected=CubeSelected=TorusSelected=false;
                SphereSelected=true;

               break;       
      case 27:
         exit(0);
         break;
      default:
         break;
   }
}

Здесь, в разделе мыши, я попытался установить gltranslation в вышеупомянутой области рисования, но когда я проверил результаты для x и y, они были большими, и это 'Почему после щелчка мышью я не вижу сферу, как я могу это исправить ??

void MyMouse(int button, int state, int x, int y)
{

switch (button)
{
    case GLUT_LEFT_BUTTON:

        if(state == GLUT_UP)
        {
            if (SphereSelected)
            {
                Cone=Cube=Torus=Teapot=false;
                Sphere=true;
                XSphere=x;
                YSphere=y;
                ZSphere=1;
                glutPostRedisplay();
            }

        }
    break;
    }
}

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB|GLUT_DEPTH);
   glutInitWindowSize (900, 900); 
   glutInitWindowPosition (0, 100);
   glutCreateWindow ("Scene Modeling and Interaction");
   init (); 
   glutDisplayFunc(display); 
   glutReshapeFunc(reshape);
   glutKeyboardFunc(keyboard);
   glutMouseFunc(MyMouse);
   glutMainLoop();
   return 0;
}
 Aseel8408 нояб. 2012 г., 22:33
извини но я не понял
 Felix K.08 нояб. 2012 г., 21:08
Дон»использовать фиксированный конвейер функций!

Ответы на вопрос(1)

x а такжеy что функция мыши дает вам координаты пикселей экрана, а не координаты, которые использует ваша сцена. Чтобы сделать это, вы должны центрировать свои координаты (вычитая половину размера экрана) и масштабируя их примерно до размера вашего экрана (путем деления их на что-то порядка вашего размера экрана).

Таким образом, вы, вероятно, хотите сделать что-то вроде

XSphere = (x - 450) * 3.0 / 900;
YSphere = (450 - y) * 3.0 / 900;

и поиграйтесь с 3.0, пока он не даст вам чего-то разумного.

 Aseel8409 нояб. 2012 г., 12:19
СПАСИБО ОГРОМНОЕ !

Ваш ответ на вопрос