我正在使用 rand() 函数将我的立方体放置在屏幕上的不同位置。原因是我必须在屏幕上有随机数量的立方体,我不希望它们都从同一个位置开始。发生的事情是当我运行程序时,立方体会在整个屏幕上跳跃,因为我需要在其中旋转立方体。我的问题是,例如,我怎么能在屏幕上的 7 个不同位置开始旋转的 7 个立方体?我最终需要他们从屏幕上沿 z 轴的起点移动,然后重新开始整个过程?
这是我的代码:
/* -- GLOBAL VARIABLES --------------------------------------------------------------------------    --------------- */
GLint screenWidth = 500;
GLint screenHeight = 500;
GLfloat cubeX = 0.0;
GLfloat cubeY = 5.0;
GLfloat cubeZ = -20.0;
GLfloat rotateY = 0.0;
//GLfloat rotCube = 0.0;
GLint cubeCount = 0;
//const GLint CUBE_LOW = 7;
//const GLint CUBE_HIGH = 15;
const GLint CUBE_HIGH = 15;
const GLint CUBE_LOW = 7;
const GLfloat X_HIGH = 10.0;
const GLfloat X_LOW = -10.0;
const GLfloat Y_HIGH = 10.0;
const GLfloat Y_LOW = -10.0;
/* -- NAMESPACE ---------------------------------------------------------------------------------    --------------- */
using namespace std;
/* ----------------------------------------------------------------------------------------------    -------------- */
/*
Function:   unsigned time_seed()
*/
unsigned time_seed()
{
    time_t now = time (0);
    unsigned char *p = (unsigned char *)&now;
    unsigned seed = 0;
    size_t i;
    for(i = 0; i < sizeof now; i++)
        seed  = seed * (UCHAR_MAX + 2U) + p[i];
    return seed;
}
/* ----------------------------------------------------------------------------------------------    --------------- */
/*
Function:   void rotateCube()
*/
 void rotateCube()
{
    rotateY += 0.050f;
    if(rotateY > 360.0f)
        rotateY -= 360.0f;
    glutPostRedisplay();
}
/* ----------------------------------------------------------------------------------------------    --------------- */
/*
Function:   void myDisplay()
*/
void myDisplay()
{
cubeCount = CUBE_LOW + rand() / RAND_MAX * (CUBE_HIGH - CUBE_LOW);
float cubeX = X_LOW + (float)rand() / (float)RAND_MAX * (X_HIGH - X_LOW);
float cubeY = Y_LOW + (float)rand() / (float)RAND_MAX * (Y_HIGH - Y_LOW);
for(int i = 0; i < cubeCount; i++)
{
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(cubeX, cubeY, cubeZ);
    glRotatef(rotateY, 0.0f, 1.0f, 0.0f);
    glutWireCube(2.0f);
    glutSwapBuffers();
    glFlush();
}
}
/* ----------------------------------------------------------------------------------------------    --------------- */
/*
Function:   int main( int argc, char **argv )
*/
void myReshape(int width, int height)
{
    glViewport(0, 0, (GLsizei)width, (GLsizei)height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60, (GLfloat)width / (GLfloat)height, 1.0, 100);
    glMatrixMode(GL_MODELVIEW);
}
/* ----------------------------------------------------------------------------------------------    --------------- */
/*
Function:   int main( int argc, char **argv )
*/
int main( int argc, char **argv )
{
    srand(time_seed());
    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
    glutInitWindowSize(screenWidth, screenHeight);
    glutInitWindowPosition(100, 40);
    glutCreateWindow("Boxes!");
    glutDisplayFunc(myDisplay);
    glutIdleFunc(rotateCube);
    glutReshapeFunc(myReshape);
    glutMainLoop();
   return 0;
}