0

私はopenglを使用していて、一人称カメラを作成しようとしています。すべての例でGLUTを使用しており、ココアでマウスの差分を取得する必要があります。しかし、マウスを動かすとすぐに、mouseMovedが呼び出されるという問題が発生しています(これは予想されることです)。このmroeを正確にする方法はありますか?または、GLUTS glutMouseFuncのような類似の関数ですか?

現在の試み:

-(void)mouseMoved:(NSEvent *)event{
        static bool wrap = false;

        if(!wrap){
            NSPoint eventLocation = [event locationInWindow];

            float centerX = self.frame.size.width/2 + [self window].frame.origin.x;
            float centerY = self.frame.size.height/2 + [self window].frame.origin.y;
            CGPoint mousePointCenter = CGPointMake(centerX, centerY);
            CGWarpMouseCursorPosition(mousePointCenter);

            int dx = eventLocation.x - self.frame.size.width/2 ;
            int dy = eventLocation.y - self.frame.size.height/2 ;

            const float mousespeed = 0.001;

            angles.x += dx * mousespeed;
            angles.y += dy * mousespeed;

            if(angles.x < -M_PI)
              angles.x += M_PI * 2;
            else if(angles.x > M_PI)
              angles.x -= M_PI * 2;

            if(angles.y < -M_PI / 2)
              angles.y = -M_PI / 2;
            if(angles.y > M_PI / 2)
              angles.y = M_PI / 2;

            lookat.x = sinf(angles.x) * cosf(angles.y);
            lookat.y = sinf(angles.y);
            lookat.z = cosf(angles.x) * cosf(angles.y);

           CGWarpMouseCursorPosition(mousePointCenter);

          [self setNeedsDisplay:YES];
        }
        else{
            wrap = true;
        }

}
4

1 に答える 1

1

あなたのコードが何をしているのか私にはわかりませんが、マウスカーソルを中心点に繰り返しワープすることが正しいことになることはめったにありません。

deltaXまず、のとdeltaYの値を使用できますNSEvent

CGAssociateMouseAndMouseCursorPosition(false)おそらく、カーソル位置からマウスの関連付けを解除するために実行したいでしょう。これを行うと、画面上のカーソルがマウスと一緒に移動しなくなります。非表示にすることも、位置を変更することもできます(はい、この場合は1回ワープします)。また、イベントの絶対位置が変更されなくなりました。ただし、マウスの動きを反映したデルタ移動値は保持されます。

于 2012-06-17T00:40:23.953 に答える