So far we have seen lighting effects which have the following properties:
- The light is being projected from an infinite distance.
- The rate of fading of the brightness at the circumference is very low.
But,
we might want to produce lights, which have a position in the scene and
are not projected from an infinite source unlike the normal lighting
which we have seen so far. Like a study lamp or a spot light on a pool
table, etc.
Source Code:
#include <windows.h>#include <GL/glut.h>static double yVal=1.0;int spot(double a, double b, double c, double d, double e, double f){/*
a, b and c -- x, y and z co-ordinates for light positiond, e and f -- x, y and z co-ordinates for spot light position*/GLfloat mat_specular[] = { 0.3, 1.0, 0.3, 1.0 };GLfloat mat_shininess[] = { 50.0 };GLfloat light_position[] = { a,b,c, 1.0 };GLfloat spotDir[] = { d,e,f };glClearColor (0.5, 0.5, 0.5, 0.0);glShadeModel (GL_SMOOTH);glLightfv(GL_LIGHT0,GL_SPECULAR,mat_specular);glLightfv(GL_LIGHT0,GL_POSITION,light_position);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);// Definig spotlight attributes
glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,95.0);glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,2.0);glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,spotDir);glEnable(GL_COLOR_MATERIAL);glEnable(GL_DEPTH_TEST);return 0;
}void drawSphere(){
GLUquadricObj* cyl;glClearColor (0.5, 0.5, 0.5, 0.0);GLfloat light_position[] = { 50.0, 50.0 , 0.0, 1.0 };GLfloat mat_specular[] = { 0.3, 0.3, 1.0, 1.0 };GLfloat mat_shininess[] = { 100.0 };GLfloat spotDir[] = { 50.0, 30.0, 0.0 };glShadeModel (GL_SMOOTH);spot( yVal,5.0,1.5,10.0,1.0,10.0);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);glMatrixMode (GL_PROJECTION);glLoadIdentity();gluPerspective(35.0, 1.0, 1.0, 100.0);glMatrixMode (GL_MODELVIEW);glLoadIdentity();gluLookAt (30.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);cyl = gluNewQuadric();gluQuadricDrawStyle(cyl, GLU_FILL);glPushMatrix();gluSphere(cyl, 4.0, 1000, 1000);glPopMatrix();glFlush();}void display(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);drawSphere();glFlush ();}void init (void){glClearColor (0.5, 0.5, 0.5, 0.0);glEnable(GL_DEPTH_TEST); //enabling z-buffer
/* initialize viewing values */
glMatrixMode (GL_PROJECTION);glLoadIdentity();gluPerspective(35.0, 1.0, 1.0, 100.0);glMatrixMode (GL_MODELVIEW);glLoadIdentity();gluLookAt (30.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);}void keyboard(unsigned char key, int x, int y){switch (key) {
case 27: // “esc” on keyboardexit(0);
break;
case 97: // “a” on keyboardyVal++;glutPostRedisplay();break;
}}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutInitWindowSize (600, 600);glutInitWindowPosition (100, 100);glutCreateWindow ("Spot Light - Programming Techniques");
init ();glutDisplayFunc(display);glutKeyboardFunc(keyboard);glutMainLoop();return 0;
}
Output
0 comments:
Post a Comment