J'écris un jeu 2D où mon monde de jeu a un axe x de gauche à droite, un axe y de haut en bas et un axe z hors de l'écran:
Alors que mon univers de jeu est descendant, le jeu est rendu sur une légère inclinaison:
Je travaille sur la projection de l'espace mondial vers l'espace écran, et vice-versa. J'ai l'ancien travaillant comme suit:
var viewport = new Viewport(0, 0, this.ScreenWidth, this.ScreenHeight);
var screenPoint = viewport.Project(worldPoint.NegateY(), this.ProjectionMatrix, this.ViewMatrix, this.WorldMatrix);
La NegateY()
méthode d'extension fait exactement ce que cela ressemble, puisque l' axe y de XNA s'étend de bas en haut au lieu de haut en bas. La capture d'écran ci-dessus montre que tout cela fonctionne. Fondamentalement, j'ai un tas de points dans l'espace 3D que je rend ensuite dans l'espace d'écran. Je peux modifier les propriétés de la caméra en temps réel et la voir s'animer à la nouvelle position. Évidemment, mon jeu réel utilisera des sprites plutôt que des points et la position de la caméra sera fixe, mais j'essaie simplement de mettre tous les calculs en place avant d'en arriver là.
Maintenant, j'essaye de me reconvertir dans l'autre sens. Autrement dit, étant donné un point x et y dans l'espace d'écran ci-dessus, déterminez le point correspondant dans l'espace mondial. Donc, si je pointe le curseur vers, disons, en bas à gauche du trapèze vert, je veux obtenir une lecture de l'espace mondial de (0, 480). La coordonnée z n'est pas pertinente. Ou plutôt, la coordonnée z sera toujours nulle lors du mappage vers l'espace mondial. Essentiellement, je veux implémenter cette signature de méthode:
public Vector2 ScreenPointToWorld(Vector2 point)
J'ai essayé plusieurs choses pour que cela fonctionne, mais je n'ai tout simplement pas de chance. Ma dernière pensée est que je dois appeler Viewport.Unproject
deux fois avec des valeurs z proches / lointaines différentes , calculer la résultante Ray
, la normaliser, puis calculer l'intersection de la Ray
avec une Plane
qui représente essentiellement le niveau du sol de mon monde. Cependant, je suis resté coincé dans la dernière étape et je ne savais pas si je compliquais trop les choses.
Quelqu'un peut-il m'indiquer dans la bonne direction comment y parvenir?