2013-01-17 35 views
1

我一直試圖在這兩個樣本來自大衛阿馬多爾結合獲取鼠標座標:從2D照相機和與分辨率無關

http://www.david-amador.com/2010/03/xna-2d-independent-resolution-rendering/

http://www.david-amador.com/2009/10/xna-camera-2d-with-zoom-and-rotation/

一切工作正常,除了我有一些難以獲得鼠標座標。我能夠爲每個單獨的樣本獲得它們,但是考慮到兩者的數學似乎是錯誤的。

如果我的虛擬分辨率和正常分辨率相同,那麼鼠標座標是正確的。當我移動相機時,當座標緩慢不同步時,我會執行類似Resolution.SetVirtualResolution(1920,1080) 和Resolution.SetResolution(1280,720,false)的操作。

下面是代碼:

public static Vector2 MousePositionCamera(Camera camera) 
    { 
     float MouseWorldX = (Mouse.GetState().X - Resolution.VirtualWidth * 0.5f + (camera.position.X) * (float)Math.Pow(camera.Zoom, 1))/
      (float)Math.Pow(camera.Zoom, 1); 

     float MouseWorldY = ((Mouse.GetState().Y - Resolution.VirtualHeight * 0.5f + (camera.position.Y) * (float)Math.Pow(camera.Zoom, 1)))/
     (float)Math.Pow(camera.Zoom, 1); 

     Vector2 mousePosition = new Vector2(MouseWorldX, MouseWorldY); 
     Vector2 virtualViewport = new Vector2(Resolution.VirtualViewportX, Resolution.VirtualViewportY); 
     mousePosition = Vector2.Transform(mousePosition - virtualViewport, Matrix.Invert(Resolution.getTransformationMatrix())); 

     return mousePosition;  
    } 

在分辨率添加此:

virtualViewportX = (_Device.PreferredBackBufferWidth/2) - (width/2); 
virtualViewportY = (_Device.PreferredBackBufferHeight/2) - (height/2); 

其他的都是一樣的示例代碼。提前致謝!

回答

2

感謝David Gouveia我能夠發現問題......我的相機矩陣使用了錯誤的數學。

我打算髮布我的所有代碼,希望能幫助正在嘗試做類似事情的人。

相機變換矩陣:

 public Matrix GetTransformMatrix() 
     { 
      transform = Matrix.CreateTranslation(new Vector3(-position.X, -position.Y, 0)) * Matrix.CreateRotationZ(rotation) * 
         Matrix.CreateScale(new Vector3(Zoom, Zoom, 1)) * Matrix.CreateTranslation(new Vector3(Resolution.VirtualWidth 
          * 0.5f, Resolution.VirtualHeight * 0.5f, 0)); 

      return transform; 
     } 

這也將圍繞相機。這裏是你如何讓鼠標座標結合兩種分辨率類和相機類:

public static Vector2 MousePositionCamera(Camera camera) 
    { 
     Vector2 mousePosition; 
     mousePosition.X = Mouse.GetState().X; 
     mousePosition.Y = Mouse.GetState().Y; 

     //Adjust for resolutions like 800 x 600 that are letter boxed on the Y: 
     mousePosition.Y -= Resolution.VirtualViewportY; 

     Vector2 screenPosition = Vector2.Transform(mousePosition, Matrix.Invert(Resolution.getTransformationMatrix())); 
     Vector2 worldPosition = Vector2.Transform(screenPosition, Matrix.Invert(camera.GetTransformMatrix())); 

     return worldPosition;  
    } 

與所有其他代碼我張貼的組合/提及這應該是所有你需要達到的分辨率獨立性和真棒相機!