3

I am trying to draw some random points as the star in the window, but points are not showing. But others objects are showing correctly.

My source code:

#include<windows.h>
#include <GL\glut.h>
#include <math.h>      // For math routines (such as sqrt & trig).
GLfloat xRotated, yRotated, zRotated;
GLdouble  radius=3;

GLfloat qaBlack[] = {0.0, 0.0, 0.0, 1.0}; //Black Color
GLfloat qaGreen[] = {0.0, 1.0, 0.0, 1.0}; //Green Color
GLfloat qaWhite[] = {1.0, 1.0, 1.0, 1.0}; //White Color
GLfloat qaRed[] = {1.0, 0.0, 0.0, 1.0}; //Red Color

// Set lighting intensity and color

GLfloat qaSpecularLight[]    = {1.0, 1.0, 1.0, 1.0};
GLfloat emitLight[] = {0.9, 0.9, 0.9, 0.9};
GLfloat Noemit[] = {0.0, 0.0, 0.0, 1.0};

// Light source position

GLfloat qaLightPosition[] = {1, 1, 1, 1};

void display(void);
void reshape(int x, int y);

void idleFunc(void)
{
    if ( zRotated > 360.0 ) {
        zRotated -= 360.0*floor(zRotated/360.0);   // Don't allow overflow
      }

    if ( yRotated > 360.0 ) {
        yRotated -= 360.0*floor(yRotated/360.0);   // Don't allow overflow
      }
    zRotated += 0.05;
    yRotated +=0.01;

    display();
}

void initLighting()
{

    // Enable lighting
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

    glLightfv(GL_LIGHT0, GL_SPECULAR, qaSpecularLight);

}




void display(void){






    glMatrixMode(GL_MODELVIEW);
    // clear the drawing buffer.
     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    // clear the identity matrix.
    glLoadIdentity();



    glTranslatef(0.0,0.0,-40.0);

    glPushMatrix();

    glutSolidSphere(radius,25,25);

    glPopMatrix();



    glPopMatrix();


    glPushMatrix();

    glRotatef(yRotated,0.0,2.0,0.0);
    glTranslatef(5.0,0.0,0.0);

    // Set the light position
    glLightfv(GL_LIGHT0, GL_POSITION, qaLightPosition);
    glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, emitLight);   // Make sphere glow (emissive)
    glutSolidSphere(radius/6,25,25);
    glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, Noemit);

    glPopMatrix();

    glTranslatef(0.0,0.0,0.0);


    glPushMatrix();

    glColor3f(1.0, 1.0, 1.0);
    glPointSize(3);
    for(int i=1;i<100;i++){
         int x = rand()%640 ;
       int  y = rand()%480;
        glBegin(GL_POINTS);
        glVertex2i (x,y);
    glEnd();
    }

    glPopMatrix();

    glLoadIdentity();

    glColor3f(1.0, 1.0, 1.0);
    glPointSize(3);
    for(int i=1;i<100;i++){
int          x = rand()%640 ;
    int     y = rand()%480;
        glBegin(GL_POINTS);
        glVertex2i (x,y);
    glEnd();
    }


    glFlush(); //FOR RENDERING
    glutSwapBuffers();
}

void reshape(int x, int y){
    if(y == 0 || x == 0) return;
    glMatrixMode(GL_PROJECTION);

    gluPerspective(20.0,(GLdouble)x/(GLdouble)y,0.6,40.0);
    glMatrixMode(GL_MODELVIEW);
    glViewport(0,0,x,y);  //Use the whole window for rendering
}


int main (int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
    glutInitWindowSize(1000,600);
    glutCreateWindow("Project_KD");
    initLighting();

    xRotated = yRotated = zRotated = 0.0;

    glutIdleFunc(idleFunc);
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();
    return 0;
}
genpfault
  • 51,148
  • 11
  • 85
  • 139
