2016-09-26 18 views
-2

最近私はいくつかのOpenGLプログラミングを行っており、変換、回転、スケーリングなどの基本的なマトリックス変換を行います。私は回転をするときにいくつかの問題に遭遇する。ここに私の質問です。OpenGL定回転角度

ここでは、変数rotationDegreeと変数rotationStepSizeを使用して回転を制御しています。回転フラグが

//inside paintGL function 
if(rotationFlag is on) 
    rotationDegree += rotationStepSize 
    if(rotationDegree > 360.0f) 
     rotationDegree -= 360.0f 

上にあるとき、私はrotationStepSizeは非常に小さくなるように定義しているのでここでは、回転が非常に遅いから始まり、奇妙なことだが、その後の時間として、それはより速く、より速くなる増加!

私は、この現象のために2つの説明を思い付く:

  • 360Fは、GLMの学位パラメータの値の範囲ではありません::プログラムはpaintGLがペイントさせる、遅いスタートする
  • を回転させますスクリーンを少なくする。その後、プログラムが安定する(または他のパラメータが変更されていない)とき、mainLoopEventはより速くより速く実行され、paintGLがより多く描画されます。

誰もこの問題を解決する方法を知っていますか?私はグッと(GL_TIME_ELAPSED)を使用してgoogled、しかし、私のマシン上で、この関数は "glutget:不足しているENUMハンドル"、私のglutファイルが完全ではないことを示して、私は推測する?

誰もが列挙型の問題を解決する方法を知っていますか、または一定の速度で回転するオブジェクトを持つシーンを作成するためにこれを回避する方法はありますか?

ありがとうございます!

+0

ちょうど賭けていますが、 'glLoadIdentity'または任意の他のマトリックスリセットメソッドを使用しますか?そうでない場合は、すでに回転している行列を回転させています。これは、ステップの増分がスピードであることを意味します。 – Spektre

+0

申し訳ありませんが質問の詳細ではっきりしていませんでした。私はプログラム可能なパイプラインを実現する新しいOpenGLを使用しています。オブジェクトを原点に戻すたびに、rotationDegreeで指定された度合いで回転し、オブジェクトを元の位置に戻します。これらはすべて1つの行列の中に入れられ、次にこのmodelToWorld行列を頂点シェーダに渡します。 –

+0

ポイントは、各フレームの前に行列がユニット(または定義された初期状態)であるかどうかをチェックします。 – Spektre

答えて

1

freeglut_state.cによれば、glutGet機能が定義されている。

int FGAPIENTRY glutGet(GLenum eWhat) 
{ 
#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE 
    int returnValue ; 
    GLboolean boolValue ; 
#endif 

    switch (eWhat) 
    { 
     case GLUT_INIT_STATE: 
     return fgState.Initialised; 

     case GLUT_ELAPSED_TIME: 
     return fgElapsedTime(); 
    } 

私は多分あなたはGLUT_ELAPSED_TIME代わりのGL_TIME_ELAPSEDを試してみてください、freeglutを使用しますが、docmentationを見ていませんよ?

そして、このようdeltatimeを計算する:

int preTime= 0; 
while(...) 
{ 
    int currentTime= glutGet(GLUT_ELAPSED_TIME); 
    int deltaTime = currentTime- preTime; 
    preTime = currentTime; 

    //... pass the deltaTime to whatever you want... 
}