begin process at 2010 02 10 00:01:02
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

OpenGL

 > REFLECTION D'OBJ (OPENGL)

REFLECTION D'OBJ (OPENGL)


 Information sur la source

Note :
7 / 10 - par 3 personnes
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :OpenGL Niveau :Débutant Date de création :03/08/2004 Vu / téléchargé :5 515 / 537

Auteur : xarier

Ecrire un message privé
Site perso
Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Voila ceci est un effet de relfection d'objet sur une surface.

j'avait chercher sur le net des cours et des sources sur comment realiser cette effet et j'ai trouver que tous les sources presente utilise le meme principe qui est un peut trop long et moin satisfesant.
Alors j'ai pensé de creé mon propre algo sans utiliser le stencil buffer ni le glcolormask et d'esseyer de reduire le code.
ben j'ai constater que mon algo personel est plus rapide et c plus JOLI.

Le zip conteint deux exe

Reflecton General.exe : utilise le stencil buffer et glcolormask ansi que le blending (la methode que tous le monde utilise)

Reflect.exe = utilise que le blending (c celui que j'ai realiser et qui est livré avec ces sources )

je pense que mon algo et mieux que l'algo courant , si je me trompe sur ce point veuillez vous me le dire en m'expliquant pourquoi

Merci d'avance
j'espere que j'ai pas commi bcp de fote ;D
----------------------
Merci a platon179
-----------------------

Source

  • Finalement voila deux sources des deux effets :
  • constater vous meme :D
  • Reflection : Methode Courant
  • ---------------------------------------
  • glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);// Clears the screen.
  • glLoadIdentity(); //Reset modelview matrix for new frame.
  • // Here we just set the camera's position.
  • gluLookAt(0.0f, 1.5f, 2.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f);
  • // Since our reflections uses the stencil buffer we must enable it. Just like if we
  • // are enabling depth testing.
  • glEnable(GL_STENCIL_TEST);
  • // Next we must disable depth testing and turn off color modifications on all colors.
  • glDisable(GL_DEPTH_TEST);
  • glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
  • // Next two functions will set up the stencil buffer and stencil test.
  • glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
  • glStencilFunc(GL_ALWAYS, 1, 1); // Test all.
  • // Now we will draw everything that can reflect the surroundings. This will not
  • // actually draw the ground just the "area" that makes up it.
  • DrawGround();
  • // Now we enable depth testing back and enable the color mask.
  • glEnable(GL_DEPTH_TEST);
  • glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
  • // Next we will set the stencil test to pixels equal to 1. What this means is that
  • // every pixel on the object that reflects if it has a 1 set to it then we draw on it.
  • // Above we set the stencil test to always 1 so when we rendered the ground every pixel
  • // of the ground was given the ability to be drawn on. Now we draw everything that we
  • // want reflection onto the "ground stencil area".
  • glStencilFunc(GL_EQUAL, 1, 1);
  • glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
  • // Draw the reflection.
  • glPushMatrix();
  • // We scale to invert the object onto the ground.
  • glScalef(1.0, -1.0, 1.0);
  • // Draw the reflected cube.
  • DrawCube();
  • glPopMatrix();
  • // Now we are done. We can disable the stencil buffer so what we draw from here on out
  • // is not drawn on the ground "area".
  • glDisable(GL_STENCIL_TEST);
  • // Now we can draw the ground. We will blend the ground with the stencil "area"and give
  • // it alpha so we can see the reflection.
  • glEnable(GL_BLEND);
  • glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  • // Set the alpha to 50%.
  • glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
  • // Draw the ground.
  • DrawGround();
  • // Stop the blending.
  • glDisable(GL_BLEND);
  • // Well we are done. Now we draw the cube normally.
  • DrawCube();
  • // Increase the objects rotation.
  • Rotation += 0.5;
  • // Reset it if the rotation goes over 360.
  • if(Rotation > 360.0f)
  • Rotation = 0.0f;
  • glFlush();
  • -------------------------------------------------------
  • Reflection propre algo
  • ---------
  • glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  • glLoadIdentity();
  • //Place la camera
  • gluLookAt(0.0f, 2.8f, -4.0f, 0.0f, 0.8f, 0.0f, 0.0f, 1.0f, 0.0f);
  • glPushMatrix();
  • // Inversé l'obj sur le sol
  • glScalef(1.0, -1.0, 1.0);
  • // Dessine le cube reflecté
  • DrawCube();
  • glPopMatrix();
  • glEnable(GL_BLEND);
  • glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  • glColor4f(1.0f, 1.0f, 1.0f, 0.7f);
  • // Dessine le sol
  • DrawGround();
  • glDisable(GL_BLEND);
  • //Le Cube Normal
  • DrawCube();
  • // Rotation
  • rot += 0.5;
  • if(rot > 360.0f)
  • rot = 0.0f;
  • glFlush();
  • return TRUE;
