OpenGLの照明に問題があります。私の問題は次のとおりです。オブジェクトが0回転すると、ライティングはうまくいきます。そうでなければ、ライティングは動作しますが、シーンに関して固定されているのではなく、オブジェクトと共に回転します。モデルごとのローカル回転がOpenGLの照明を壊す
音はシンプルですね。 OpenGL FAQにはいくつかの簡単なアドバイスがあります。glLightfv(GL_LIGHT0、GL_POSITION ...)に渡された座標に現在のMODELVIEW行列が乗算されます。だから私は間違った場所でこれを呼んでいるに違いない。私は、MODELVIEW行列を変数にデバッグするためにコピーしました、そして、私のオブジェクトがどのように回転しているかにかかわらず同じままです。だからそれは別のものでなければなりませんが、私は何を失っています。
glDrawArraysを使用してモデルを描画し、回転クォータニオンと変換から構築された行列でglMatrixMultを使用して私のモデルをワールド内に配置します。このすべてはglPushMatrix/glPopMatrix内で行われるため、ライトに何らかの副作用があってはいけません。
Aは私のレンダリングプロセスのバージョンをダウンカットは次のようになります。
//Setup our camera
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
cameraMatrix = translate(Vector3D(Pos.mX,Pos.mY,Pos.mZ)) * camRot.QuatToMatrix();
glMultMatrixf((GLfloat*)&cameraMatrix);
//Position the light now
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
GLfloat lp[4] = {lightPos.mX, lightPos.mY, lightPos.mZ, 1.0f};
glLightfv(GL_LIGHT0, GL_POSITION,(GLfloat*) lp);
//Loop, doing this for each model: (mRot, mPos, and mi are model member variables)
matrix = translate(Vector3D(mPos.mX,mPos.mY,mPos.mZ)) * mRot.QuatToMatrix();
glPushMatrix();
glMultMatrixf((GLfloat*)&matrix);
glBindBuffer(GL_ARRAY_BUFFER, mi->mVertexBufHandle); //Bind the model VBO.
glDrawArrays(GL_TRIANGLES, 0, mi->verts); //Draw the object
glPopMatrix();
私は法線が台無しにされるかもしれないと思ったが、私はそれらをレンダリングするとき、彼らは罰金に見えます。 OpenGLの照明に影響する可能性のあるものはありますか?よくある質問には言及:
あなたの光源が 照明器具の一部である場合、あなたはまた、モデリング変換を指定 する必要があるかもしれませんので、 光位置は、周囲の治具の形状と同じ場所 です。
私はあなたが、シーンに光を変換するために誰でも思いつきそうのようなものを必要とするだろうことを意味するためにこれを取った...しかし、それは何か他のものを意味するのでしょうか?
これは本当に奇妙になっています。 glPushMatrix()を使用して、アイデンティティ変換の下でライトの位置を0,0,0に設定すると、ライトも回転します。 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glLightfv(GL_LIGHT0、GL_POSITION、Vector4D(0,0,0,1)); glPopMatrix(); –
私はオブジェクトをレンダリングするときに何か間違っていると確信しています。最後のステップはオブジェクトにローカル回転を与えることですが、この回転もライトに適用されるようです。私の最初の考えは、新しいローテーションでライトポジションを増やすことでしたが、私はそれを間違っているか、助けにはならないのです... –
ライトが回転しているとどう思いますか?その位置にGL_POINTを描画し、(混乱を避けるために)glDrawArraysをコメントアウトしてみてください。 cameraMatrixが修正されても、ポイントは動いていますか? – UncleZeiv