Piszę gra 2D, gdzie jest mój świat gry został x osi przebiegającej lewej do prawej, y osi biegnącej od góry do dołu i z osi z ekranu:
Podczas gdy mój świat gier jest odgórny, gra jest renderowana z lekkim przechyleniem:
Pracuję nad projektowaniem z przestrzeni świata na przestrzeń ekranu i odwrotnie. Mam ten pierwszy działający w następujący sposób:
var viewport = new Viewport(0, 0, this.ScreenWidth, this.ScreenHeight);
var screenPoint = viewport.Project(worldPoint.NegateY(), this.ProjectionMatrix, this.ViewMatrix, this.WorldMatrix);
Metoda NegateY()
rozszerzenia działa dokładnie tak, jak to brzmi, ponieważ oś y XNA przebiega od dołu do góry zamiast od góry do dołu. Powyższy zrzut ekranu pokazuje, że wszystko działa. Zasadniczo mam kilka punktów w przestrzeni 3D, które następnie renderuję w przestrzeni ekranu. Mogę modyfikować właściwości kamery w czasie rzeczywistym i zobaczyć, jak animuje się w nowej pozycji. Oczywiście moja rzeczywista gra będzie wykorzystywała duszki zamiast punktów, a pozycja kamery zostanie ustalona, ale ja po prostu próbuję ustawić całą matematykę na miejscu, zanim do tego dojdę.
Teraz staram się przekonwertować w drugą stronę. To znaczy, biorąc pod uwagę x i y punkt na powierzchni ekranu powyżej, określenie odpowiedniego punktu w przestrzeni światowej. Więc jeśli wskażę kursor, powiedzmy, lewy dolny lewy zielony trapezoid, chcę uzyskać odczyt przestrzeni świata (0, 480). Z współrzędnych znaczenia. Lub raczej współrzędna z będzie zawsze równa zero podczas odwzorowywania z powrotem do przestrzeni świata. Zasadniczo chcę zaimplementować tę sygnaturę metody:
public Vector2 ScreenPointToWorld(Vector2 point)
Próbowałem kilku rzeczy, aby to zadziałało, ale po prostu nie mam szczęścia. Moje ostatnie zdanie jest takie, że muszę zadzwonićViewport.Unproject
dwa razy z różnymi blisko / daleko Z wartości, obliczyć wypadkową Ray
, normalizują, a potem obliczyć przecięcia Ray
z Plane
który zasadniczo reprezentuje przyziemnej mojego świata. Jednak utknąłem na ostatnim etapie i nie byłem pewien, czy nadmiernie komplikuję sprawy.
Czy ktoś może wskazać mi właściwy kierunek, w jaki sposób to osiągnąć?