2011-07-23 56 views
2

編輯2: 我想出了大部分問題,但我有一個煩惱。當光標到達屏幕的邊緣並被拉到另一側時,相機會反轉,這將不起作用。有人可以看到如何可以停止?SFML 3D MouseLook

bool attention = true; 
    Vector2 p, mousePos; 
    private float MOUSE_SENSITIVITY = 4.0f; 

    private void OnMouseMove(object sender, MouseMoveEventArgs e) 
    { 
     float DeltX = 0, DeltY = 0; 
     int border = 2; 
     Console.WriteLine(attention + ""); 

     if (attention == true) 
     { 
      p.X = e.X; 
      p.Y = e.Y; 

      DeltX = (float)(mousePos.X - e.X)/MOUSE_SENSITIVITY; 
      DeltY = (float)(mousePos.Y - e.Y)/MOUSE_SENSITIVITY; 
     } 
     else 
     { 
      mousePos = p; 
     } 

     attention = true; 

     if (e.X > App.Width - border) 
     { 
      attention = false; 
      App.SetCursorPosition((uint)border, (uint)e.Y); 
      DeltX = 0; 
      DeltY = 0; 

     } 
     else if (e.X < border) 
     { 
      attention = false; 
      App.SetCursorPosition((uint)(App.Width - border), (uint)e.Y); 
      DeltX = 0; 
      DeltY = 0; 

     } 

     if (e.Y > App.Height - border) 
     { 
      attention = false; 
      App.SetCursorPosition((uint)e.X, (uint)border); 
      DeltX = 0; 
      DeltY = 0; 

     } 
     else if (e.Y < border) 
     { 
      attention = false; 
      App.SetCursorPosition((uint)e.X, (uint)(App.Height - border)); 
      DeltX = 0; 
      DeltY = 0; 

     } 



     Cam.RotateY(DeltX); 
     Cam.RotateX(DeltY); 


     mousePos = p; 

    } 

回答

0

我還在起牀加速自己,所以請帶上一粒鹽。 (我正在嘗試!)

我認爲你的鼠標移動是以像素爲單位測量的&這意味着相機的完整旋轉。通過除以0.4(MOUSE_MOVEMENT),您正在影響「0.4完整旋轉」的一些倍數(例如152像素/0.04=380轉,讓您面臨與您開始時相同的方向。)

試試除以256而不是0.4 &看看它是否工作得更好。

+0

這是一個好主意,但我已經想通了,我只是用一個代碼環繞位,所以當鼠標變得接近它被設置回另一側的邊緣,它似乎工作得很好。 – Elec0

+0

我在發佈這篇文章後意識到,我正在考慮一箇舊引擎(從90年代開始)的工作方式。我忘了OpenGL使用它的旋轉度。 – Jackalope

+0

必須有一種方法可以在低於屏幕座標的水平上輪詢鼠標,難道你不這麼認爲嗎?如果是這樣,不管光標是否在屏幕的邊緣,您是否可以檢查鼠標*移動*? – Jackalope

0

通常,您將鼠標位置設置爲每個窗口的窗口中心。以前你讀到鼠標位置並減去窗口的中心。這樣,您可以輕鬆地獲得每一幀的鼠標移動,而無需擔心窗口邊界。

Vector2i center(window->getSize().x/2, window->getSize().y/2); 
Vector2i delta = Mouse::getPosition(*window) - center; 
Mouse::setPosition(center, *window);