-2

My code works correctly. I see a ground on the output screen. But I want to light the ground to seem 3-d. So I added some code and function in my code.But output didn't change. What can I do to light the ground? Thanks for answers... My code is below.

#define _USE_MATH_DEFINES
#include <cmath>
#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>
float distance = 5.0;
int longitude = 0, latitude = 0, ainc = 5;
int lastx = -1, lasty = -1;
int data[17][21] =
{ { 14 ,25, 45 ,55 ,68 ,70 ,84 ,91 ,97, 101 ,105 ,105 ,105, 105 ,110 ,110, 110, 110 ,110, 110, 110 },
{ 5, 18, 43, 62 ,73, 82, 88, 94, 99, 102 ,105, 105 ,105, 105, 110, 110 ,110 ,110 ,110, 110, 110 },
{ 5, 18 ,38 ,56, 69, 77, 86, 94, 99, 103, 106, 105, 105, 105, 110, 110, 110, 110, 110, 110, 110 },
{ 5 ,9 ,31, 48, 60, 71, 81, 87, 95, 101, 106, 105, 105, 105, 110, 110, 110, 110, 110, 110, 110 },
{ 5, 5, 18, 37, 49, 56, 62, 81, 91, 94, 101, 105, 105, 105, 110, 110, 110 ,110 ,110, 110, 110 },
{ 5, 5, 12, 23 ,34, 40, 53 ,66 ,77 ,82, 97, 103, 105, 105, 109, 110, 110, 110, 110, 115, 115 },
{ 4 ,5 ,8 ,15, 20, 24, 35, 39, 40, 77, 92, 101, 104, 104 ,105, 110, 110, 110, 115, 115, 115 },
{ 5, 7 ,22, 36, 46, 48, 48, 44 ,50, 58, 80, 96, 96, 97, 106, 110, 110, 115, 115, 115, 115 },
{ 4, 15 ,31 ,46 ,61, 68, 69, 63, 53, 50, 67, 82, 84, 103, 108, 110, 110, 115, 115, 115, 115 },
{ 4, 12, 31, 46, 64, 78, 82, 80, 69, 54, 73, 71, 92, 105, 108, 110, 110, 115, 115, 115, 115 },
{ 6, 26 ,35 ,45, 63, 75, 84, 87, 84, 74 ,77, 80, 96, 103, 108, 110, 110, 110, 115, 115, 115 },
{ 21, 30, 46, 57 ,64 ,76 ,85 ,92 ,92, 87 ,79 ,80 ,86 ,102, 106, 110, 105 ,110, 115, 115, 115 },
{ 27, 40, 48 ,62 ,75 ,84 ,92, 96, 97 ,94 ,88 ,80 ,80 ,91, 104, 105, 105, 105, 110, 115, 115 },
{ 33, 43, 55, 65, 75, 87, 96, 101, 101, 101, 97, 92, 80, 80, 98, 105, 105, 105, 105, 110, 115 },
{ 45, 50, 58, 68, 80, 91, 99, 102, 105, 105, 105, 99, 90, 80, 80, 97, 105, 105, 105, 110, 100 },
{ 50, 60, 65, 71, 84, 95, 101, 105, 105, 107, 107, 106, 102, 101, 92, 80, 98, 104, 105, 100, 100 },
{ 60, 70, 76, 83, 88 ,96, 103, 106 ,107, 108 ,110, 109 ,108 ,108, 106, 101 ,90, 100, 100, 100, 100 } };
//bool tamam=true;

void display(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
int type = GL_TRIANGLES;  // or GL_LINE_LOOP

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

GLfloat qaBlack[] = { 0,0,0,1 };
GLfloat qaGreen[] = { 0,1,0,1 };
GLfloat qaWhite[] = { 1,1,1,1 };
glMaterialfv(GL_FRONT, GL_AMBIENT, qaGreen);
glMaterialfv(GL_FRONT, GL_DIFFUSE, qaGreen);
glMaterialfv(GL_FRONT, GL_SPECULAR, qaWhite);
glMaterialf(GL_FRONT, GL_SHININESS, 10000);



gluLookAt(350, 600, 400, 280, 300, 300, 1, 1, 1.0);
int x = 0;
int z = 0;
int y = 0;

//glColor3f(1.0, 1.0, 1.0);
glBegin(type);
for (int i = 0; i < 16; i++)
{
    x = 0;

    for (int k = 0; k < 20; k++)
    {
        y = data[i][k];
        if (y >= 80)
            glColor3f(1.0, 0.0, 0.0);
        if (y>0 && y<50)
            glColor3f(0.0, 1.0, 0.0);
        if (y >= 50 && y<80)
            glColor3f(1.0, 1.0, 0.0);



        glVertex3f(x, data[i][k], z);
        glVertex3f(x, data[i + 1][k], z + 20);
        glVertex3f(x + 20, data[i + 1][k + 1], z + 20);


        x = x + 20;

    }


    z = z + 20;

}
glEnd();
z = 0;
glBegin(type);
for (int i = 0; i < 16; i++)
{

    x = 0;


    for (int k = 0; k < 20; k++)
    {
        y = data[i][k];
        if (y>0 && y<50)
            glColor3f(0.0, 1.0, 0.0);
        if (y >= 50 && y<80)
            glColor3f(1.0, 1.0, 0.0);
        if (y >= 80)
            glColor3f(1.0, 0.0, 0.0);


        glVertex3f(x + 20, data[i + 1][k + 1], z + 20);//z*i
        glVertex3f(x + 20, data[i][k + 1], z);
        glVertex3f(x, data[i][k], z);



        x = x + 20;

    }


    z = z + 20;

}


glEnd();  // front

          /*if(tamam)*/

          /*tamam=false;*/
          //glFlush();

glutSwapBuffers();
}
void Initialize() {
glClearColor(10,10,10,10);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();


glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

GLfloat qaAmbient[] = { 20,20,20,10 };
GLfloat qaDiffuseLight[] = { 80,80,80,10 };
GLfloat qaSpecularLight[] = { 10,10,10,10 };
glLightfv(GL_LIGHT0, GL_AMBIENT, qaAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, qaDiffuseLight);
glLightfv(GL_LIGHT0, GL_SPECULAR, qaSpecularLight);

GLfloat qaLightPosition[] = { 0.5,0.5,0,1 };
glLightfv(GL_LIGHT0, GL_POSITION, qaLightPosition);
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27: case 'q': case 'Q':
    exit(EXIT_SUCCESS);
    break;
}
}  







int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(1200, 720);
glutCreateWindow(argv[0]);
//init ();
//glViewport(0, 0,glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(300, glutGet(GLUT_WINDOW_WIDTH) /         
glutGet(GLUT_WINDOW_HEIGHT), 2, 900.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glEnable(GL_DEPTH_TEST);
glutMainLoop();
return EXIT_SUCCESS;
}

1 Answers1

0

When working with OpenGL, you have to create your own definition of a Light and there are 3 different types of lights involved. Also when working with lighting in any 3D graphics applications; the vertices, edges and surfaces need to have normal defined so that the light calculations turn our correctly. However if you are planning on using OpenGL it would be appropriate to use Modern OpenGL of at least version 3.3 or higher using the OpenGL shader language GLSL!

Francis Cugler
  • 7,788
  • 2
  • 28
  • 59