旋转物体聚光灯阴影

时间:2017-12-14 08:05:59

标签: c++ opengl shadow

我必须在背景前旋转一个物体。我必须用聚光灯点亮它,并在物体和背景上显示阴影。

我的问题是当我旋转物体时阴影不会改变。

before rotate

after rotate

这是我的代码:

#include "stdafx.h"

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

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 }; //White Color 

GLfloat angleShape = 0.0f;

void CreateShape()
{
    // Set material properties
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, qaGreen);
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, qaGreen);
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, qaWhite);
    glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 20);

    glBegin(GL_TRIANGLES);           // Begin drawing the pyramid with 4 triangles
    // Front
    glColor3f(1.0f, 0.0f, 0.0f);     // Red
    glVertex3f(0.0f, 1.0f, 0.0f);
    glColor3f(0.0f, 1.0f, 0.0f);     // Green
    glVertex3f(-1.0f, -1.0f, 1.0f);
    glColor3f(0.0f, 0.0f, 1.0f);     // Blue
    glVertex3f(1.0f, -1.0f, 1.0f);

    // Right
    glColor3f(1.0f, 0.0f, 0.0f);     // Red
    glVertex3f(0.0f, 1.0f, 0.0f);
    glColor3f(0.0f, 0.0f, 1.0f);     // Blue
    glVertex3f(1.0f, -1.0f, 1.0f);
    glColor3f(0.0f, 1.0f, 0.0f);     // Green
    glVertex3f(1.0f, -1.0f, -1.0f);

    // Back
    glColor3f(1.0f, 0.0f, 0.0f);     // Red
    glVertex3f(0.0f, 1.0f, 0.0f);
    glColor3f(0.0f, 1.0f, 0.0f);     // Green
    glVertex3f(1.0f, -1.0f, -1.0f);
    glColor3f(0.0f, 0.0f, 1.0f);     // Blue
    glVertex3f(-1.0f, -1.0f, -1.0f);

    // Left
    glColor3f(1.0f, 0.0f, 0.0f);       // Red
    glVertex3f(0.0f, 1.0f, 0.0f);
    glColor3f(0.0f, 0.0f, 1.0f);       // Blue
    glVertex3f(-1.0f, -1.0f, -1.0f);
    glColor3f(0.0f, 1.0f, 0.0f);       // Green
    glVertex3f(-1.0f, -1.0f, 1.0f);
    glEnd();   // Done drawing the pyramid
}

void Spotlight()
{
    glEnable(GL_LIGHTING);
    glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 15.f);

    glLightModelf(GL_LIGHT_MODEL_AMBIENT, 0.2f);

    GLfloat light0Pos[] = { -3,-3,10,1 };
    glLightfv(GL_LIGHT0, GL_POSITION, light0Pos);

    GLfloat light0Diffuse[] = { 1,1,1 };
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0Diffuse);

    GLfloat light0Specular[] = { 1,1,1 };
    glLightfv(GL_LIGHT0, GL_SPECULAR, light0Specular);

    glEnable(GL_LIGHT0);
    //glDisable(GL_LIGHTING);
}

void display2()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();

    Spotlight();

    glTranslatef(-0.5f, 0.0f, -6.0f);

    glRotatef(angleShape, 1.0f, 1.0f, 0.0f);

    CreateShape();
    angleShape -= 5.f;

    glLoadIdentity();
    glTranslatef(2.0f, 2.5f, -7.0f);
    glBegin(GL_TRIANGLES);
    glColor3f(1.0f, 1.0f, 0.5f);
    glVertex3f(0.5f, -3.0f, -5.0f);
    glVertex3f(-7.0f, -6.0f, -5.0f);
    glVertex3f(1.0f, -6.0f, -5.0f);
    glEnd();

    glBegin(GL_TRIANGLES);
    glVertex3f(-6.5f, -3.0f, -5.0f);
    glVertex3f(0.5f, -3.0f, -5.0f);
    glVertex3f(-7.0f, -6.0f, -5.0f);
    glEnd();

    glBegin(GL_TRIANGLES);
    glVertex3f(-6.5f, -3.0f, -5.0f);
    glVertex3f(0.5f, -3.0f, -5.0f);
    glVertex3f(0.5f, 2.0f, -5.0f);
    glEnd();

    glBegin(GL_TRIANGLES);
    glVertex3f(-6.5f, -3.0f, -5.0f);
    glVertex3f(-6.5f, 2.0f, -5.0f);
    glVertex3f(0.5f, 2.0f, -5.0f);
    glEnd();

    glutSwapBuffers();
}

void initGL() {
    glClearColor(0.0, 0.7, 1.0, 1.0);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glShadeModel(GL_SMOOTH);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

void reshape(GLsizei width, GLsizei height) {
    if (height == 0) height = 1;
    GLfloat aspect = (GLfloat)width / (GLfloat)height;

    glViewport(0, 0, width, height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluPerspective(45.0f, aspect, 0.1f, 100.0f);
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE);
    glutInitWindowPosition(50, 50);
    glutInitWindowSize(640, 480);
    glutCreateWindow("OpenGL  #1");
    glutDisplayFunc(display2);
    glutReshapeFunc(reshape);
    initGL();
    glutMainLoop();

    return 0;
}

0 个答案:

没有答案