Хорошо, ребята, я потратил добрые две недели, пытаясь понять это. Я попробовал некоторые из моих собственных способов решить это одной только математикой и не имел успеха. Я также посмотрел везде и видел, как люди рекомендуют 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, а просто превращает спрайты в вид масштабирования или движения. Еще раз спасибо:)