2011-10-30 4 views
0

lwjglを使用して3Dオブジェクトを作成する方法を調べるのに約2日間を費やしましたが、何も見つかりませんでした。私は簡単に2Dオブジェクトをレンダリングすることができます.3Dオブジェクトをレンダリングしようとすると、プログラムがクラッシュしたり、黒いスクリーンが開かれたりしました。今はEclipseを使用しています。それが問題かどうかは分かりません)。誰かが私に良いチュートリアルを指すことができ、あるいは私が間違っていることの説明を私に与えることができれば、それは感謝します。ここに私のコードは次のとおりです。Lightweight Java Game Library(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; 
     } 

***************私は両方読んだEDIT ***************

は、あなたの答えの、及びそれに基づく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 ****** あなたはここの回答を投稿してください上記の回答のために貢献する何かを持っている場合:あなたは、2D正投影図を使用して How to import lwjgl_util

答えて

1

は、次の行「GL11を参照してください。 glOrtho(0,800,600,0,1、-1); "すべてを1にクリップし、3次元の-1軸をクリップします。

あなたが本当に見る必要があるのは、glOrthoではなくglFrustumまたはgluPerspectiveを使用して3Dビューを設定することです。

けれども、今、あなたは訥河のチュートリアルは、古典的なOpenGLを使用することを念頭に置いておくかhttp://ninjacave.com/nehetutorials

で見つかった最初のいくつかのいくつかのLWJGLポートとhttp://nehe.gamedev.net/で訥河チュートリアルの迅速な読み取りを持っている必要があり、古いはかなりこれは現代のOpenGLの価値は下がっていますが、古典的なOpenGLがどのように機能しているかは分かりません。 ShaderやVBOのようなテクニックを使った新しいOpenGLチュートリアルの方がいいと思うので、OpenGL Red Book、Orange Book、OpenGL Super Bibleのような本をお勧めします。あるいは、LWJGL Wikiのlinks and resources pageを見てください。これは、openglのリソースとチュートリアルの大部分を指しています。

+0

おかげで、私はそれを試してみましょう。 – JAW1025

+0

さて、私はlwjglウェブサイトのgluPerspectiveを見て、4つの浮動小数点値が必要だと知っていますが、どのように使用していますか?浮動小数点値はどういう意味ですか? – 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には、特に深度を使用するための機能があります。

マトリクスモードなどを設定する前にinitGL()に配置してください。

LEQUALは長さが等しいことを表し、どの距離がより遠く、それらのオブジェクトがより短い距離にあるかを比較します。いくつかの良いLWJGLリソースへ

ポインタ:応答のための

+0

余分な助けをいただきありがとうございます。私はGL11.glBeginをコードに入れましたが、投稿しませんでした.4つ以上の頂点を持つ面を描いていたらどうしますか?そして、私は法線や深みのあるものについて知らなかったので、あなたが提供したリンクは非常に役に立ちました。 – JAW1025

+0

ほとんどのエンジンでは、4つ以上の頂点を持つポリゴンは使用できません。そのため、ほとんどの場合、5面の面を四角形にし、三角形を2つの頂点の2つにするために、LWJGLの場合、GL_POLYGONを使用することは可能ですが、無効です。 –

関連する問題