テクスチャキューブとライトを見るパースペクティブな場面を構築しようとしています。光が頂点の変換を取得しないようにする
起こっていると思われることは、光が立方体の上のどこかにとどまり、立方体がその光の下で(その中心に対して)回転することです。
実際に起こることは、立方体が回転すると光も回転するということです。
私はこれを検索し、同様の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);
}
ここで何が起こっているのかです:
は、
まあ、私はそこに、その行を追加してみました、それはですまったく同じこと。すでに展示されているコード以外にも、OpenGLスレッドを開始するJFrameを設定するための定型文しかありません。興味深いものはありませんが、かなりvorboseなので、それを追加しません。キューブがどのようにぼやけて回転するかを示すスクリーンショットを追加しました。 –