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

我不确定我是否遵循了您的代码应该做的事情,但是反复将鼠标光标弯曲到中心点很少是正确的做法。

首先,您可以使用 的deltaXdeltaYNSEvent

也许您想CGAssociateMouseAndMouseCursorPosition(false)将鼠标与光标位置分离。当您这样做时,屏幕上的光标不再随鼠标移动。你可以隐藏它或重新定位它(是的,在这种情况下你会扭曲它一次)。此外,事件的绝对位置不再发生变化。但它们仍然带有反映鼠标移动的增量移动值。

于 2012-06-17T00:40:23.953 回答