title: XNA 4.0: 2D Camera Y and X are going in wrong direction
body: <p>So I know there are a few questions/answers regarding building a 2D Camera for XNA however people seem to just be happy posting their code without explanation.
  I'm looking for more of an explanation of what I'm doing wrong.</p>
  
  <p>First off, I understand the whole World -> View - > Projection - > Screen transformation.</p>
  
  <p>My goal is to have a camera object that is centered in the center of the viewport and that when the camera's position moves up it correlates to moving up in the viewport and when it moves to the right it correlates moving right in the viewport.</p>
  
  <p>I'm having difficulty implementing that functionality because the Y value of the viewport is inverted.</p>
  
  <pre><code>//In Camera Class
  private void UpdateViewTransform()
  {
  //My thinking here was that I would create a projection matrix to center the camera and then flip the Y axis appropriately
       Matrix proj = Matrix.CreateTranslation(new Vector3(_viewport.Width * 0.5f, _viewport.Height * 0.5f, 0)) * 
                     Matrix.CreateScale(new Vector3(1f, -1f, 1f));
  
  //Here is the camera Matrix. I have to give the Inverse of this matrix to the Spritebatch I believe since I want to go from World Coordinates to Camera Coordinates
       _viewMatrix = Matrix.CreateRotationZ(_rotation) *
                    Matrix.CreateScale(new Vector3(_zoom, _zoom, 1.0f)) *
                    Matrix.CreateTranslation(_position.X, _position.Y, 0.0f);
  
       _viewMatrix = proj * _viewMatrix;
  
  }
  </code></pre>
  
  <p>Can someone help me understand how I can build my view transformation to pass into the SpriteBatch so that I achieve what I'm looking for.</p>
  
  <p><strong>EDIT</strong></p>
  
  <p>This as a transformation seems to work however I am unsure why. Can someone perhaps break it down for me in understanding:</p>
  
  <pre><code>Matrix proj = Matrix.CreateTranslation(new Vector3(_viewport.Width * 0.5f, _viewport.Height * 0.5f, 0));
      _viewMatrix = Matrix.CreateRotationZ(_rotation) *
                   Matrix.CreateScale(new Vector3(_zoom, _zoom, 1.0f)) *
                   Matrix.CreateTranslation(-1 * _position.X, _position.Y, 0.0f);
  
      _viewMatrix = proj * _viewMatrix;
  </code></pre>
  
  <p>I've built a raytracer before so I should understand your understanding, my confusion lies with the fact it's 2D and that SpriteBatch is hiding what it's doing from me.
  Thanks!
  Farid</p>