Finalement voila deux sources des deux effets :
constater vous meme :D 

Reflection : Methode Courant 
---------------------------------------

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);// Clears the screen.
   glLoadIdentity();                   //Reset modelview matrix for new frame.


   // Here we just set the camera's position.
   gluLookAt(0.0f, 1.5f, 2.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f);

   // Since our reflections uses the stencil buffer we must enable it.  Just like if we
   // are enabling depth testing.
   glEnable(GL_STENCIL_TEST);

   // Next we must disable depth testing and turn off color modifications on all colors.
   glDisable(GL_DEPTH_TEST);
   glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

   // Next two functions will set up the stencil buffer and stencil test.
   glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
   glStencilFunc(GL_ALWAYS, 1, 1);  // Test all.

   // Now we will draw everything that can reflect the surroundings.  This will not
   // actually draw the ground just the "area" that makes up it.
   DrawGround();

   // Now we enable depth testing back and enable the color mask.
   glEnable(GL_DEPTH_TEST);
   glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);   

   // Next we will set the stencil test to pixels equal to 1.  What this means is that
   // every pixel on the object that reflects if it has a 1 set to it then we draw on it.
   // Above we set the stencil test to always 1 so when we rendered the ground every pixel
   // of the ground was given the ability to be drawn on.  Now we draw everything that we
   // want reflection onto the "ground stencil area".
   glStencilFunc(GL_EQUAL, 1, 1);
   glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

   // Draw the reflection.
   glPushMatrix();

      // We scale to invert the object onto the ground.
      glScalef(1.0, -1.0, 1.0);

      // Draw the reflected cube.
      DrawCube();

   glPopMatrix();

   // Now we are done.  We can disable the stencil buffer so what we draw from here on out
   // is not drawn on the ground "area".
   glDisable(GL_STENCIL_TEST);

   // Now we can draw the ground.  We will blend the ground with the stencil "area"and give
   // it alpha so we can see the reflection.
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

   // Set the alpha to 50%.
   glColor4f(1.0f, 1.0f, 1.0f, 0.5f);

   // Draw the ground.
   DrawGround();

   // Stop the blending.
   glDisable(GL_BLEND);

   // Well we are done.  Now we draw the cube normally.
   DrawCube();


   // Increase the objects rotation.
   Rotation += 0.5;

   // Reset it if the rotation goes over 360.
   if(Rotation > 360.0f)
      Rotation = 0.0f;

 
   glFlush();
-------------------------------------------------------

Reflection propre algo
---------
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	
    glLoadIdentity();								

//Place la camera

gluLookAt(0.0f, 2.8f, -4.0f, 0.0f, 0.8f, 0.0f, 0.0f, 1.0f, 0.0f);


glPushMatrix();

    // Inversé l'obj sur le sol
    glScalef(1.0, -1.0, 1.0);

    // Dessine le cube reflecté
    DrawCube();

glPopMatrix();
   
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

   glColor4f(1.0f, 1.0f, 1.0f, 0.7f);

   // Dessine le sol
   DrawGround();

   glDisable(GL_BLEND);
  //Le Cube Normal

	DrawCube();

// Rotation
   rot += 0.5;

   if(rot > 360.0f)
      rot = 0.0f;

   glFlush();
	return TRUE;


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture ENVIRENEMENT MAPPING (OPENGL)
Source avec Zip Source avec une capture FEU D'ARTIFICE [OPENGL PARTICULES)
Source avec Zip HELO_DOS_INFO
Source avec Zip Source avec une capture Source .NET (Dotnet) PREMIERE APPLICATION.NET
Source avec Zip Source avec une capture EFFET GRAYSCAL

 Sources de la même categorie

Source avec Zip JEU DE DAMES 3D par vbclaude
Source avec Zip CHARGEMENT DES TEXTURES EN OPENGL par Jackyzgood
Source avec Zip Source avec une capture OPENGL - UN PEU DE NEIGE... par underprog
Source avec Zip Source avec une capture JEU DE LA VIE 3D OPENGL AVEC GESTION SOURIS par fratleym
Source avec Zip Source avec une capture SPEAD RACER par jngl

Commentaires et avis

Commentaire de Cyberboy2054 le 03/08/2004 22:33:58

