Sto scrivendo un gioco 2D in cui il mio mondo di gioco ha l' asse x da sinistra a destra, l' asse y dall'alto verso il basso e l' asse z fuori dallo schermo:
Mentre il mio mondo di gioco è top-down, il gioco è reso con una leggera inclinazione:
Sto lavorando alla proiezione dallo spazio del mondo allo spazio dello schermo e viceversa. Ho il primo a lavorare come segue:
var viewport = new Viewport(0, 0, this.ScreenWidth, this.ScreenHeight);
var screenPoint = viewport.Project(worldPoint.NegateY(), this.ProjectionMatrix, this.ViewMatrix, this.WorldMatrix);
Il NegateY()
metodo di estensione fa esattamente quello che sembra, poiché l' asse y di XNA scorre dal basso verso l'alto invece che dall'alto verso il basso. Lo screenshot sopra mostra che tutto funziona. Fondamentalmente, ho un sacco di punti nello spazio 3D che poi rendering nello spazio dello schermo. Posso modificare le proprietà della telecamera in tempo reale e vederlo animare nella nuova posizione. Ovviamente il mio gioco reale utilizzerà gli sprite anziché i punti e la posizione della telecamera sarà fissata, ma sto solo cercando di mettere a posto tutta la matematica prima di arrivare a quello.
Ora sto provando a riconvertirmi dall'altra parte. Cioè, dato un x ed y punto nello spazio schermata sopra, determinare il punto corrispondente nello spazio globale. Quindi, se punto il cursore, diciamo, in basso a sinistra del trapezio verde, voglio ottenere una lettura dello spazio mondiale di (0, 480). La coordinata z è irrilevante. O meglio, la coordinata z sarà sempre zero quando si esegue il mapping allo spazio mondiale. In sostanza, voglio implementare questa firma del metodo:
public Vector2 ScreenPointToWorld(Vector2 point)
Ho provato diverse cose per farlo funzionare, ma non ho avuto fortuna. Il mio ultimo pensiero è che ho bisogno di chiamare Viewport.Unproject
due volte con valori z vicini / lontani diversi , calcolare il risultante Ray
, normalizzarlo, quindi calcolare l'intersezione di Ray
con un Plane
che rappresenta fondamentalmente il livello del suolo del mio mondo. Tuttavia, mi sono bloccato sull'ultimo passo e non ero sicuro di complicare troppo le cose.
Qualcuno può indicarmi la giusta direzione su come raggiungere questo obiettivo?