2012-06-16 51 views
0

我使用opengl並嘗試創建第一人稱相機。所有的例子都使用GLUT,我需要在可可中獲得鼠標差異。但是我遇到了一些問題,只要鼠標移動(這是可以預料的),就會調用mouseMoved。有沒有辦法讓這個mroe準確?或者像GLUTS glutMouseFunc這樣的simialer函數?如何使用Cocoa改變鼠標位置差異?

當前的嘗試:

-(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; 
     } 

} 
+0

你可以分享你的完整代碼... –

回答

1

我不知道我跟着你的代碼是應該做的,但反覆扭曲的鼠標光標移動到一箇中心點是很少做正確的事。

首先,您可以使用NSEventdeltaXdeltaY的值。

也許你想要做CGAssociateMouseAndMouseCursorPosition(false)來解開鼠標與光標位置的關聯。當你這樣做時,屏幕上的光標不再隨鼠標移動。你可以隱藏它或重新定位它(是的,在這種情況下你會扭曲一次)。而且,事件的絕對位置不再有變化。但它們仍然帶有反映鼠標移動的增量移動值。

+0

真棒,完美的作品。我很好奇,你可能不知道,但你能向我解釋這段代碼的trig部分是如何工作的嗎?它用於確定你應該如何改變你的lookat矢量,這取決於你改變光標位置的方式。我瞭解基本觸發,只是不清楚這是完成了什麼。 – OccamsRazor

+0

不確定。自從我開始觸發已經很長時間了。它看起來像「角度」在極座標中,它正在被轉換成笛卡爾座標。它與此處顯示的相似但不完全如此:https://en.wikipedia.org/wiki/List_of_common_coordinate_transformations#From_spherical_coordinates –