2011-10-30 2 views
0

J'ai passé environ 2 jours à essayer de trouver des objets 3D en utilisant lwjgl, et je n'ai rien trouvé. Je peux facilement rendre des objets 2D, et quand j'ai essayé de rendre des objets 3D, soit le programme s'est écrasé, soit un écran noir a été ouvert, en ce moment, j'utilise Eclipse, et je le lance dans cet environnement (je ne sais pas Je ne sais pas si c'est le problème). Si quelqu'un pouvait me diriger vers un bon tutoriel, ou simplement me donner une explication de ce que je fais de mal, ce serait apprécié. Voici mon code:Conseils nécessaires pour les objets 3D utilisant la bibliothèque de jeux Java légère (LWJGL)

import org.lwjgl.LWJGLException; 
    import org.lwjgl.opengl.Display; 
    import org.lwjgl.opengl.DisplayMode; 
    import org.lwjgl.opengl.GL11; 

    public class Objects { 
     public static void main(String[] args) { 
      Objects objects = new Objects(); 
      objects.start(); 
     } 

     public void start() { 
      try { 
       Display.setDisplayMode(new DisplayMode(800, 600)); 
       Display.create(); 
      } catch (LWJGLException e) { 
       e.printStackTrace(); 
       System.exit(0); 
      } 

      initGL(); 

      while(!Display.isCloseRequested) { 
       Cube(); 

       Display.update(); 
      } 

      Display.destroy(); 
     } 

     public void initGL() { 
      GL11.glMatrixMode(GL11.GL_PROJECTION); 
      GL11.glLoadIdentity(); 
      GL11.glOrtho(0, 800, 600, 0, 1, -1); 
      GL11.glMatrixMode(GL11.GL_MODELVIEW); 

      return; 
     } 

     public void cube() { 
      GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); 

      //front face 

      GL11.glColor3d(0.0, 1.0, 1.0); 
      GL11.glVertex3d(1.0, 1.0, -1.0); 
      GL11.glVertex3d(-1.0, 1.0, -1.0); 
      GL11.glVertex3d(-1.0, -1.0, -1.0); 
      GL11.glVertex3d(1.0, -1.0, -1.0); 

      //side face 

      GL11.glColor3d(1.0, 0.0, 0.0); 
      GL11.glVertex3d(1.0, 1.0, -1.0); 
      GL11.glVertex3d(1.0, 1.0, -3.0); 
      GL11.glVertex3d(1.0, -1.0, -3.0); 
      GL11.glVertex3d(1.0, -1.0, -1.0); 

      ...(I kept going like this for the rest of the faces) 

      return; 
     } 

*************** EDIT ***************

J'ai lu à la fois de vos réponses, et ont fait un code de LWJGL java sur cette base, mais quand j'ai essayé de le lancer dans l'environnement Eclipse, il m'a donné l'erreur:

usage: 
XPMFile <file> 
java.lang.ArrayIndexOutOfBoundsException: 0 
at org.lwjgl.util.XPMFile.main(XPMFile.java:260) 

Alors, encore une fois, voici mon code:

package testing; 

    import org.lwjgl.LWJGLException; 
    import org.lwjgl.opengl.Display; 
    import org.lwjgl.opengl.DisplayMode; 
    import org.lwjgl.opengl.GL11; 
    import org.lwjgl.util.glu.GLU; 

    public class CubeRender { 
     public static void main(String[] args) { 
      CubeRender cube = new CubeRender(); 
      cube.start(); 
     } 

     public void start() { 
      try { 
       Display.setDisplayMode(new DisplayMode(800, 600)); 
       Display.create(); 
      } catch(LWJGLException e) { 
       e.printStackTrace(); 
       System.exit(0); 
      } 

      initGL(); 

      while(!Display.isCloseRequested()) { 
       renderCube(); 

       Display.update(); 
      } 

      Display.destroy(); 
     } 

     public void initGL() { 
      GL11.glMatrixMode(GL11.GL_PROJECTION); 

      GL11.glLoadIdentity(); 

      GLU.gluPerspective(45, 100, 1, 100); 
      GL11.glEnable(GL11.GL_DEPTH_TEST); 
      GL11.glDepthFunc(GL11.GL_LEQUAL); 

      GL11.glMatrixMode(GL11.GL_MODELVIEW); 
     } 

     public void renderCube() { 
      double x = 1; 
      double y = 1; 
      double z = -1; 

      //front face 

      GL11.glBegin(GL11.GL_QUADS); 

      GL11.glNormal3d(0, 0, 1); 

      GL11.glColor3d(0.0, 1.0, 1.0); 
      GL11.glVertex3d(x, y, z); 
      GL11.glVertex3d(x-2, y, z); 
      GL11.glVertex3d(x-2, y-2, z); 
      GL11.glVertex3d(x, y-2, z); 

      GL11.glEnd(); 

      //right face 

      GL11.glBegin(GL11.GL_QUADS); 

      GL11.glNormal3d(-1, 0, 0); 

      GL11.glVertex3d(x, y, z); 
      GL11.glVertex3d(x, y, z-2); 
      GL11.glVertex3d(x, y-2, z-2); 
      GL11.glVertex3d(x, y-2, z); 

      GL11.glEnd(); 

      return; 
     } 
    } 

