Projeção XNA ViewPort e SpriteBatch

Estou trabalhando em um jogo XNA e estou usando o ViewPort.Project e o ViewPort.Unproject para traduzir de e para as coordenadas do mundo. Atualmente, eu os uso para cada objeto que eu desenho com SpriteBatch. O que eu gostaria de fazer é calcular uma Matrix que eu possa enviar para o SpriteBatch.Begin para fazer a transformação do espaço da tela para mim.

Aqui estão as funções que atualmente uso para traduzir de e para o espaço na tela:

        Vector2 ToWorldCoordinates(Vector2 pixels)
    {
        Vector3 worldPosition = graphics.GraphicsDevice.Viewport.Unproject(new Vector3(pixels, 0),
                Projection, View, Matrix.Identity);
        return new Vector2(worldPosition.X, worldPosition.Y);
    }

    Vector2 ToScreenCoordinates(Vector2 worldCoords)
    {
        var screenPositon = graphics.GraphicsDevice.Viewport.Project(new Vector3(worldCoords, 0),
                Projection, View, Matrix.Identity);
        return new Vector2(screenPositon.X, screenPositon.Y);
    }

View está definido como Matrix.Identity e Projection está definido da seguinte forma:

Projection = Matrix.CreateOrthographic(40 * graphics.GraphicsDevice.Viewport.AspectRatio, 40, 0, 1);

E aqui está como atualmente desenho coisas:

            spriteBatch.Begin();
        foreach (var thing in thingsToDraw)
        {
            spriteBatch.Draw(thing.Texture, ToScreenCoordinates(thing.PositionInWorldCoordinates), thing.Color);
            spriteBatch.End();
        }
        spriteBatch.End();

É isso que eu gostaria de fazer (usando a versão XNA 4.0 do SpriteBatch.Begin ())

            // how do I calculate this matrix?
        Matrix myTransformationMatrix = GetMyTransformationMatrix();

        spriteBatch.Begin(SpriteSortMode.Immediate, null, null, null, null, null,
            myTransformationMatrix);

        foreach (var thing in thingsToDraw)
        {
            // note: no longer converting each object's position to screen coordinates
            spriteBatch.Draw(thing.Texture, thing.PositionInWorldCoord,inates, thing.Color);
            spriteBatch.End();
        }
        spriteBatch.End();

questionAnswers(1)

yourAnswerToTheQuestion