2010-12-06 5 views
1

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の照明に影響する可能性のあるものはありますか?よくある質問には言及:

あなたの光源が 照明器具の一部である場合、あなたはまた、モデリング変換を指定 する必要があるかもしれませんので、 光位置は、周囲の治具の形状と同じ場所 です。

私はあなたが、シーンに光を変換するために誰でも思いつきそうのようなものを必要とするだろうことを意味するためにこれを取った...しかし、それは何か他のものを意味するのでしょうか?

+0

これは本当に奇妙になっています。 glPushMatrix()を使用して、アイデンティティ変換の下でライトの位置を0,0,0に設定すると、ライトも回転します。 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glLightfv(GL_LIGHT0、GL_POSITION、Vector4D(0,0,0,1)); glPopMatrix(); –

+0

私はオブジェクトをレンダリングするときに何か間違っていると確信しています。最後のステップはオブジェクトにローカル回転を与えることですが、この回転もライトに適用されるようです。私の最初の考えは、新しいローテーションでライトポジションを増やすことでしたが、私はそれを間違っているか、助けにはならないのです... –

+0

ライトが回転しているとどう思いますか?その位置にGL_POINTを描画し、(混乱を避けるために)glDrawArraysをコメントアウトしてみてください。 cameraMatrixが修正されても、ポイントは動いていますか? – UncleZeiv

答えて

1

これはしばらく前ですが、私は最終的に問題を突き止めました。問題I と思った私が持っていたのは、光の位置が間違って翻訳されたということでした。これを写真:ライトは0,0,0に位置していましたが、私はメッシュを平行移動して回転させました。これが当てはまる場合は、他の回答に示唆されているようにして、glLightfvコールを適切な場所に置いていることを確認しなければなりません。

実際の問題は、はるかに単純でありながらもはるかに狡猾であることが判明しました。私はglNormalPointerを正しく設定していなかったので、ガベージデータが送られていました。デバッグ中に、法線を正しくレンダリングするようにレンダリングしますが、そうする際に計算した位置に基づいて手動で描画します。将来のデバッガへの推奨事項:デバッグ情報の通常の光線を描画するときは、OpenGLが取得するデバッグ関数/同じデータを入力するようにしてください。私の場合、これは通常の線描画関数のglVertexPointerをモデルのglNormalPointerと同じ場所に向けることを意味します。

0

基本的に、OpenGLライトは頂点のように動作します。あなたのコードではcameraMatrixに変換され、メッシュはcameraMatrix * matrixに変換されます。今度はcameraMatrixmatrixの両方にmrot.QuatToMatrix()が含まれているように見えます。つまり、そこに回転行列が1つあり、オブジェクトが回転している間にライトが1回転します。あなたの実際のコードが異なる場合を除き、それは私には見えません。各メッシュに使用するmRot行列はそれ自身でなければなりません。 mRot[meshIndex]

glLightfv(GL_LIGHT0, GL_POSITION,(GLfloat*) &lp); 

は&(アドレス演算子)を削除します。

+0

ああ、申し訳ありませんが、mRotはモデル(またはカメラ)単位の変数です。しかし、そうでない場合でも、あなたはそれが光を回転させると言っていますか?私は光がglLightfv()呼び出しの時にmodelview変換によって掛け合わされるということを理解していました...それは間違っていますか? –

+0

MVマトリクスが乗算されるライトについては、まさに正しいです - それは目の座標に転送され、格納されます。 – ltjax

+0

あなたのコードの中に*光が回転しているmRot行列があります。それはcameraMatrix計算の中にあります...どのように光に影響を及ぼしませんか?とにかくあなたの最新のコメントを見ましたが、別の問題があることがわかりました。 – UncleZeiv

1

それはマイナーかもしれませんが、この行に。 lpは既にあなたに配列アドレスを与えます。

+0

固定、ありがとう...残念ながら問題はまだそこにありますが、このような小さな事をキャッチするのは良いです:) –