****** ****** EDIT 2 si vous avez quelque chose à contribuer à la réponse ci-dessus s'il vous plaît poster des réponses ici: How to import lwjgl_util

Répondre

1

Votre aide d'une vue orthographiques 2d voir la ligne suivante « GL11. glOrtho (0, 800, 600, 0, 1, -1); " qui clips tout à 1, -1 axe pour la 3ème dimension. Ce que vous devez vraiment regarder est une mise en place d'une vue 3D, en utilisant glFrustum ou gluPerspective au lieu de glOrtho.

Bien que vieux maintenant, vous devriez avoir une lecture rapide des tutoriels Nehe à http://nehe.gamedev.net/ avec quelques ports LWJGL du premier peu trouvé à http://ninjacave.com/nehetutorials

Ne gardez à l'esprit que les tutoriels Nehe utilisent OpenGL classique est ce qui à peu près déprécié pour opengl moderne, cependant il ne fait pas de mal de savoir comment fonctionne opengl classique. Il vaut mieux que vous google pour certains tutoriels OpenGL plus récents qui utilisent des techniques telles que les shaders et les VBO, je vous recommande d'obtenir des livres comme le livre rouge OpenGL, Orange Book ou OpenGL Super Bible. Vous pouvez également jeter un oeil à la links and resources page sur le Wiki LWJGL, il devrait vous diriger vers une tonne de ressources et de tutoriels opengl.

+0

Merci pour la réponse, je vais essayer. – JAW1025

+0

Okay, j'ai regardé le gluPerspective sur le site Web de lwjgl, et je sais qu'il veut quatre valeurs de flotteur, mais comment l'employez-vous?, Et que signifient les valeurs de flotteur? – JAW1025

+0

ne pense pas que je serai en mesure de l'expliquer mieux que ce lien http://profs.sci.univr.it/~colombar/html_openGL_tutorial/fr/03basic_transforms_018.html Tout ce qui précède le point nearClip et après le point farClip est écrêté (c'est-à-dire non tracé), aspect est généralement le rapport de l'écran (c'est-à-dire largeur/hauteur), et fov est l'angle du champ de vision. – Gavin

0

Je ne sais pas si vous l'avez inclus, mais si vous ne l'avez pas fait, je le signalerai.

Vous semblez essayer de dessiner le cube, sans réellement commencer à dessiner.

GL11.glBegin(int mode) 

Commence le dessin des formes. GL11.GL_QUADS est utilisé pour dessiner des faces avec 4 sommets, tous les 4 sommets ajoutés seront automatiquement utilisés comme face suivante, puis vous définissez 4 sommets supplémentaires. GL11.GL_TRIANGLES est utilisé lors de la création de trigones ou de faces avec 3 sommets.

Pour votre cas, vous souhaitez utiliser:

GL11.glBegin(GL11.GL_QUADS); 

Lieu qu'au début de rendre votre monde entier, vous pouvez basculer entre les triangles et les quadriceps à tout moment, a accordé le visage est bien terminée. Une fois que vous avez terminé avec toutes les formes de dessin, puis mettez cette ligne à la fin de votre rendu.

GL11.glEnd(); 

Et cela mettra fin au processus de dessin.

Si vous prévoyez d'utiliser l'éclairage, il est extrêmement important de prendre l'habitude de fixer des normales avant de placer des sommets, une normale est un ensemble de 3 nombres qui indiquent la direction d'un visage s'il pointe. Par défaut, il fait face à l'axe + z, ce qui signifie que si vous aviez un sol et une lumière au-dessus du sol, la lumière ne semblerait aller que dans une direction. Pour définir une utilisation normale:

GL11.glNormal3d(x, y, z); 

exemples:

0, 1, 0 is straight up 
0, -1, 0 is straight down. 
1, 0, 0 is facing towards +X 
-1, 0, 0 is facing towards -X 
0, 0, 1 is facing towards +Z 
0, 0, -1 is facing towards -Z 

Vous définissez la normale avant les sommets, vous n'avez pas besoin de régler la normale pour chaque Vertice, seulement devant le groupe d'entre eux, voir tous les sommets de cette face seront orientés dans la même direction.

Même en l'absence de lumière, il est généralement recommandé de travailler avec des normales, cela peut également affecter la qualité de votre physique. En outre, sans test de profondeur, certains objets 3D qui devraient être derrière d'autres peuvent apparaître au premier plan. LWJGL a une fonction spécifique pour l'utilisation de la profondeur. Placez-le dans votre initGL(), avant de définir le mode matrice et ainsi de suite. LEQUAL signifie longueur égale, il compare les distances pour voir qui est plus élevé et ces objets sont derrière ceux qui ont une distance plus courte.

pointeurs vers quelques bonnes ressources LWJGL:

+0

Merci pour l'aide supplémentaire, j'ai mis le GL11.glBegin dans mon code, mais je ne l'ai pas posté, que feriez-vous si vous dessinez un visage avec plus de quatre sommets? Et je ne connaissais ni les normales, ni la profondeur, et les liens que vous avez fournis étaient très utiles. – JAW1025

+0

La plupart des moteurs n'autorisent pas les polygones avec plus de 4 sommets, donc la plupart d'entre eux divisent une face en quelques-uns, par exemple, pour faire un carré et un triangle sur deux des sommets du carré.Pour LWJGL, il est possible, mais inefficace d'utiliser GL_POLYGON. –