Нарисуйте кубы случайными цветами, используя OpenGL - PullRequest
0 голосов
/ 28 сентября 2018

Я хочу, чтобы у каждого куба был случайный цвет, но с помощью этого кода цвета постоянно меняются

int espacioX = -500;
int espacioY = -500;
for(int i=1; i<=100; i++){
    for(int j=1; j<=100; j++){
        randomR = (double)rand() / (RAND_MAX);
        randomG = (double)rand() / (RAND_MAX);
        randomB = (double)rand() / (RAND_MAX);
        glColor3f(randomR,randomG,randomB);
        glTranslatef(espacioX,espacioY,0);
        glutSolidCube(9);
        glTranslatef(-espacioX,-espacioY,0);
        espacioX+=10;
    }
    glTranslatef(-1000,0,0);
    espacioY+=10;
}

Как мне заставить их оставаться в одном цвете во время работы программы?

Редактировать: Это полный код:

#include <windows.h>

/***** OpenGL library imports. *****/
#include<gl\glut.h>                                 //basic header file for OpenGL 
//#include <gl\glaux.h>                             // Header File For The Glaux Library
/***** C library imports. *****/ 
#include <stdlib.h>
#include <stdio.h>
#include <math.h>



int ScreenWidth  = 0;
int ScreenHeight = 0; 
int last_x = 0, last_y = 0,left = 1,middle = 0,right = 0;
int zoom_y = 0;
int anglex=0, angley=0, anglez=0;
int lookfrom=450;
int ang=0;


void myGlutKeyboard(unsigned char Key, int x, int y)
{
    printf("%5d\n",Key);
    glutPostRedisplay();
}


void init_GL_params()
{
    static GLfloat light_ambient[] = { .250, .250, .250, .250 };
    static GLfloat light_diffuse[] = { .250, .250, .25, .250 };
    static GLfloat light_specular[] = { .250, .250, .250, .250 };

    static GLfloat light1_diffuse[] = { .250, .250, .250, .0 };
    static GLfloat light1_specular[] = { .250, .250, .250, .0 };

    glEnable (GL_LIGHTING);
    glEnable (GL_LIGHT0);
    glEnable (GL_LIGHT1);
    glDisable (GL_TEXTURE_2D);
    glDisable (GL_TEXTURE_GEN_S);
    glDisable (GL_TEXTURE_GEN_T);
    glShadeModel (GL_FLAT);
    glEnable (GL_DEPTH_TEST);
    glDepthFunc (GL_LESS);
    glEnable (GL_CULL_FACE);
    glCullFace (GL_BACK);
    glFrontFace (GL_CCW);

    glMatrixMode (GL_PROJECTION);
    glLoadIdentity();

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

    glLightfv(GL_LIGHT1, GL_DIFFUSE,  light1_diffuse); 
    glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular);
    glLightfv (GL_LIGHT1, GL_AMBIENT, light_ambient);

    glColor3f (1.0, 1.0, 1.0);

}

void setLightPosition()
{
    static GLfloat light_position[] = { 100, 200.0, 10, 1.0 };
    static GLfloat light1_position[] = { -0.0, 300.0, 0.0, 1.0 };

    // set the light position (for some reason we have to do this in model view.
    glLightfv (GL_LIGHT0, GL_POSITION, light_position);
    glLightfv(GL_LIGHT1, GL_POSITION, light1_position);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glEnable(GL_COLOR_MATERIAL); 
}

void myGlutDisplay(void)
{
    init_GL_params();

      // clear the window
    glClearColor (0,0,0,0); //Color de fondo R G B
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity();
    setLightPosition();     //Posici{on de la fuente de luz
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective(60.0f, 1.0, 1.0f, 10000.0f);
    gluLookAt(                          //punto de vista
            0 ,100 ,lookfrom ,          // desde donde veo xyz
            0, 0, 0,                    // hacia donde veo xyz
            0,1,0 ); 
    glRotatef(anglex, 1.0, 0.0, 0.0);
    glRotatef(angley, 0.0, 1.0, 0.0);
    glRotatef(anglez, 0.0, 0.0, 1.0);

    //Empieza a dibujar
    int espacioX = 500;
    int espacioY = 500;
    double randomR, randomG, randomB;

    for(int i=1; i<=100; i++){
        for(int j=1; j<=100; j++){
            randomR = (double)rand() / (RAND_MAX);
            randomG = (double)rand() / (RAND_MAX);
            randomB = (double)rand() / (RAND_MAX);
            glColor3f(randomR,randomG,randomB);
            glTranslatef(espacioX,espacioY,0);
            glutSolidCube(9);
            glTranslatef(-espacioX,-espacioY,0);
            espacioX-=10;
        }
        glTranslatef(1000,0,0);       
        espacioY-=10;
    }

    glFlush();                                          // Flush The GL Pipeline
    glutSwapBuffers();  
}

void myGlutReshape2(int mWidth, int mHeight)
{
    ScreenWidth  = mWidth;
    ScreenHeight = mHeight;
    glViewport(0, 0, (GLsizei) ScreenWidth, (GLsizei) ScreenHeight);
    glutPostRedisplay();
}


/****************************************************************/
void myGlutIdle(void)
{
    glutPostRedisplay();
}

/***************************************************************/

void myGlutMouse(int button, int button_state, int x, int y){
  if ( (button == GLUT_LEFT_BUTTON) && (button_state == GLUT_DOWN) ) 
  {
    last_x = x;
    last_y = y;
    left = 1;
    middle = 0;
    right = 0;
  }
  else if ((button == GLUT_RIGHT_BUTTON) && (button_state == GLUT_DOWN) ) 
  {
      zoom_y = y;
      right = 1;
      left = 0;
      middle = 0;
  }
}

void myGlutMotion(int x, int y){
        if (left){
            anglex+= (float) (y - last_y);
            angley+= (float) (x - last_x);

            last_x = x;
            last_y = y;
        }
        if (right)
        {
            lookfrom += (y - zoom_y);
            zoom_y = y;
        }
}

void GlutInit(int argc, char** argv)
{
    ScreenWidth  = 700;
    ScreenHeight = 700;
    /****************************************/
    /*   Initialize GLUT and create window  */
    /****************************************/
    glutInit(&argc, argv);

    glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_STENCIL );   //set up the display as a double buffer using RGB values
    glutInitWindowPosition(90, 50);                 //set the position of where you want the window to open
    glutInitWindowSize(ScreenWidth, ScreenHeight);  //set how big you want the initial window to be
    glutCreateWindow("Testing Virtual Environment" );   //what do you want the window to be called (titlebar text)

    //register callbacks
    glutDisplayFunc(myGlutDisplay);         //Register the display callback
    glutReshapeFunc(myGlutReshape2);        // -- Resize handler
    glutKeyboardFunc(myGlutKeyboard);       // -- Keyboard handler
    glutMouseFunc(myGlutMouse);             // -- Mouse Click handler
    glutMotionFunc(myGlutMotion);           // -- Mous motion handler
    glutIdleFunc(myGlutIdle);               // -- Idle handler

  glFlush();
}


int main( int argc, char **argv )
{
    GlutInit(argc, argv);
    glutMainLoop();
    return 0;
}

Это был пример кода, поэтому я только что опубликовал часть, которую я отредактировал, извините.Когда я делал куб или сферу определенного цвета, она всегда оставалась неизменной, поэтому я не осознавал, что это постоянно обновляет изображение.Я не совсем понимаю все это, поэтому не знаю, где обновляется изображение.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Почему бы не установить SEED на какое-то постоянное значение в начале myGlutDisplay(void).Это даст вам одинаковые случайные значения в каждом кадре без каких-либо больших изменений в вашем коде, например, так:

void myGlutDisplay(void)
{
    init_GL_params();

      // clear the window
    glClearColor (0,0,0,0); //Color de fondo R G B
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity();
    setLightPosition();     //Posici{on de la fuente de luz
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective(60.0f, 1.0, 1.0f, 10000.0f);
    gluLookAt(                          //punto de vista
            0 ,100 ,lookfrom ,          // desde donde veo xyz
            0, 0, 0,                    // hacia donde veo xyz
            0,1,0 ); 
    glRotatef(anglex, 1.0, 0.0, 0.0);
    glRotatef(angley, 0.0, 1.0, 0.0);
    glRotatef(anglez, 0.0, 0.0, 1.0);

    //Empieza a dibujar
    int espacioX = 500;
    int espacioY = 500;
    double randomR, randomG, randomB;

    srand(0x98765432); // this is the SEED

    for(int i=1; i<=100; i++){
        for(int j=1; j<=100; j++){
            randomR = (double)rand() / (RAND_MAX);
            randomG = (double)rand() / (RAND_MAX);
            randomB = (double)rand() / (RAND_MAX);
            glColor3f(randomR,randomG,randomB);
            glTranslatef(espacioX,espacioY,0);
            glutSolidCube(9);
            glTranslatef(-espacioX,-espacioY,0);
            espacioX-=10;
        }
        glTranslatef(1000,0,0);       
        espacioY-=10;
    }

    glFlush();                                          // Flush The GL Pipeline
    glutSwapBuffers();  
}

Значение SEED даст вам шаблон.Таким образом, изменение константы изменит цвета.Осторожно, неправильная константа (например, 0) может испортить случайность функции rand().

0 голосов
/ 28 сентября 2018

Кажется, что вы запускаете этот код в другом цикле, что означает, что вы вычисляете свои случайные переменные каждый раз, когда сцена перерисовывается, это может привести к изменению цветов, и очевидным решением будет разукрасить список кубов один раз изатем итерируйте список, рисуя кубы на каждой сцене обновления.

Однако, не видя остальной части вашего кода, это неясно.Пожалуйста, включите больше информации, чтобы мы могли дать вам лучший ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...