0

rand() 関数を使用して、キューブを画面上のさまざまな場所に配置しています。その理由は、画面上にランダムな量のキューブを配置する必要があり、それらすべてを同じ場所から開始したくないからです。キューブの回転に必要な glutPostRedisplay() のために、プログラムを実行すると、キューブが画面全体にジャンプします。私の質問は、たとえば、すべてが回転しているときに、画面上の 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;
}
4

2 に答える 2

2

ループの前にcubeXとcubeYを設定したため、キューブは同じ座標を使用しているようです。すべてのキューブを反復する for ループ内に座標を設定して、すべてのキューブが異なるキューブを持つようにすることができます。さらに、7 つの異なる位置で 1 つの立方体を描画したいだけでない限り、おそらくループ内で glClear() を実行しないでください (外部で実行してください)。glClear() は画面全体をクリアします。

于 2013-10-12T02:37:48.190 に答える
1

qternion が言ったことに加えて、次のコードを試してみてください。ユーザー定義型 vec3 を追加しました。キューブの数をハードコーディングし、プログラムの開始時にすべてのキューブを配置する単一の呼び出しを追加しました。

#include <GL/glut.h>
#include <stdlib.h>
#include <time.h>


/* -- 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;

const int maxCubes = 50;

typedef struct vec3
{
    double x, y, z;
};

vec3 cubeOrigins[maxCubes];

/* -- NAMESPACE ---------------------------------------------------------------------------------    --------------- */

using namespace std;


void initOrigins()
{
    int i;
    for (i=0; i<maxCubes; i++)
    {
        cubeOrigins[i].x = X_LOW + (float)rand() / (float)RAND_MAX * (X_HIGH - X_LOW);
        cubeOrigins[i].y = Y_LOW + (float)rand() / (float)RAND_MAX * (Y_HIGH - Y_LOW);
    }
}

/* ----------------------------------------------------------------------------------------------    -------------- */
/*
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 * (255 + 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()
{
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    for(int i = 0; i < maxCubes; i++)
    {
        glLoadIdentity();

        glTranslatef(cubeOrigins[i].x, cubeOrigins[i].y, 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());
    initOrigins();

    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;
}
于 2013-10-12T03:11:33.540 に答える