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

何が起こっているのか:

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

4

2 に答える 2

1

わかりました私はそれを修正しました。重要なポイントは次の 2 つです。

  1. ルークが彼の答えで言及していたように、変換に関する限り、私のコードに問題はありません。そのままでは、変換はメッシュにのみ影響を与え、光は実際には静止したままです。

  2. 私の立方体の周りにライトが回転しているように見える (実際にはライトが静止しているのに) 理由は、一言で言えば NORMALS です。

つまり、立方体の面の法線宣言が不足しています。ええ、誰が知っていましたか、私は知りませんでした。いくつかの面 (三角形や四角形など) とライトがある場合、法線を宣言しなくても、単にサーフェスがライトの影響を受けないわけではありません。それらは実際に影響を受けていますが、それはすべて奇妙です (質問テキストの私のスクリーンショットからわかるように)。

だから基本的に私がそれを修正するためにしたことは、Neheの(私はそれらの人が大好きです)レッスン07を見ることです:

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

ページの下部には、大量の言語とライブラリのコードがあります。私は個人的に JOGL バージョンを使用しましたが、どのバージョンでも問題なく動作します。

次に、頂点/インデックス/法線を (個別ではなく) 配列として宣言する方法を確認するために、OpenGL ドキュメントも調べました。

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

于 2012-03-15T11:33:14.530 に答える
0

2 回目の呼び出しの直前にglLoadIdentity()を追加してみてください。glPushMatrix()

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

元の投稿にあるように、そのプッシュ/ポップのペアは何もしていません。それらの間に行列演算はありません。 glPushMatrix()アクティブなマトリックスをリセットするのではなく、現在の値のセットを保持するだけなので、その状態に戻ることができます。

あなたが投稿したコードにエラーがあるとは思いません。まだ問題が発生している最小限の実例を提供できますか?

于 2012-03-14T11:24:06.027 に答える