| Re : l'éclairage des objets. |
Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 13 Oct 2008, 20:52 Message non corrigé | |
|
Alors, j'ai vu que il avait pas encore fait de tutos sur l'éclairage Kayl, alors je m'y suis mit là dessus en cherchant un peut partout, et j'ai trouver des notions que j'ai jamais appris. (Pour toute les formules en ce qui concerne la trigo et tout, mais j'ai du mal à comprendre, me faudrait carrément un cours sur tout ce qui concerne l'espace, les collisions, etc... Et les formules à appliquer pcq pff...)
Alors j'ai commencer par quelque chose de simple : éclairer un Sphere.
voici le code
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <cstdlib>
void dessiner();
GLUquadric *params;
int main(int argc, char *argv[])
{
SDL_Event event;
SDL_Init(SDL_INIT_VIDEO);
atexit(SDL_Quit);
SDL_WM_SetCaption("SDL GL Application", NULL);
SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective(70,(double)640/480,1,1000);
for (;;) {
while (SDL_PollEvent(&event)) {
switch(event.type)
{
case SDL_QUIT:
exit(0);
break;
}
}
dessiner();
}
return 0;
}
void dessiner()
{
int LightPos[4] = {2,4,3,1};
int MatSpec [4] = {1,1,1,1};
float LightDif[4] = {.5f,.5f,1.f,1.f};
glLightfv(GL_LIGHT0,GL_DIFFUSE,LightDif);
glMaterialiv(GL_FRONT_AND_BACK,GL_SPECULAR,MatSpec);
glMateriali(GL_FRONT_AND_BACK,GL_SHININESS,100);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ;
params = gluNewQuadric ();
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
gluLookAt(3,4,2,0,0,0,0,1,0);
glEnable(GL_DEPTH_TEST);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glLightiv(GL_LIGHT1,GL_POSITION,LightPos);
gluSphere (params, 0.7, 20, 20);
glFlush();
SDL_GL_SwapBuffers();
gluDeleteQuadric (params);
}
Bon glLightPosition, ça, ça va.
Mais déjà, quelqu'un pourrait m'expliquer ce que font les 4 paramètre dans le tableau MatSpec et LightDif
Et aussi, GL_FRONT_AND_BACK ça sert à quoi ?
Et j'ai du mal à comprendre, la différence entre la lumière spéculaire et la lumière ambiante.
Sinon la brillance de l'objet, ça, ça va.
Depuis que je m'intéresse à la programmation de jeux j'apprend plein de trucs que je connaissais même pas. :o
Comme les coordonnée polaire par exemple dans le cas ou il faut bouger le point de vue. (la caméra)
Et aussi l'écriture des matrices de transformations sur des vecteurs à 3 dimensions.
Ainsi après, j'attaque la création des maps.
Mais il me reste encore plein de choses, tel que la gestion des collisions, et le chargement d'objets créer par exemple avec blender, y'a pas des tutos là dessus ?
Après l'éclairage, je m'attaque au chargement d'objets sur les maps.
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|
| |
|
|
David

