Помощь - Поиск - Пользователи - Календарь
Полная версия: OpenGL Позиция света, Матрицы
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
ammaximus
Я сделал текстурированный ящик который прекрасно вращается. Но стоит включить свет... Свет не то что вращается вместе с ящиком он живет своей жизнью. Я пытался локализовать повороты сохраняя матрицы, но это не помогло.
#include <windows.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>
#include <GL\glut.h>

static HGLRC hRC;
static HDC hDC;

BOOL keys[256];

GLfloat xrot; //
GLfloat yrot; // Y
GLfloat zrot; // Z

GLuint texture[1]; /
GLvoid LoadGLTextures()
{
//
AUX_RGBImageRec *texture1;
texture1 = auxDIBImageLoad("space.bmp");
// Ñîçäàíèå òåêñòóðû
glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,
GL_RGB, GL_UNSIGNED_BYTE, texture1->data);
}

GLvoid InitGL(GLsizei Width, GLsizei Height){
LoadGLTextures(); //
glEnable(GL_TEXTURE_2D); //
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);

//LIGHT//
GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 0.0 };
GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_position[] = { 1.0, 0.0, 0.0, 0.0 };

/* */
glLightfv (GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv (GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv (GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv (GL_LIGHT0, GL_POSITION, light_position);

/* */
// glEnable (GL_LIGHTING);
// glEnable (GL_LIGHT0);
///LIGHT////

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluPerspective(50.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW);
}

GLvoid DrawGLScene(GLvoid){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glPushMatrix();///// <------
glTranslatef(0.0f,0.0f,-5.0f);
glRotatef(xrot,1.0f,0.0f,0.0f); // X
glRotatef(yrot,0.0f,1.0f,0.0f); // Y
glRotatef(zrot,0.0f,0.0f,1.0f); // Z
glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);

//
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); //
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); //
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); //
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); //

//
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); //
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); //
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); //
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); //

//
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); //
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); //
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); //
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); //

//
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); //
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); //
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); //
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); //

// Ïðàâàÿ ãðàíü
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); //
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); //
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); //
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); //

glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); //
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); //
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); //
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); //

glEnd();
glPopMatrix();///// <------
glutSwapBuffers();
glutPostRedisplay();
xrot+=0.1f; // X
yrot+=0.1f; // Y
zrot+=0.1f; // Z

}

int main (int argc, char** argv){

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize (500, 500);
glutCreateWindow ("Tex");

InitGL (30,30);
glutDisplayFunc (DrawGLScene);

glutMainLoop();
return 0;
return 0;
}
ammaximus
Моя ошибка заключалась в непереопределении векторов нормали. Как выяснилось, это критично). Ниже привожу рабочий код.

#include <windows.h>		// Çàãîëîâî÷íûé ôàéë äëÿ Windows
#include <gl\gl.h> // Çàãîëîâî÷íûé ôàéë äëÿ OpenGL32 áèáëèîòåêè
#include <gl\glu.h> // Çàãîëîâî÷íûé ôàéë äëÿ GLu32 áèáëèîòåêè
#include <gl\glaux.h> // Çàãîëîâî÷íûé ôàéë äëÿ GLaux áèáëèîòåêè
#include <GL\glut.h>

static HGLRC hRC; // Ïîñòîÿííûé êîíòåêñò ðåíäåðèíãà
static HDC hDC; // Ïðèâàòíûé êîíòåêñò óñòðîéñòâà GDI

BOOL keys[256]; // Ìàññèâ äëÿ ïðîöåäóðû îáðàáîòêè êëàâèàòóðû

GLfloat light_ambient[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_position[] = { 9.0, 6.0, 0.0, 0.0 };

GLfloat xrot; // Âðàùåíèå X
GLfloat yrot; // Y
GLfloat zrot; // Z

GLfloat nx,ny,nz;
GLuint texture[1]; // Ìåñòî äëÿ îäíîé òåêñòóðû
// Çàãðóçêà êàðòèíêè è êîíâåðòèðîâàíèå â òåêñòóðó

GLvoid LoadGLTextures(){
// Çàãðóçêà êàðòèíêè
AUX_RGBImageRec *texture1;
texture1 = auxDIBImageLoad("space.bmp");
// Ñîçäàíèå òåêñòóðû
glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,
GL_RGB, GL_UNSIGNED_BYTE, texture1->data);
}

GLvoid InitGL(GLsizei Width, GLsizei Height){
LoadGLTextures(); // Çàãðóçêà òåêñòóð
glEnable(GL_TEXTURE_2D); // Ðàçðåøåíèå íàëîæåíèå òåêñòóðû
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0);

glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(450.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//LIGHT//

glLightfv (GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv (GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv (GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv (GL_LIGHT0, GL_POSITION, light_position);

glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);

}
GLvoid DrawGLScene(GLvoid){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f,0.0f,-5.0f);

glPushMatrix();
glTranslatef(2.6f,0.0f,0.0f);
glRotatef(70,1.0f,0.0f,0.0f);
glutSolidSphere(1,10,10);
glPopMatrix();

glRotatef(xrot,1.0f,0.0f,0.0f); // Âðàùåíèå ïî îñè X
glRotatef(yrot,0.0f,1.0f,0.0f); // Âðàùåíèå ïî îñè Y
glRotatef(zrot,0.0f,0.0f,1.0f); // Âðàùåíèå ïî îñè Z

glPushMatrix();
glLoadIdentity();
glLightfv (GL_LIGHT0, GL_POSITION, light_position);
glPopMatrix();

glBindTexture(GL_TEXTURE_2D, texture[0]);

glBegin(GL_QUADS);

// Ïåðåäíÿÿ ãðàíü

glNormal3f(0,0,1);

glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Íèç ëåâî 1
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Íèç ïðàâî 2
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Âåðõ ïðàâî 3
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Âåðõ ëåâî

// Çàäíÿÿ ãðàíü
glNormal3f(0,0,-1);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Íèç ïðàâî
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Âåðõ ïðàâî
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Âåðõ ëåâî
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Íèç ëåâî

// Âåðõíÿÿ ãðàíü
glNormal3f(0,1,0);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Âåðõ ëåâî
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Íèç ëåâî
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Íèç ïðàâî
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Âåðõ ïðàâî

// Íèæíÿÿ ãðàíü
glNormal3f(0,-1,0);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Âåðõ ïðàâî
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Âåðõ ëåâî
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Íèç ëåâî
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Íèç ïðàâî

// Ïðàâàÿ ãðàíü
glNormal3f(1,0,0);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Íèç ïðàâî
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Âåðõ ïðàâî
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Âåðõ ëåâî
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Íèç ëåâî

// Ëåâàÿ ãðàíü
glNormal3f(-1,0,0);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Íèç ëåâî
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Íèç ïðàâî
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Âåðõ ïðàâî
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Âåðõ ëåâî

glEnd();
/*
glBegin(GL_QUADS);
glNormal3f(0.0, 0.0, 1.0);
glVertex3f(1.0, 1.0, 1.0);
glVertex3f(-1.0, 1.0, 1.0);
glVertex3f(-1.0, -1.0, 1.0);
glVertex3f(1.0, -1.0, 1.0);
glEnd();

glBegin(GL_QUADS);
glNormal3f(-1.0, 0.0, 0.0);
glVertex3f(-1.0, 1.0, 1.0);
glVertex3f(-1.0, 1.0, -1.0);
glVertex3f(-1.0, -1.0, -1.0);
glVertex3f(-1.0, -1.0, 1.0);
glEnd();

glBegin(GL_QUADS);
glNormal3f(0.0, 1.0, 0.0);
glVertex3f(-1.0, 1.0, -1.0);
glVertex3f(-1.0, 1.0, 1.0);
glVertex3f(1.0, 1.0, 1.0);
glVertex3f(1.0, 1.0, -1.0);
glEnd();

glBegin(GL_QUADS);
glNormal3f(1.0, 0.0, -1.0);
glVertex3f(1.0, -1.0, -1.0);
glVertex3f(1.0, -1.0, 1.0);
glVertex3f(1.0, 1.0, 1.0);
glVertex3f(1.0, 1.0, -1.0);
glEnd();

glBegin(GL_QUADS);
glNormal3f(0.0, 0.0, -1.0);
glVertex3f(1.0, -1.0, 1.0);
glVertex3f(1.0, -1.0, -1.0);
glVertex3f(-1.0, -1.0, -1.0);
glVertex3f(-1.0, -1.0, 1.0);
glEnd();
*/
glLoadIdentity();
glLightfv (GL_LIGHT0, GL_POSITION, light_position);
///// <------
glutSwapBuffers();
glutPostRedisplay();
xrot+=0.1f; // Îñü âðàùåíèÿ X
yrot+=0.1f; // Îñü âðàùåíèÿ Y
zrot+=0.1f; // Îñü âðàùåíèÿ Z

}

int main (int argc, char** argv){

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize (500, 500);
glutCreateWindow ("ßùèê");

InitGL (30,30);
glutDisplayFunc (DrawGLScene);

glutMainLoop();
return 0;
return 0;
}
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.