Консультация № 187294
23.04.2013, 13:16
94.84 руб.
0 0 0
Здравствуйте! Прошу помощи в следующем вопросе: сделал простенькую демку - вращающийся кубик, но возникла проблема с глубиной:
Код:
// ???  работает некорректно ???
//glClearDepth(1.0f); // установка буфера глубины
//glEnable(GL_DEPTH_TEST); // разрешить тест глубины
//glDepthFunc(GL_LEQUAL); // тип теста глубины

как устранить эту проблему?

второе: не могу разобраться со светом, у меня такое ощущение что источник освещения вращается вместе с кубиком.

исходный код:

Код:
#include<gl\glut.h>
#include<iostream>
#include<Windows.h>

using namespace std;

int const KEY_ESCAPE = 27;

void initGL();
void render();
void keyboard(unsigned char key, int x, int y);
void timer(int);
void box(double x, double y, double z, int length, float r, float g, float b);
void axis();

GLfloat LightAmbient[] = {.5, .5, .5, 1};
GLfloat LightDiffuse[] = {.5, .5, .5, 1};
GLfloat LightPosition[] = {-67, 32, -43, 1};
GLfloat LightDirection[] = {0, 0, 0};

float xrot, yrot;

int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(800, 600);
glutInitWindowPosition(100, 100);
glutCreateWindow("3Dexample");
initGL();
glutDisplayFunc(render);
glutKeyboardFunc(keyboard);
glutTimerFunc(1,timer,0);
glutMainLoop();
return 0;
}

void initGL()
{
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45,1.46, 1, 500);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// ??? работает некорректно ???
//glClearDepth(1.0f); // установка буффера глубины
//glEnable(GL_DEPTH_TEST); // разрешить тест глубины
//glDepthFunc(GL_LEQUAL); // тип теста глубины
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // улучшеные вычисления перспективы
glEnable(GL_LIGHTING); // разрешаем освещение
glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,LightDirection);
glEnable(GL_LIGHT1);
glTranslatef(0, 0, -120);
glutFullScreen();
ShowCursor(false);
}

void render()
{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(xrot, 1, 0, 0);
glRotatef(yrot, 0, 1, 0);
//axis();
box(0, 0, 0, 20, .56, .84, .69); // длина стороны 20 единиц
glPopMatrix();
xrot+=.5;
yrot+=.5;
glutSwapBuffers();
}

void timer(int)
{
render();
glutTimerFunc(1,timer,0);
}

void keyboard(unsigned char key, int x, int y)
{
switch(key)
{
case KEY_ESCAPE: exit(0);break;

}
}

void box(double x, double y, double z, int length, float r, float g, float b)
{
float l;
l = length / 2;

glBegin(GL_QUADS);
glColor3f(r, g, b);
glVertex3f(x + -l, y + l, z + l);
glVertex3f(x + l, y + l, z + l);
glVertex3f(x + l, y + -l, z + l);
glVertex3f(x + -l, y + -l, z + l);
glEnd();

glBegin(GL_QUADS);
glColor3f(r, g, b);
glVertex3f(x + -l, y + l, z + -l);
glVertex3f(x + l, y + l, z + -l);
glVertex3f(x + l, y + -l, z + -l);
glVertex3f(x + -l, y + -l, z + -l);
glEnd();

glBegin(GL_QUADS);
glColor3f(r, g, b);
glVertex3f(x + -l, y + l, z + -l);
glVertex3f(x + -l, y + l, z + +l);
glVertex3f(x + -l, y + -l, z + +l);
glVertex3f(x + -l, y + -l, z + -l);
glEnd();

glBegin(GL_QUADS);
glColor3f(r, g, b);
glVertex3f(x + l, y + l, z + -l);
glVertex3f(x + l, y + l, z + +l);
glVertex3f(x + l, y + -l, z + +l);
glVertex3f(x + l, y + -l, z + -l);
glEnd();

glBegin(GL_QUADS);
glColor3f(r, g, b);
glVertex3f(x + -l, y + l, z + -l);
glVertex3f(x + l, y + l, z + -l);
glVertex3f(x + l, y + l, z + l);
glVertex3f(x + -l, y + l, z + l);
glEnd();

glBegin(GL_QUADS);
glColor3f(r, g, b);
glVertex3f(x + -l, y + -l, z + -l);
glVertex3f(x + l, y + -l, z + -l);
glVertex3f(x + l, y + -l, z + l);
glVertex3f(x + -l, y + -l, z + l);
glEnd();

}

void axis()
{
glBegin(GL_LINES);
glColor3f(1, 0, 0);
glVertex3f(0, 0, 0 );
glVertex3f(20, 0, 0);

glColor3f(0, 1, 0);
glVertex3f(0, 20, 0);
glVertex3f(0, 0, 0);

glColor3f(0, 0, 1);
glVertex3f(0, 0, 0 );
glVertex3f(0, 0, 20);
glEnd();
}

Обсуждение

Форма ответа