C 在OpenGL中旋转对象自身

C 在OpenGL中旋转对象自身,c,opengl,C,Opengl,我在旋转房间时遇到了麻烦。它的中心位于(5,5,0),所以我想如果我用glTranslatef(5,5,5)转换房间和房间中的对象,然后用glRotatef(rotateroom,0,0,1),然后绘制项目并使用glTranslate(-5,-5,0),它会使房间和房间中的所有东西在5,5,0左右旋转,但它似乎仍在(0,0,0)左右旋转我也不确定我做错了什么。提前谢谢你的帮助 void drawside(){ int i,j; /*for (j = 0; j <= 8; j

我在旋转房间时遇到了麻烦。它的中心位于(5,5,0),所以我想如果我用glTranslatef(5,5,5)转换房间和房间中的对象,然后用glRotatef(rotateroom,0,0,1),然后绘制项目并使用glTranslate(-5,-5,0),它会使房间和房间中的所有东西在5,5,0左右旋转,但它似乎仍在(0,0,0)左右旋转我也不确定我做错了什么。提前谢谢你的帮助

void drawside(){
    int i,j;
    /*for (j = 0; j <= 8; j++) {
       glBegin(GL_LINE_STRIP);
       for (i = 0; i <= 30; i++)
          glEvalCoord2f((GLfloat)i/30.0, (GLfloat)j/8.0);
       glEnd();
       glBegin(GL_LINE_STRIP);
       for (i = 0; i <= 30; i++)
          glEvalCoord2f((GLfloat)j/8.0, (GLfloat)i/30.0);
       glEnd();
    }*/
    glEvalMesh2(GL_FILL, 0, 20, 0, 20);
}
void drawRoom(){
    //floor
    glBegin(GL_POLYGON);
    glColor3f(1,1,1);
    glNormal3f(0,0,0);
    glVertex3f(0,0,0);
    glNormal3f(0,10,0);
    glVertex3f(0,10,0);
    glNormal3f(10,10,0);
    glVertex3f(10,10,0);
    glNormal3f(10,0,0);
    glVertex3f(10,0,0);
    glEnd(
    );
    //wall
    glBegin(GL_POLYGON);
    glColor3f(0,0,1);
    glNormal3f(0,10,0);
    glVertex3f(0,10,0);
    glNormal3f(0,10,10);
    glVertex3f(0,10,10);
    glNormal3f(10,10,10);
    glVertex3f(10,10,10);
    glNormal3f(10,10,0);
    glVertex3f(10,10,0);
    glEnd();
    //wall2
    glBegin(GL_POLYGON);
    glColor3f(0,1,0);
    glNormal3f(10,10,0);
    glVertex3f(10,10,0);
    glNormal3f(10,10,0);
    glVertex3f(10,10,10);
    glNormal3f(10,0,10);
    glVertex3f(10,0,10);
    glNormal3f(10,0,0);
    glVertex3f(10,0,0);
    glEnd();
}
void drawObjects(){
    glColor3f(1,0,1);
    glTranslatef(2,2,0);
    if(conefill == 1)
        glShadeModel(GL_FLAT);
    else
        glShadeModel(GL_SMOOTH);
    glutSolidCone(cone,5,10,2);
    glTranslatef(5,5,0);
    glColor3f(1,0,0);
    if(spherefill == 1)
        glShadeModel(GL_FLAT);
    else 
        glShadeModel(GL_SMOOTH);
    glutSolidSphere(sphere,20,20);

}

void display(){
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(viewx,viewy, viewz,viewx +lx, 5, viewz + ly,0.0f, 0.0f,  1.0f);
    //gluLookAt(viewx,viewy,viewz,headup,headright,5,0,0,1);
    glClear(GL_COLOR_BUFFER_BIT);
    GLfloat light_position[] = {-1.0,5.0,5.0,0.0};
    //GLfloat light_direction[] = {-5,-5,-5};
    //GLfloat amb[] = {0,0,0,1};
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    //glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION,light_direction);
    //glLightfv(GL_LIGHT0, GL_AMBIENT,amb);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    glTranslatef(5,5,0);
    glRotatef(rotateroom,0,0,1);
    glPushMatrix(); 
    drawRoom();
    glPopMatrix();
    glColor3f(0.0, 0.0, 1.0);
    glPushMatrix();
    glTranslatef(6,3,1);
    glPushMatrix ();
    drawside();
    glPopMatrix();
    glPushMatrix();
    //glTranslatef(5,0,0);
    glRotatef(90,1,0,0);
    //glTranslatef(-5,0,0);
    glTranslatef(0,.5,.5);
    drawside();
    glPopMatrix();
    glPushMatrix();
    //glTranslatef(5,0,0);
    glRotatef(180,1,0,0);
    //glTranslatef(-5,0,0);
    glTranslatef(0,1,0);
    drawside();
    glPopMatrix();
    glPushMatrix();
    glRotatef(90,0,0,1);
    glTranslatef(-.5,.5,0);
    drawside();
    glPopMatrix();
    glPushMatrix();
    glRotatef(270,0,0,1);
    glTranslatef(.5,.5,0);
    drawside();
    glPopMatrix();
    glPopMatrix();
    drawObjects();
    glTranslatef(-5,-5,0);
    glPopMatrix();
    glutSwapBuffers();
    glFlush();
}
void drawside(){
int i,j;

/*对于(j=0;j,您只需颠倒指令的顺序:

glRotatef(rotateroom,0,0,1);
glTranslatef(5,5,0);

无论何时变换点,都必须反转要应用的变换顺序。这会影响变换矩阵的乘法。

请编辑代码,使其仅显示相关部分,即房间图纸代码。