0

我正在创建一个简单的纹理立方体,但我的键盘功能有问题我似乎没有交互,我希望立方体在 x 和 y 方向移动但它不移动,我使用了这个功能

void specialKeys( int key, int x, int y ) {
  if (key == GLUT_KEY_RIGHT)
    rotate_y += 5;
  else if (key == GLUT_KEY_LEFT)
    rotate_y -= 5;
  else if (key == GLUT_KEY_UP)
    rotate_x += 5;
  else if (key == GLUT_KEY_DOWN)
    rotate_x -= 5;
  glutPostRedisplay();

}

在我的主要功能中,我使用了这段代码

glutSpecialFunc(specialKeys);

这是我的全部代码

 #include <stdlib.h>
#include <GL/glut.h>
#include "RgbImage.h"

void specialKeys();
double rotate_y=0; 
double rotate_x=0;
GLfloat xRotated, yRotated, zRotated;
GLuint  texture[1];         // Storage For One Texture ( NEW )
void loadTextureFromFile(char *filename)
{   
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel(GL_FLAT);
   glEnable(GL_DEPTH_TEST);
   RgbImage theTexMap( filename );  
    glGenTextures(1, &texture[0]);                  // Create The Texture
        glBindTexture(GL_TEXTURE_2D, texture[0]);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

        // Typical Texture Generation Using Data From The Bitmap

        glTexImage2D(GL_TEXTURE_2D, 0, 3, theTexMap.GetNumCols(), theTexMap.GetNumRows(), 0, GL_RGB, GL_UNSIGNED_BYTE, theTexMap.ImageData() );

}
void drawScene(void)
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture[0]);
   glLoadIdentity();
   glTranslatef(0.0,0.0,-5);
     glRotatef(yRotated, 0, 1, 0);
     glRotatef(zRotated, 0, 0, 1);

  glBegin(GL_QUADS);
        // Front Face

        // Back Face
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
        // Top Face

        // Bottom Face
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
        // Right face
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
        // Left Face
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
    glEnd();

   glFlush();
   glDisable(GL_TEXTURE_2D);

}

void resizeWindow(int x, int y)
{
 if (y == 0 || x == 0) return;
    glMatrixMode(GL_PROJECTION);  
    glLoadIdentity();     
    gluPerspective(40.0,(GLdouble)x/(GLdouble)y,0.5,20.0);
    glMatrixMode(GL_MODELVIEW);
    glViewport(0,0,x,y);
}

void specialKeys( int key, int x, int y ) {
  if (key == GLUT_KEY_RIGHT)
    rotate_y += 5;
  else if (key == GLUT_KEY_LEFT)
    rotate_y -= 5;
  else if (key == GLUT_KEY_UP)
    rotate_x += 5;
  else if (key == GLUT_KEY_DOWN)
    rotate_x -= 5;
  glutPostRedisplay();

}
char* filename = "./salt_on_spoon.bmp";

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
   glutInitWindowSize(240, 240);
   glutInitWindowPosition(100, 100);
   glutCreateWindow(argv[0]);
   loadTextureFromFile( filename );
   glutDisplayFunc(drawScene);
   glutSpecialFunc(specialKeys);
   glutReshapeFunc(resizeWindow);
   glutMainLoop();
   return 0;
}
4

2 回答 2

3

您的回调正在修改rotate_xand rotate_y,但您使用不同的变量进行旋转:

glRotatef(yRotated, 0, 1, 0);
glRotatef(zRotated, 0, 0, 1);
于 2013-05-08T21:11:21.850 回答
1

尝试这个:

#include <GL/glut.h>

GLfloat pos_x = 0, pos_y = 0;
void specialKeys( int key, int x, int y ) 
{
    const float step = 0.01;
    if (key == GLUT_KEY_RIGHT)
        pos_x += step;
    else if (key == GLUT_KEY_LEFT)
        pos_x -= step;
    else if (key == GLUT_KEY_UP)
        pos_y += step;
    else if (key == GLUT_KEY_DOWN)
        pos_y -= step;
    glutPostRedisplay();
}

void drawScene(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);  
    glLoadIdentity();    
    double x = glutGet( GLUT_WINDOW_WIDTH );
    double y = glutGet( GLUT_WINDOW_HEIGHT );
    gluPerspective(40.0,x/y,0.5,20.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0,0.0,-5);

    glTranslatef( pos_x, pos_y, 0 );
    glBegin(GL_QUADS);
    // Front Face

    // Back Face
    glColor3ub(255,0,0);
    glVertex3f(-1.0f, -1.0f, -1.0f);
    glVertex3f(-1.0f,  1.0f, -1.0f);
    glVertex3f( 1.0f,  1.0f, -1.0f);
    glVertex3f( 1.0f, -1.0f, -1.0f);
    // Top Face

    // Bottom Face
    glColor3ub(0,255,0);
    glVertex3f(-1.0f, -1.0f, -1.0f);
    glVertex3f( 1.0f, -1.0f, -1.0f);
    glVertex3f( 1.0f, -1.0f,  1.0f);
    glVertex3f(-1.0f, -1.0f,  1.0f);
    // Right face
    glColor3ub(0,0,255);
    glVertex3f( 1.0f, -1.0f, -1.0f);
    glVertex3f( 1.0f,  1.0f, -1.0f);
    glVertex3f( 1.0f,  1.0f,  1.0f);
    glVertex3f( 1.0f, -1.0f,  1.0f);
    // Left Face
    glColor3ub(255,255,255);
    glVertex3f(-1.0f, -1.0f, -1.0f);
    glVertex3f(-1.0f, -1.0f,  1.0f);
    glVertex3f(-1.0f,  1.0f,  1.0f);
    glVertex3f(-1.0f,  1.0f, -1.0f);
    glEnd();

    glFlush();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(240, 240);
    glutInitWindowPosition(100, 100);
    glutCreateWindow(argv[0]);
    glutDisplayFunc(drawScene);
    glutSpecialFunc(specialKeys);
    glutMainLoop();
    return 0;
}
于 2013-05-08T21:11:50.293 回答