XNA 2D конвертирует мировую позицию в позицию на экране - PullRequest
0 голосов
/ 23 декабря 2011

Хорошо, ребята, я потратил добрые две недели, пытаясь понять это. Я попробовал некоторые из моих собственных способов решить это одной только математикой и не имел успеха. Я также посмотрел везде и видел, как люди рекомендуют Viewport.Project().

Это не так просто. Везде, где я смотрел, включая области MSDN и все форумы, просто предлагал использовать его, но, как я пытаюсь его использовать, они не объясняют матрицу и значения, которые требуются для работы. Я не нашел никакой полезной информации о том, как правильно использовать этот метод, и это серьезно сводит меня с ума. Пожалуйста, помогите этому бедному парню.

Первое, что я собираюсь сделать, это опубликовать мой текущий код. У меня есть пять или около того разных версий, ни одна из них не работала. Самым близким, что я получил, было получение NAN, которое я не понимаю. Я пытаюсь, чтобы текст отображался на моем экране в зависимости от того, где находятся астероиды, и если они очень далеко, текст будет служить ориентиром, чтобы игроки могли переходить к астероидам.

Vector3 camLookAt = Vector3.Zero;
Vector3 up = new Vector3(0.0f, 0.0f, 0.0f);

float nearClip = 1000.0f;
float farClip = 100000.0f;
float viewAngle = MathHelper.ToRadians(90f);
float aspectRatio = (float)viewPort.Width / (float)viewPort.Height;

Matrix view = Matrix.CreateLookAt(new Vector3(0, 0, 0), camLookAt, up);
Matrix projection = Matrix.CreatePerspectiveFieldOfView(viewAngle, aspectRatio, nearClip, farClip);

Matrix world = Matrix.CreateTranslation(camPosition.X, camPosition.Y, 0);

Vector3 projectedPosition = graphicsDevice.Viewport.Project(new Vector3(worldPosition.X, worldPosition.Y, 0), projection, view, Matrix.Identity);

screenPosition.X = projectedPosition.X;
screenPosition.Y = projectedPosition.Y;


if (screenPosition.X > 400) screenPosition.X = 400;
if (screenPosition.X < 100) screenPosition.X = 100;
if (screenPosition.Y > 400) screenPosition.Y = 400;
if (screenPosition.Y < 100) screenPosition.Y = 100;
return screenPosition;  

Насколько я знаю, Project - это позиция камеры. Моя игра 2D, поэтому vector3 раздражает. Я подумал, что, возможно, моим Z может быть CameraZoom, проекция может быть объектом, который мы хотим преобразовать в 2D-экран, view может быть размером, который может видеть камера, и последним, который я вижу. Точно сказать не могу.

После примерно 2 недель поиска информации без каких-либо возможных улучшений в коде или знаниях и в замешательстве, когда я смотрю учебные пособия по MDSN, я решил опубликовать вопрос, потому что я очень близок к тому, чтобы просто не реализовывать преобразование мировых позиций. на экран позиции. Спасибо за помощь, спасибо:)

Кроме того, я использую 2D-игру, и это добавляет путаницу, когда в большинстве случаев люди говорят об оси Z, когда 2D-игра не имеет оси Z, а просто превращает спрайты в вид масштабирования или движения. Еще раз спасибо:)

1 Ответ

0 голосов
/ 24 декабря 2011

Возможно, я здесь неправильно понимаю, но я не думаю, что вам нужно использовать 3D-камеру с XNA для 2D-игры.Если вы не пытаетесь создать 2.5D-игру с использованием 3D для какой-либо системы параллакса или чего-то еще, вам вообще не нужно это использовать.Взгляните на это:

Реализация 2D-камеры в XNA

Упрощенная 2D-камера

XNA 2D-уроки

2D в XNA работает иначе, чем 3D.Вам не нужно беспокоиться о 3D-окне, 3D-камере или чем-либо еще.Нет сближения или сближения.2D хорошо обрабатывается в XNA, и я думаю, вы немного не понимаете, как работает XNA.

PS: Вам не нужно использовать Vector3s.Вместо этого используйте Vector2s.Я думаю, вы найдете их намного проще в 2D игре.^^

...