Grade : Expert
Inscrit le: 11 Mai 2005, 20:30
|
| Ecrit le: 13 Oct 2008, 22:05 Message non corrigé | |
|
Commençons par glLightfv : Cette fonction permet d'initialiser une lampe
GL_LIGHT0, GL_LIGHT1, GL_LIGHT2, GL_LIGHT3... Ce sont des lumières par défaut. Il en existe 8 je crois.
GL_LIGHT0 et une lampe qui est, par défaut, allumé et de lumière blanche. Les autres sont noires.
Quand je dis blanche, cela signifie que les doses de rouge, de vert et de bleu sont à leur maximum.
Dans ton cas, c'est cette lampe par défaut que tu utilises.
Ensuite, GL_DIFFUSE signifie que la lumière vient d'un point. Par exemple, une lampe. Contrairement au soleil qui est dit directionnel car, arrivé sur l'obstacle, les rayons sont parallèle. Et une lumière d'ambience, c'est comme dans sauerbraten, la lumière est partout pareil, il n'y a pas d'ombre.
Ensuite, float LightDif[4] = {.5f,.5f,1.f,1.f}; est un tableau représentant les doses de lumière. Ici, 50% de rouge, 50% de vert et 100% de bleu.
glLightfv initialise donc la lampe GL_LIGHT0 avec les informations que nous venons de voir.
Pour ce qui est de GL_FRONT_AND_BACK, cela signifie que l'éclairage sera calculé des 2 coté de la texture, recto et verso.
Mais tu veras qu'en général, on ne calcul qu'un coté des textures car ça ne sert à rien de calcule l'éclairage venant de l'intérieur du personnage. Ceci va de paire avec le culling.
Je ne sais plus si je te l'ai déjà dis mais je te recommande vivement ce lien. Le tuto est en anglais mais bon...
________ Apprenez à créer votre propre FPS en C++ avec OpenGL. C'est pas dur ! :-)
|
|
| |
|
|
Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 14 Oct 2008, 15:53 Message non corrigé | |
|
Il a l'air trop bien ce cours, car il explique comment faire un terrai, comment gérer les collisions, et tout, mais dommage qu'il est en Anglais car je comprends rien à ce qu'il dit, il y a pas un tuto du même genre en français ?
(Fin les bases de openGL ça va, mais quand il s'agit de comment faire un terrain, et importer des personnages ou objets là je comprend plus rien)
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|
| |
|
|
OSasuke

Grade : Connaisseur
Inscrit le: 29 Juin 2008, 10:54
|
| Ecrit le: 14 Oct 2008, 18:53 Message non corrigé | |
|
#include <cstdlib>
#include <iostream>
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <Newton/Newton.h>
using namespace std ;
int main(int argc, char *argv[])
{
SDL_Event event ;
SDL_Init(SDL_INIT_VIDEO);
atexit(SDL_Quit);
SDL_WM_SetCaption("OpenGL / Newton Application", NULL);
SDL_Surface *ecran = SDL_SetVideoMode(800, 600, 32, SDL_OPENGL);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective(70,(double)640/480,1,1000);
glEnable(GL_DEPTH_TEST);
while (1)
{
SDL_PollEvent(&event);
switch(event.type)
{
case SDL_QUIT:
exit(0);
break;
case SDL_KEYDOWN :
switch (event.key.keysym.sym)
{
case SDLK_ESCAPE:
exit(0);
break;
}
}
SDL_Delay(8);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity( );
// Code pour les lumiére ||||||||||||||||||||||||||||||||||||
glEnable (GL_DEPTH_TEST);
glEnable (GL_COLOR_MATERIAL);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
GLfloat LampeDiffuse [] = {1.0f, 1.0f, 1.0f};
GLfloat LampeAmbient [] = {0.75f, 0.75f, 0.75f};
GLfloat LampePosition [] = {-5.0f, -5.0f, 10.0f, 5.0f};
glLightfv (GL_LIGHT0, GL_DIFFUSE, LampeDiffuse);
glLightfv (GL_LIGHT0, GL_SPECULAR, LampeDiffuse);
glLightfv (GL_LIGHT0, GL_AMBIENT, LampeAmbient);
glLightfv (GL_LIGHT0, GL_POSITION, LampePosition);
glColorMaterial (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glColorMaterial (GL_FRONT_AND_BACK, GL_SPECULAR);
glColor3f (1.0f, 1.0f, 1.0f);
glColorMaterial (GL_FRONT_AND_BACK, GL_EMISSION);
glColor3f (0.0f, 0.0f, 0.0f);
glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 128);
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gluLookAt(5,5,2,0,0,0,0,0,1);
glFlush();
SDL_GL_SwapBuffers();
}
return 0 ;
}
Tu utiliser ce code ça produit un exelent résultat .
(Fin les bases de openGL ça va, mais quand il s'agit de comment faire un terrain, et importer des personnages ou objets là je comprend plus rien)
Sur ce coup , je suis avec toi.
________
|
|
| |
|
| |