1

カメラ用のマウス機能を作成しました。それはうまくいきます。しかし、唯一の問題は最初にあります。最初にマウスで移動すると、左上にジャンプし、それからうまく機能します。なぜそれが起こるのか分かりません。

ここでマウス機能。

float lastx = 0.0;
float lasty = 0.0;

void mouseMovement(int x, int y) 
{
    lastx = (float)x - lastx;
    lasty = (float)y - lasty;

    if((float)x > lastx)
        Camera.RotateY((-lastx)*0.01);
    else
        Camera.RotateY(lastx*0.01);
    if((float)y > lasty)
        Camera.RotateX(lasty*0.01);
    else 
        Camera.RotateX(-lasty*0.01); 
    lastx = (float)x;
    lasty = (float)y;
    Display();
}
4

2 に答える 2

1

データの受け入れを開始する前に、カーソルを画面の中央に移動します。そして、lastxlastyが正しく初期化されていることを確認してください。

私はそれがFPPカメラであると90%確信しており、カーソルを画面の中央に手動で移動します。そのため、ウィンドウの右下隅から開始して移動し、デルタとして報告されます。また、とが最初の読み取り時に初期化され、その前にガベージが含まれているという事実もlastxあります。lasty

于 2013-02-19T12:24:52.187 に答える
1

私が推測しているように、すべてのマウスの動きを追跡している場合は、マウスがウィンドウに出入りするときにキャッチするか、特定の量を超えるジャンプを破棄する必要があります。

マウスがウィンドウの右端を離れ、ウィンドウの左端に再び入るとしましょう。あなたが示したコードはジャンプします。

そうしない理由がない限り、最後の変数を静的にし、これに似たifステートメントを追加します(テストされていません:))...

void mouseMovement(int x, int y) 
{
    static float lastx = 0.0;
    static float lasty = 0.0;

    lastx = (float)x - lastx;
    lasty = (float)y - lasty;

    if((abs((int)lastx)>10)||(abs((int)lasty)>10)
    {
        lastx = (float)x;
        lasty = (float)y;
        return;
    }

   //the rest remains the same

ロジックは進みます...最後に見たイベントの近くにない、見たイベントはすべて、変数をリセットして別のイベントを待ちます。

これは実際にはマウスコントロールの洗練されたソリューションではありませんが、コーディングのこの時点ではおそらく理解でき、必要なことを実行できます。

于 2013-02-19T13:13:00.053 に答える