2011-10-30 61 views
0

我花了大約2天的時間試圖找出如何使用lwjgl製作3d對象,並且什麼也沒找到。我可以很容易地渲染2D對象,當我嘗試渲染3D對象時,程序崩潰了,或者打開了黑屏,現在我正在使用Eclipse,並且在該環境中運行它(我不'不知道這是否是問題)。如果有人能指點我一個很好的教程,或只是給我一個解釋我做錯了什麼,那將不勝感激。這裏是我的代碼:使用輕量級Java遊戲庫(LWJGL)的3D對象需要的建議

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; 
     } 

***************編輯***************

我已經從閱讀你的答案,並取得了基於它的Java LWJGL代碼,但是當我試圖在Eclipse環境中運行它,它給我的錯誤:

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

因此,再次在這裏是我的代碼:

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 ****** ,如果你有什麼對上面的回答貢獻請在這裏發表的答案:你使用二維正投影視圖 How to import lwjgl_util

回答

1

看到以下行「GL11。 glOrtho(0,800,600,0,1,-1);「將所有內容剪切爲1,第三維的-1軸。

你真正需要看的是設置一個3d視圖,可能使用glFrustum或gluPerspective而不是glOrtho。

雖然現在老了,你應該在http://nehe.gamedev.net/與前幾個發現了一些LWJGL端口具有訥河教程快速閱讀在http://ninjacave.com/nehetutorials

請記住,訥河教程採用經典的OpenGL是非常貶低現代opengl,但它不會傷害知道如何經典的opengl工作。對於一些使用諸如着色器和VBO之類技術的較新的OpenGL教程,它更適合Google,我建議您購買OpenGL紅皮書,橙皮書或OpenGL超級聖經等書籍。或者查看LWJGL Wiki上的links and resources page,它應該指向大量的opengl資源和教程。

+0

感謝您的答覆,我想試試。 – JAW1025

+0

好吧,我查看了lwjgl網站上的gluPerspective,並且我知道它需要四個浮點值,但是如何使用它?以及浮點值的含義是什麼? – JAW1025

+0

不認爲我能解釋它比這個鏈接更好http://profs.sci.univr.it/~colombar/html_openGL_tutorial/en/03basic_transforms_018.html在nearClip點之前和farClip點之後的任何東西剪裁(即未繪製),方面通常是屏幕的比例(即寬度/高度),而fov是視野的角度。 – Gavin

0

我不確定你是否包括它,但如果你沒有,我會指出。

您似乎試圖繪製立方體,而沒有真正開始繪製。

GL11.glBegin(int mode) 

開始繪製形狀。 GL11.GL_QUADS用於繪製具有4個頂點的面時,每添加4個頂點將自動用作下一個面,然後再定義4個頂點。

GL11.GL_TRIANGLES用於創建三角形或具有3個頂點的面。對於你的情況,你要使用:

,在渲染你的整個世界的開始,你可以三角形和四邊形之間的任何一點進行切換
GL11.glBegin(GL11.GL_QUADS); 

廣場,授予以前面對的是完整的。

完成所有繪製所有形狀後,將該行放在渲染結束處。

GL11.glEnd(); 

並且這將結束繪圖過程。

如果您計劃使用光照,在放置頂點之前養成設置法線的習慣非常重要,法線是一組3個數字,用於指示臉部指向哪個方向。默認情況下,它面向+ z軸,這意味着如果您的地板和地板上方有燈光,則燈光似乎只能朝一個方向行進。要設置正常使用:

GL11.glNormal3d(x, y, z); 

例子:

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 

您頂點之前設置正常,就不需要只是一羣人之前設定正常的每個頂點,看到該臉上的所有頂點將面向相同的方向。

即使沒有光線,與法線一起工作通常也是一個好主意,它們也會影響物理效果。

另外,如果沒有進行深度測試,某些3D物體應該位於其他物體的後面,可能會顯示在前面。 LWJGL具有專門用於使用深度的功能。

GL11.glEnable(GL11.GL_DEPTH_TEST); 
GL11.glDepthFunc(GL11.GL_LEQUAL); 

在設置Matrix模式之前將它放在initGL()中。

LEQUAL代表長度相等,它比較距離,看哪個更高,那些物體落後於距離更近的距離。

指點一下好LWJGL資源:

+0

感謝您的額外幫助,我確實將GL11.glBegin放入了我的代碼中,但沒有發佈,如果您繪製的圖像超過四個頂點,您會做什麼?我不知道法線或深度的東西,你提供的鏈接非常有幫助。 – JAW1025

+0

大多數引擎不允許多於4個頂點的多邊形,因此其中大多數引擎會將一個面分割爲幾個頂點,例如,使一個5面的面形成兩個正方形頂點的正方形和三角形。對於LWJGL有可能,但使用GL_POLYGON無效。 –