2012-03-14 13 views
1

テクスチャキューブとライトを見るパースペクティブな場面を構築しようとしています。光が頂点の変換を取得しないようにする

起こっていると思われることは、光が立方体の上のどこかにとどまり、立方体がその光の下で(その中心に対して)回転することです。

実際に起こることは、立方体が回転すると光も回転するということです。

私はこれを検索し、同様のSOの質問を探してみましたが、助けたものは何も見つかりませんでした。 OpenGLドキュメントに続いて、私はライトの位置がモデルビューのマトリックス変換の影響を受けていることを理解していますが、変換の前/後にマトリックスをプッシュ/ポップすると、ライトがもはやそれらの影響を受けないようになります。しかし、私はそれを動作させることはできません、私はモデルビューの変換(キューブの)プッシュ/ポップするか、後で恒等行列をロードする場合でも、光は問題なく回転し続けます。

ここでは、コード(それはJOGLを使用してJavaであります)です:

//this array goes into lightPositionBuffer 
private float[] lightPosition = {0, 0, 0, 1.0f}; 

public void display(GLAutoDrawable gLDrawable) { 
    //code for clearing screen, binding the textures, etc. 

    gl.glEnableClientState(GLPointerFunc.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GLPointerFunc.GL_TEXTURE_COORD_ARRAY); 
    gl.glFrontFace(GL2.GL_CCW); 
    gl.glVertexPointer(3, GL.GL_FLOAT, 0, cubeVerticesBuffer); 
    gl.glTexCoordPointer(2, GL.GL_FLOAT, 0, cubeTextureCoordsBuffer); 

    //rotate the cube 
    gl.glPushMatrix();  
    gl.glTranslatef(cubeCenterXInitial,cubeCenterYInitial,cubeCenterZInitial); 
    gl.glRotatef(rotationAmountY, 1, 0, 0); 
    gl.glTranslatef(-cubeCenterXInitial,-cubeCenterYInitial,-cubeCenterZInitial); 
    rotationAmountY+=1.5f; 
    gl.glDrawElements(GL.GL_TRIANGLE_STRIP, cubeIndexes.length, GL.GL_UNSIGNED_BYTE, cubeIndexesBuffer); 
    gl.glPopMatrix(); 

    gl.glDisableClientState(GL2.GL_VERTEX_ARRAY); 
    gl.glDisableClientState(GL2.GL_TEXTURE_COORD_ARRAY); 

    //Position The Light: 
    gl.glPushMatrix(); 
    //lightPositionBuffer is a FloatBuffer containing the lightPosition float array declared above: 
    gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightPositionBuffer); 
    gl.glPopMatrix(); 
    //Enable Light 0 
    gl.glEnable(GL2.GL_LIGHT0); 
    gl.glEnable(GL2.GL_LIGHTING); 
} 

ここで何が起こっているのかです:

enter image description here

enter image description here

enter image description here

は、

enter image description here

enter image description here

enter image description here

答えて

1

私はそれを修正しました。ここでは、2つの重要なポイントです:ルークは彼の答えに言及したとおり

  1. は、限り変換が懸念しているように私のコードには何の問題もありません。そうであるように、トランスフォームはメッシュにのみ影響し、ライトは実際には依然としてそのままです。

  2. 私のキューブのように見える理由は、実際には光が静止しているときに光が回転しているということです。言い換えれば、NORMALSです。

さらに言えば、それは私のキューブの顔の法線の宣言がないことです。うん、知っていた、私はしませんでした。いくつかの面(三角形や四角形など)とライトがある場合、法線を宣言しても、サーフェスがライトの影響を受けないだけではありません。彼らは実際に影響を受けていますが、それはすべて奇妙です(質問テキストの私のスクリーンショットからわかるように)。そこには、言語のトンのためのコードを持っているページの一番下に

http://nehe.gamedev.net/tutorial/texture_filters_lighting__keyboard_control/15002/

:だから基本的に私は訥河の(私はそれらの人を愛する)レッスン07を見ているそれを修正するために何をしたか

私は個人的にJOGLのバージョンを使用しましたが、いずれもうまくいくでしょう。

は、その後、私はまた、ちょうど私が(個別にではなく当時)の配列としての私の頂点/インデックス/法線を宣言することができる方法を確認するためにOpenGLのドキュメントを見て:

http://www.songho.ca/opengl/gl_vertexarray.html

0

右2番目のglPushMatrix()呼び出しの前にglLoadIdentity()を追加してみてください:それは、あなたのオリジナルのポストでそのプッシュ/ポップスタンドとして

gl.glPushMatrix(); 
gl.glLoadIdentity(); // This 
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightPositionBuffer); 
gl.glPopMatrix(); 

ペアは何もしていません。それらの間には行列操作はありません。 glPushMatrix()は、アクティブなマトリックスをリセットしません。現在の値のセットのみを保持し、その状態に戻ることができます。

投稿したコードにあなたのエラーは含まれていません。あなたの問題を引き続き示す最小の実例を提供できますか?

+0

まあ、私はそこに、その行を追加してみました、それはですまったく同じこと。すでに展示されているコード以外にも、OpenGLスレッドを開始するJFrameを設定するための定型文しかありません。興味深いものはありませんが、かなりvorboseなので、それを追加しません。キューブがどのようにぼやけて回転するかを示すスクリーンショットを追加しました。 –

関連する問題