2012-04-18 10 views
1

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

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); 
    } 
} 
+0

「滑らかではない」とは何ですか?問題をより詳しく説明できますか? –

+0

FPSが不足しているようですが、実際にはフレームレートは60になります。glutKeyboardFuncで直接アクションを実行するとbool型の配列を使用しないと同様の効果が得られます – user1052836

答えて

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文は、特定の角度への移動を制限します。

+0

カーソルを保持する必要があります私はfpsカメラを実装していたので画面の真ん中にいました。さらに、あなたのソリューションの利点は何か分かりません。 – user1052836

1

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

垂直同期がオンになっていますが、正しいですか?あなたがマウスを動かすと、引き裂きを犠牲にして動きがスムーズになりますか?

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; 
} 

これはexponential decayの機能です。マウスの位置に使用するものを設定するために、すべてのフレームを呼び出します。そのトリックはspringinessの正しい値を得ています。ペダンシーであるために、springinessは、実際のマウス位置と使用される位置との間の距離が半分になる回数です。マウスの動きをスムーズにするには、springinessの値はおそらく50-100です。

time_dは、最後のマウスポーリング以降の間隔です。可能であればリアルタイムデルタ(小数点以下の秒数)を渡しますが、それをそのまま渡すだけで逃げることができます。1.0/fps

WebGL対応のブラウザをお持ちの場合は、hereのライブバージョンが表示されます。GLDraggableというクラスがviewer.jsにあります。

+0

はい。 vsyncをオフにしても、滑らかさには影響しません。私のコードでは、 "遅れ"を追加すると次のようになります:int deltaX =(x - centerX)* d、int deltaY =(y - centerY)* dそして動きは少しスムーズです – user1052836

関連する問題