2012-05-07 21 views
4

カメラを更新しようとすると問題が発生します。OpenGLカメラ - SetCursorPos(x、y);を使用しているときにスナップバックすることなくカメラを移動します。

カメラのピッチとヨーをマウスで変えたいのですが しかし、私はマウスをウィンドウの中央に置いておきたいと思います。

//where MouseP.x .y is the mouse position 
//(which is centered to the current window) 

//get old position of the mouse 
OldP.x = MouseP.x; 
OldP.y = MouseP.y; 

//work out the distance traveled 
Delta.x = MouseP.x - OldP.x; 
Delta.y = MouseP.y - OldP.y; 

//update the camera(using distance traveled) 
Rot.Yaw -=Delta.x/5; 
Rot.Pitch -= Delta.y/5; 

//move mouse to the center of the screen 
SetCursorPos(CENTER_SCREEN_X,CENTER_SCREEN_Y); 

問題は、マウスが原点に戻るように設定されているため、カメラが特定のポイントにスナップバックすることです。

カメラを原点から移動した距離で更新したいが、原点までの距離は更新しない。

私がそれを取り除くと、うまくいきますが、マウスが窓から出ることができます。

答えて

1

あなたのコードブロックはおそらくWM_MOUSEMOVEイベントのキャッチの内側にあると思います。あなたがSetCursorPosを呼び出すと

は、それ自体が別のWM_MOUSEMOVEイベントを生成するので、あなたがマウスを移動すると、再びあなたがSetCursorPosを呼び出すと、それはこれの逆を行うときには、かつてのコードブロックを処理します。

(すべてのSetCursorPosは別のものを生成)あなたはおそらくWM_MOUSEMOVEイベントキャッチの内側SetCursorPosを入れたくない、または他のあなたは、メッセージの無限ループを発生させるでしょう。

おそらく、このコードをメッセージポンプの外に移動して、更新ループでフレームごとに1回だけ実行することができます。現在のマウス位置を照会し、カメラを変換してからカーソルを元に戻します。

+0

Ah sorrryあなたが言ったように、すべてのフレームと呼ばれるWM_MOUSEMOVEイベントには言及していませんでした。私は別の場所でそれを試してみましたが、問題は機能内にあるようです。 –

+0

それをスレッドに流し込み、ミューテックスまたはセマフォを送信元に戻ったときにのみ更新するように通知することは可能ですか? –

0
if(g_States::Instance().MouseLook()) 
{ 
    //Test the mouse input 
    POINT mousePos; 
    GetCursorPos(&mousePos); 

    mouseX = mousePos.x; //g_InputEngine::Instance().GetX(); 
    mouseY = mousePos.y; //g_InputEngine::Instance().GetY(); 

    mouseX = mouseX - m_HalfWidth; 
    mouseY = mouseY - m_HalfHeight; 

    mouseFloat = mouseX * C_MOUSESMOOTHINGFACTOR; 
    g_Scene::Instance().GetCamera()->RotateYaw(-mouseFloat); 

    mouseFloat = mouseY * C_MOUSESMOOTHINGFACTOR; 
    g_Scene::Instance().GetCamera()->RotatePitch(mouseFloat); 

    //Reset mouse to center on the screen 
    SetCursorPos(m_HalfWidth,m_HalfHeight); 
} 

これは、私はしばらくは戻って私がやったことの代わりにGetCursorPos(&mousePos);を使用するように変更しました楽しみのために開発されたspacegameプロトタイプのマウスルック機能です。これにより、入力コードがマウスカーソルの位置を更新しても、カーソルの現在位置が取得されます。関数の残りの部分は、感度と実際にカメラを回転させるためだけのものです。うまくいけば、このコードはあなたの仕事を少し助けてくれるでしょう。

さらに詳しい説明が必要な場合は教えてください。

編集:私はこれをした理由を思い出した。私はWM_MOUSEMOVEを使用して入力エンジンを更新していたので、画面が動いてちらついていたので、入力エンジンがSetCursorPos()コールで更新されるためでした。私はあなたの入力をどのように取得するのか分かりませんが、これはまだあなたを助けるはずです。

2

カーソルと3Dマウスの動きには注意が必要です。人々はそれが関連していると考える傾向がありますが、実際はそうではありません。 msdnの記事を読む: http://msdn.microsoft.com/en-us/library/windows/desktop/ee418864%28v=vs.85%29.aspx "高精細マウスの動きを利用する" これは、3Dアプリケーションでマウス入力を取得する方法です。 カーソルを非表示にする必要があります。

マウスを動かすとカーソルが中央から逃げようとしているが、目に見えない春にはその場所に保持されている場合、それはあまりプロフェッショナルではありません。マウスカーソルが表示される前にアプリケーションのスケジュールが設定されていないため、これに対抗することはできません。

関連する問題