Я пишу 2D гру, в якій у моєму ігровому світі є вісь x, що працює зліва направо, y вісь працює зверху вниз, а вісь z виходить із екрана:
Поки мій ігровий світ зверху вниз, гра відображається з невеликим нахилом:
Я працюю над проектом зі світового простору в простір екрану, і навпаки. У мене колишній працює наступним чином:
var viewport = new Viewport(0, 0, this.ScreenWidth, this.ScreenHeight);
var screenPoint = viewport.Project(worldPoint.NegateY(), this.ProjectionMatrix, this.ViewMatrix, this.WorldMatrix);
Метод NegateY()
розширення робить саме те, що звучить, оскільки вісь y XNA проходить знизу вгору, а не зверху вниз. На знімку екрана показано, що це все працює. В основному, я маю купу точок у тривимірному просторі, які потім виводжу в просторі екрану. Я можу змінювати властивості камери в режимі реального часу і бачити, як вона оживляє нову позицію. Очевидно, що моя реальна гра використовуватиме спрайти, а не очки, і положення камери буде виправлене, але я просто намагаюся отримати всю математику на місці, перш ніж дістатися до цього.
Зараз я намагаюся перетворити назад іншим способом. Тобто, задавши точку x і y у просторі екрану вище, визначте відповідну точку у світовому просторі. Отже, якщо я вказую курсор на, скажімо, ліворуч від зеленої трапеції, я хочу отримати прочитання світового простору (0, 480). Координата z не має значення. Або, скоріше, координата z завжди буде нульовою при відображенні назад у світовий простір. По суті, я хочу реалізувати цей метод підпису:
public Vector2 ScreenPointToWorld(Vector2 point)
Я спробував декілька речей, щоб зробити це робочим, але мені просто не пощастило. Моє останнє мислення полягає в тому, що мені потрібно зателефонувати Viewport.Unproject
двічі з різними значеннями близького / далекого z , обчислити отримане Ray
, нормалізувати його, а потім обчислити перетину Ray
з а, Plane
що в основному представляє рівень мого світу. Однак я застряг на останньому кроці і не був впевнений, чи надмірно ускладнюю речі.
Чи може хтось вказати мені в правильному напрямку щодо того, як цього досягти?