0

我正在用 openGL 构建一个机器人,它应该可以移动和旋转。当我按下机器人应该向前移动,如果我按下 t 那么他应该围绕它自己的局部轴旋转 15*,然后如果我按下 f 他会再次行走。我已经完成了,机器人行走和旋转,但问题是他没有相对于他的局部轴旋转,他正在跟随 (0,0,0)。我想我不明白必须如何制作平移和旋转的组合才能获得我想要的效果。

我现在正在尝试仅使用缩放球体。我在这里添加显示功能,以便你们更清楚:

void display() 
{ 
    glEnable(GL_DEPTH_TEST);    // need depth test to correctly draw 3D objects 
    glClearColor(0,0,0,1); 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    glShadeModel(GL_SMOOTH);

    //All color and material stuffs go here
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glEnable(GL_NORMALIZE);   // normalize normals 

    glEnable(GL_COLOR_MATERIAL); 
    glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); 

    // set up the parameters for lighting 
    GLfloat light_ambient[] = {0,0,0,1}; 
    GLfloat light_diffuse[] = {.6,.6,.6,1};
    GLfloat light_specular[] = {1,1,1,1}; 
    GLfloat light_pos[] = {10,10,10,1}; 

    glLightfv(GL_LIGHT0,GL_AMBIENT, light_ambient); 
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); 
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); 


    GLfloat mat_specular[] = {.9, .9, .9,1}; 
    GLfloat mat_shine[] = {10}; 
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular); 
    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shine); 
    //color specs ends ////////////////////////////////////////

    //glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); // comment this line to enable polygon shades

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(90, 1, 1, 100); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glLightfv(GL_LIGHT0, GL_POSITION, light_pos); 

    gluLookAt(0,0,30,0,0,0,0,1,0); 

    glRotatef(x_angle, 0, 1,0); // this is just for mouse handling
    glRotatef(y_angle, 1,0,0); // this is just for mouse handling
    glScalef(scale_size, scale_size, scale_size); // for zooming effect

    draw_coordinate();

    //Drawing using VBO starts here
    glTranslatef(walk*sin(M_PI*turn/180),0,walk*cos(M_PI*turn/180));
    glRotatef(turn,0,1,0);
    draw_sphere(3,1,1);

    glDisableClientState(GL_VERTEX_ARRAY); // enable the vertex array on the client side
    glDisableClientState(GL_NORMAL_ARRAY); // enable the normal array on the client side    


    glutSwapBuffers(); 
} 
4

2 回答 2

0

opengl 的 rotate 函数是围绕 (0,0,0) 旋转的函数。您必须将旋转点平移到中心,然后进行旋转。

...
glTranslatef(walk*sin(M_PI*turn/180),0,walk*cos(M_PI*turn/180));
glTranslatef(-x_rot,-y_rot,-z_rot);
glRotatef(turn,0,1,0);
glTranslatef(x_rot,y_rot,z_rot);
...

所以在你的情况下x_rot=walk*sin(M_PI*turn/180)y_rot=0z_rot=walk*cos(M_PI*turn/180)。上面变成:

...
glRotatef(turn,0,1,0);
glTranslatef(x_rot=walk*sin(M_PI*turn/180),0,walk*cos(M_PI*turn/180));
...
于 2012-09-30T20:23:52.267 回答
0

如果您的机器人没有在自己的轴上旋转,则将机器人平移到中心,旋转它并再次将其平移回原始位置。保持你的平移、旋转、缩放和绘图在里面

glPushMatrix();
........your rotation,translation,scalling,drawing goes here..........
glPopMatrix();

这些使场景保持不变。如果您不了解这些功能,请看这里

于 2012-10-01T01:41:25.467 回答