如何在2D游戏中计算SCREEN到WORLD位置

我有这个课,我用它在我的2D游戏中绘制精灵:

using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Audio; namespace Namespace { ///  /// Found this brilliant code at. /// http://adambruenderman.wordpress.com/2011/04/05/create-a-2d-camera-in-xna-gs-4-0/ ///  public class CCamera2d { private const float zoomUpperLimit = 1.3f; private const float zoomLowerLimit = .85f; private float _zoom; private Matrix _transform; private Vector2 _pos; private float _rotation; private int _viewportWidth; private int _viewportHeight; private int _worldWidth; private int _worldHeight; public CCamera2d(Viewport viewport, int worldWidth, int worldHeight, float initialZoom = zoomLowerLimit) { _zoom = initialZoom; _rotation = 0.0f; _pos = Vector2.Zero; _viewportWidth = viewport.Width; _viewportHeight = viewport.Height; _worldWidth = worldWidth; _worldHeight = worldHeight; } #region Properties public float Zoom { get { return _zoom; } set { _zoom = value; if (_zoom  zoomUpperLimit) _zoom = zoomUpperLimit; } } public float Rotation { get { return _rotation; } set { _rotation = value; } } public void Move(Vector2 amount) { _pos += amount; } public Vector2 Pos { get { return _pos; } set { float leftBarrier = (float)_viewportWidth * .5f / _zoom; float rightBarrier = _worldWidth - (float)_viewportWidth * .5f / _zoom; float topBarrier = _worldHeight - (float)_viewportHeight * .5f / _zoom; float bottomBarrier = (float)_viewportHeight * .5f / _zoom; _pos = value; if (_pos.X  rightBarrier) _pos.X = rightBarrier; if (_pos.Y > topBarrier) _pos.Y = topBarrier; if (_pos.Y < bottomBarrier) _pos.Y = bottomBarrier; } } #endregion public Matrix GetTransformation() { _transform = Matrix.CreateTranslation(new Vector3(-_pos.X, -_pos.Y, 0)) * Matrix.CreateRotationZ(Rotation) * Matrix.CreateScale(new Vector3(Zoom, Zoom, 1)) * Matrix.CreateTranslation(new Vector3(_viewportWidth * 0.5f, _viewportHeight * 0.5f, 0)); return _transform; } } } 

现在,我无法理解如何将屏幕(鼠标)位置取消投影到世界位置。 拥有这样的函数会很棒:

 Vector2 ScreenToWorld(Vector2 onScreen, Matrix CameraTransformation) 

对于WorldToScreen我使用(工作正常)function:

 public Vector2 WorldToScreen(Vector2 inWorld) { return Vector2.Transform(inWorld, Camera.CurrentTransformation); } 

倒矩阵:

  public Vector2 ScreenToWorld(Vector2 onScreen) { var matrix = Matrix.Invert(World.Camera.CurrentTransformation); return Vector2.Transform(onScreen, matrix); }