1

マウスを使用して fps カメラを回転させると、アニメーションが滑らかになりません。キーボードを使用すると、すべてがうまく機能します。キーボードの場合、bool 型の配列を使用してキーをバッファリングします。マウスを使用するときにアニメーションをスムーズにするにはどうすればよいですか?

void MousePassiveMotion(int x, int y)
{
     int centerX = glutGet(GLUT_WINDOW_WIDTH) / 2;
     int centerY = glutGet(GLUT_WINDOW_HEIGHT) / 2;

     int deltaX =  x - centerX;
     int deltaY =  y - centerY;

     if(deltaX != 0 || deltaY != 0) 
     {
          heading = deltaX * 0.2f;
          pitch = deltaY  * 0.2f;
          glutWarpPointer(centerX, centerY);
     }
}
4

2 に答える 2

2

マウスのポーリング レートと画面のリフレッシュ レートの比率が適切でない場合、マウスの位置に基づいて表示を更新すると、ぎくしゃくした効果が生じることがあります。

垂直同期がオンになっていますよね?そして、引き裂く代わりにマウスの動きがスムーズになるとしたら?

1つのオプションは、マウス位置に使用する値を実際のマウス位置のほんの少し後ろに「遅らせる」平滑化関数を使用することです

その要旨は次のようになります。

float use_x,use_y;      // position to use for displaying
float springiness = 50; // tweak to taste.

void smooth_mouse(float time_d,float realx,float realy) {
    double d = 1-exp(log(0.5)*springiness*time_d);

    use_x += (realx-use_x)*d;
    use_y += (realy-use_y)*d;
}

これは指数減衰関数です。マウスの位置に何を使用するかを確立するために、フレームごとに呼び出します。トリックは、 の正しい値を取得することですspringiness。分かりやすく言うと、springinessマウスの実際の位置と使用されている位置の間の距離が半分になる回数です。マウスの動きをスムーズにするには、 の適切な値springinessはおそらく 50 ~ 100 です。

time_d最後のマウス ポーリングからの間隔です。可能であれば、リアルタイム デルタ (小数秒単位) を渡しますが、渡すだけで済み1.0/fpsます。

WebGL 対応のブラウザーをお持ちの場合は、ここGLDraggableでライブ バージョンを確認できます。で呼び出されるクラスを探してくださいviewer.js

于 2012-04-19T13:12:47.013 に答える
0

画面の中心点ではなく、マウスの最後の位置でカメラ角度が計算される代わりに、このようなものを使用する必要があります。

void mouseMove( int x, int y )
{
   theta += (lastx-x) / 100.0;
   phi += (lasty-y) / 50.0;
   lastx = x;
   lasty = y;

   if ( phi >= M_PI )
      phi = M_PI - 0.001;
   else if ( phi <= 0 )
      phi = 0.001;
}

ここで、100.0 と 50.0 は移動の速度 (感度) に影響を与える要因であり、if / else ステートメントは移動を特定の角度に制限します。

于 2012-04-18T22:43:35.553 に答える