Didarul Amin
  • 31
  • 1
  • 2
  • see [Procedural generation of stars with skybox](https://stackoverflow.com/a/38068390/2521214) or use the real thing: [swift sphere combine star data](https://stackoverflow.com/a/40171880/2521214) you can use **BSC** (Bright star catalog), **Hipparcos** or what ever all the star catalogs are usually downloadable for free in ASCII formats. Also see [Is it possible to make realistic n-body solar system simulation in matter of size and mass?](https://stackoverflow.com/a/28020934/2521214) – Spektre Aug 15 '18 at 06:35

1 Answers1

7

Lots of wonkiness:

  • Couple instances of unmatched glPushMatrix()/glPopMatrix() calls; avoid over-/under-flowing the matrix stack; I like to use extra scopes to visually indicate matrix stack nesting.
  • Your point drawing was assuming an ortho projection while you only set a perspective one.
  • You left lighting enabled while trying to draw your points, resulting in very dark points everywhere except the bottom-left.
  • Your point drawing loop was duplicated for some reason; if you want double the stars adjust the for-loop end value instead of copy-pasting the loop.
  • You should use glutPostRedisplay() in your idle callback instead of calling display() directly.
  • Set your projection/modelview matrices each time through display() instead of setting them in a resize callback; helps reduce a source of mysterious matrix errors. The default resize callback calls glViewport() for you so you don't have to worry about doing that.
  • You're drawing the points ("stars"?) after the 3D spheres; I think the intent was to draw them before so they're "underneath".
  • Unholy mishmash of code formatting; recommend something like clang-format to keep that in check.
  • If you're using FreeGLUT on Windows (which you ought to be; it's really the only maintained GLUT implementation left) you don't need the #include <Windows.h>.
  • Recommend using a timer callback instead of an idle callback to update your simulation/animation. Without vsync that idle callback will be called incredibly often. With a timer callback you can simulate the even ~16 millisecond frames a vsync'd system will give you.

All together:

screen capture

#include <GL/glut.h>
#include <cmath>

GLfloat xRotated, yRotated, zRotated;
GLdouble radius = 3;

void timer( int value )
{
    if( zRotated > 360.0 )
    {
        zRotated -= 360.0 * floor( zRotated / 360.0 ); // Don't allow overflow
    }

    if( yRotated > 360.0 )
    {
        yRotated -= 360.0 * floor( yRotated / 360.0 ); // Don't allow overflow
    }

    zRotated += 5.0;
    yRotated += 1.0;

    glutTimerFunc( 16, timer, 0 );
    glutPostRedisplay();
}

void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glDepthMask( GL_FALSE );
    glDisable( GL_DEPTH_TEST );
    glDisable( GL_LIGHTING );

    // 2D rendering
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho( 0, 640, 0, 480, -1, 1 );
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glPushMatrix();
    {
        glColor3f( 1.0, 1.0, 1.0 );
        glPointSize( 3 );
        glBegin( GL_POINTS );
        for( int i = 1; i < 100; i++ )
        {
            int x = rand() % 640;
            int y = rand() % 480;
            glVertex2i( x, y );
        }
        glEnd();
    }
    glPopMatrix();


    glDepthMask( GL_TRUE );
    glEnable( GL_DEPTH_TEST );

    // Enable lighting
    glEnable( GL_LIGHTING );
    glEnable( GL_LIGHT0 );
    GLfloat qaSpecularLight[] = {1.0, 1.0, 1.0, 1.0};
    glLightfv( GL_LIGHT0, GL_SPECULAR, qaSpecularLight );

    // 3D rendering
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    double w = glutGet( GLUT_WINDOW_WIDTH );
    double h = glutGet( GLUT_WINDOW_HEIGHT );
    gluPerspective( 20.0, w / h, 0.1, 80.0 );
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    glTranslatef( 0.0, 0.0, -40.0 );

    glPushMatrix();
    {
        glutSolidSphere( radius, 25, 25 );
    }
    glPopMatrix();

    glPushMatrix();
    {
        glRotatef( yRotated, 0.0, 2.0, 0.0 );
        glTranslatef( 5.0, 0.0, 0.0 );
        GLfloat qaLightPosition[] = {1, 1, 1, 1};
        glLightfv( GL_LIGHT0, GL_POSITION, qaLightPosition );
        GLfloat emitLight[] = {0.9, 0.9, 0.9, 0.9};
        glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, emitLight ); // Make sphere glow (emissive)
        glutSolidSphere( radius / 6, 25, 25 );
        GLfloat Noemit[] = {0.0, 0.0, 0.0, 1.0};
        glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, Noemit );
    }
    glPopMatrix();

    glutSwapBuffers();
}

int main( int argc, char** argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
    glutInitWindowSize( 1000, 600 );
    glutCreateWindow( "Project_KD" );

    xRotated = yRotated = zRotated = 0.0;

    glutDisplayFunc( display );
    glutTimerFunc( 0, timer, 0 );
    glutMainLoop();
    return 0;
}
genpfault
  • 51,148
  • 11
  • 85
  • 139