4

カメラを更新しようとすると問題が発生します。

マウスを使用してカメラ (カメラが見ている場所) のピッチとヨーを変更したいのですが、マウスをウィンドウの中央に配置したままにします。

//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);

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

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

私がそれを取り出すと、それは素晴らしく機能しますが、マウスは窓の外に出ることができます.

4

3 に答える 3

2

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

それを再センタリングしようとすると、ユーザーがマウスを動かしてカーソルが中央から逃げようとしているが、目に見えないバネによって所定の位置に保持されているという恐ろしいジャギー感が作成されます。これはあまり専門的に見えません。アプリケーションはマウスカーソルが表示される前にスケジュールされていないため、これに対抗することはできません。

于 2012-05-15T09:19:53.160 に答える
1

ここでの問題は、コードのブロックがおそらくWM_MOUSEMOVEイベントのキャッチ内にあるということだと思いますか?

を呼び出すとSetCursorPos、それ自体が別のWM_MOUSEMOVEイベントを生成するため、マウスを動かしたときにこのコード ブロックを 1 回処理し、呼び出したときにもう一度処理するとSetCursorPos、これとは逆のことが行われます。

SetCursorPosおそらく、WM_MOUSEMOVE イベント キャッチ内に配置したくないでしょう。そうしないと、メッセージの無限ループが生成されます (毎回SetCursorPos別のメッセージが生成されます)。

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

于 2012-05-07T20:43:39.817 に答える
-1
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);
}

これは、私がしばらく前に楽しみのために開発していた宇宙ゲームのプロトタイプの Mouselook 関数であり、GetCursorPos(&mousePos);代わりに使用するように変更しました。これにより、入力コードがいつマウス カーソルの位置を更新しても、カーソルの現在の位置が取得されます。関数の残りの計算は、感度と実際にカメラを回転させるためのものです。願わくば、このコードがあなたのコードを機能させるのに少しでも役立つことを願っています。

さらに説明が必要な場合はお知らせください。

編集:これを行った理由を思い出しました。画面がちらついたために動きましたが、SetCursorPos()WM_MOUSEMOVEを使用して入力エンジンを更新していたため、呼び出しによって入力エンジンが更新されました。どのように入力を取得したかはわかりませんが、これはまだ役立つはずです。

于 2012-05-08T00:26:39.590 に答える