在GLUT中随机翻译变得很糟糕

randoming translation in GLUT turns bad

本文关键字:翻译 GLUT 随机      更新时间:2023-10-16

这是我的立方体。一旦创建,它在-2、-1、0、1或2上有一个随机的x位置。

void cube(void)
{
    srand (time(0));
    int cube_posX;
    int lowv = -2;
    int highv = 2;
    cube_posX = rand() % (highv - lowv + 1) + lowv;
    glTranslatef(cube_posX, 0.0, cube_angle);
    glRotatef(cube_angle, 90.0, 0.0, 1.0);
    glutSolidCube(0.25);
}

这就是我移动立方体的方式

void MOVE_CUBE(int value)
{
    cube_posZ = cube_posZ - 0.01;
    glutPostRedisplay();
    glutTimerFunc(25, MOVE_CUBE, 0);
}

最后放到display:

void init(void)
{
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
}
float cam_eyeX = 0.0, cam_eyeY = 1.5, cam_eyeZ = 5.0;
float cam_centerX = 0.0, cam_centerY = 0.0, cam_centerZ = 0.0;
void display(void)
{
    glClearColor(1.0,1.0,1.0,1.0);      //to add background color (white)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    gluLookAt(cam_eyeX, cam_eyeY, cam_eyeZ, cam_centerX, cam_centerY, cam_centerZ, 0.0, 1.0, 0.0);  //camera! (cam position X, cam position Y, cam position Z, cam target X, cam target Y, cam target Z,  up position X, up position Y, up position Z)
    cube();
    glutSwapBuffers();
    angle += 0.05; //to affect the glRotate function
    glFlush();
}
void reshape(int w, int h)
{
    glViewport (0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity ();
    gluPerspective (60, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
    glMatrixMode (GL_MODELVIEW);
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);      // Set up display buffer 
    glutInitWindowSize(750, 500);       //window's size
    glutInitWindowPosition(100, 100);   //window's position
    glutCreateWindow("Hendra Ganteng!");  //window's title
    init();
    glutDisplayFunc(display);
    glutIdleFunc (display);
    glutReshapeFunc(reshape);
    glutKeyboardFunc(keyboard_Handler);
    MOVE_CUBE(0);
    glutMainLoop();
    return 0;
}

但是当我看到它的动作时,立方体完美地向前移动,但每0.5到1秒就会不断改变x的位置,以满足这5种可能性(-2,-1,0,1,2)。如果禁用srand(time(0)),立方体将迅速改变其x位置。我只是想让它保持在1x的位置上这样我就可以在不同的x位置调用更多的立方体。有人能请你在我的代码有什么问题吗?

为什么这种行为不被期望?每次显示立方体时都会生成一个随机的X位置。如果您使用时间重新播种随机数生成器,那么每当时间改变时(每秒一次),它将启动一个不同的序列。

相反,您应该预先生成多维数据集。这个怎么样:

// Global cube data
struct Cube {
    int x;
    double angle;
};
vector<Cube> cubes;
const int num_cubes = 1;
// Example initialisation...
void InitCubes()
{
    cubes.reserve(num_cubes);
    for( int i = 0; i < num_cubes; i++ )
    {
        Cube cube;
        cube.x = rand() % (highv - lowv + 1) + lowv;
        cube.angle = 0.0;
        cubes.push_back(cube);
    }
}

现在更新/显示周期只需要修改角度,而不是x位置。

void UpdateCube( Cube & cube )
{
    cube.angle += 0.05;
}
void DisplayCube( Cube & cube )
{
    glTranslatef((double)cube.x, 0.0, cube.angle);
    glRotatef(cube.angle, 90.0, 0.0, 1.0);
    glutSolidCube(0.25);
}

main函数中,在启动时调用InitCubes()

在你的display函数中,这样做:
void display(void)
{
    glClearColor(1.0,1.0,1.0,1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    gluLookAt(cam_eyeX, cam_eyeY, cam_eyeZ, cam_centerX, cam_centerY, cam_centerZ, 0.0, 1.0, 0.0);    
    // Display cubes        
    for( int i = 0; i < cubes.size(); i++ ) DisplayCube( cubes[i] );
    glutSwapBuffers();
    glFlush();
    // Update cubes for next render cycle.
    for( int i = 0; i < cubes.size(); i++ ) UpdateCube( cubes[i] );
}