Итак, я знаю, что есть несколько вопросов/ответов относительно создания 2D-камеры для XNA, однако люди, похоже, просто счастливы публиковать свой код без объяснения причин. Я ищу больше объяснений того, что я делаю неправильно.
Во-первых, я понимаю весь Мир -> Вид -> Проекция -> Трансформация экрана.
Моя цель состоит в том, чтобы объект камеры находился в центре окна просмотра, и когда положение камеры перемещается вверх, оно коррелирует с перемещением вверх в окне просмотра, а когда оно перемещается вправо, оно коррелирует с перемещением вправо в окне просмотра.
У меня возникли трудности с реализацией этой функции, потому что значение Y области просмотра инвертировано.
//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;
}
Может ли кто-нибудь помочь мне понять, как я могу построить свое преобразование представления для передачи в SpriteBatch, чтобы я достиг того, что ищу.
ИЗМЕНИТЬ
Кажется, что это преобразование работает, но я не уверен, почему. Может кто-нибудь, возможно, сломать это для меня в понимании:
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;
Раньше я создавал трассировщик лучей, поэтому я должен понять ваше понимание, мое замешательство связано с тем фактом, что он 2D и что SpriteBatch скрывает от меня то, что он делает. Спасибо! Фарид
1f
в своей шкале, а не-1f
? - person ChrisF   schedule 19.08.2011