Dans le 2eme cas, ca ne s'appelle pas de la réflexion, ca s'appelle de la transparence.
Le résultat obtenu est le même dans ce cas précis, mais si tu veux faire des symétries plus compliquées... ca marche plus.

Commentaire de Cyberboy2054 le 03/08/2004 22:34:29

Enfin sinon c'est pas bête comme méthode, et ca peut trouver ses applications...

Commentaire de xarier le 04/08/2004 00:15:54

SALUT Merci De m'avoir repondu mais alors j'ai une petit question

ta dit que  
->Le résultat obtenu est le même dans ce cas précis, mais si tu veux faire des symétries plus compliquées... ca marche plus.

tu peut me donner un exemple ????
Merci d'avance

Commentaire de Cyberboy2054 le 04/08/2004 02:01:10

exemple, tu veux faire une symetrie par rapport a un plan qui n'est pas le sol, un plan en diagonales par exemple

Commentaire de xarier le 04/08/2004 02:11:17

merci ;
mais je pense que si je veut la mettre en diagonles je n qu'a changer de cordoné
Merci :D

Commentaire de djl le 04/08/2004 08:47:45

mais reconnais au moins que l'utilisation de ton effet est tres limité, moi aussi j'avais deja essayer  de faire comme ca pour mon doom like mais on peut pas en tirer grand chose

par exemple, essai de faire un miroir en plein milieu d'une piece, tu verras que c'est ingerable alors que c'est un effet banal...

Commentaire de jmhC le 04/08/2004 11:12:54

Salut,

Pas mal, mais il y a quelque chose qui me chagrine dans la réflexion !

J'ai l'impression que lorsque le cube pivote de l'arriére vers l'avant, la réflexion va vers l'arriére !

Commentaire de xarier le 04/08/2004 12:44:50

salut
Merci tous de votre reponce (c pour ca que j'ai poser la source pour savoir ce qui va pas avec mon effet)

Djl-->Tu peut plus m'expliquer ( c sur mon trucs marche que sur des petite scene comme ta dit mais tu peut  m'eclerire plus)

jmhC---->Merci, et aussi pardon j'ai pas constater mais je pense pas car le code que j'ai mis reflect le cube :D

ALLER Encore merci

Commentaire de djl le 04/08/2004 19:43:42

si tu veux simuler un miroir au mileiu d'une piece, tu fais comment ?

tu vois ?

avec ta technique tu peux juste simuler la rreflection sur le sol ou sur un mur du moment qu'il s'agit d'un plan representant la limite de ta scene

Commentaire de xarier le 04/08/2004 19:58:34

Merci Djl Je vois la :D et Merci a celui qui ma poser un 10/10 :D

auter chose stp voila j'ai une autre source de reflection de d'obj (algo courant)
alors la j'ai changer la position du cube ce que j'ai constater c que la partie qui est en face du sol ce reflec et l'autre partie est tjr visible /:o

Commentaire de xarier le 04/08/2004 20:05:19

j'ai rien dit :O c'etait une autre source :)
je v essseyer de comprendre et mettre la source a jour :D(je verai ca demain )

Commentaire de sybitron le 04/08/2004 21:39:53

salut

Commentaire de sybitron le 04/08/2004 21:43:07

J'ai un petit prob les mec voila

voila en creont un moteur de particules j'ai volu mettre plusieur options mais j'ai eux quelque problem :'(
voila
je c  que

randien = (degre*PI)/180

mais dans la fonction du dessin du cercle quand je done a langle 45 il me dessine deja un cercle alors j'a ideux changer quelqeu options et la Nickel
#define TORADIAN(degre) (degre/4*PI)/180

mais je comprend pas pourkoi ????? pourton  randien = (degre*PI)/180
???????????????????????????????????
Merci dE VOTRE REPONCE

Commentaire de sybitron le 04/08/2004 21:44:05

autre chose je suis sur que tout les trucs du sin cos sont exact !!!

Commentaire de djl le 04/08/2004 21:46:05

on dit radian

radian =  degre * pi /180

pi radians = 180 degrés

si ca marche pas ca vint pas de la, c'est sur

Commentaire de sybitron le 04/08/2004 21:56:02

pardon mais voila ce que j'ai mis :D

particle[loop].x=(float)cos(Ragl* Speed.x)Radius;
particle[loop].y=1;
Particle[loop].z=(float)sin(Ragl* Speed.z)*Radius;

ou radius = rayon et Ragl est la valeur en radian alors je pense pas mais quand je change Met

#define TORADIAN(degre) (degre/4*PI)/180

ca marche :~õ

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,749 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales