OpenGL ライティングに問題があります。私の問題は次のとおりです。オブジェクトの回転が 0 の場合、照明は問題ありません。それ以外の場合、照明は機能しますが、シーンに関して固定されたままではなく、オブジェクトとともに回転します。
シンプルですね。OpenGL FAQには、これに関するいくつかの簡単なアドバイスがあります: glLightfv(GL_LIGHT0, GL_POSITION...) に渡される座標は、現在の MODELVIEW 行列で乗算されます。だから私は間違った場所でこれを呼んでいるに違いない...私がそうではないことを除いて。MODELVIEW マトリックスを変数にコピーしてデバッグしましたが、オブジェクトがどのように回転されても同じままです。だからそれは何か別のものでなければなりませんが、私は何について途方に暮れています.
glDrawArrays を使用してモデルを描画し、回転クォータニオンと平行移動から構築されたマトリックス上で glMatrixMult を使用して、モデルをワールド内に配置します。これはすべて glPushMatrix/glPopMatrix 内で行われるため、ライトに副作用はありません。
私のレンダリング プロセスの簡易バージョンは次のようになります。
//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ライティングに影響を与える可能性のあるものは他にありますか? FAQ には次のように記載されています。
光源が照明器具の一部である場合は、モデリング変換も指定する必要がある場合があります。これにより、照明の位置が周囲の器具ジオメトリと同じ場所になります。
これは、ライトをシーンに変換する必要があることを意味すると解釈しました。