2009-05-26 17 views
7

Robię zasłonę za symulacją 3d podczas renderowania świata w moim izometrycznym silniku 2d. Nigdy wcześniej nie robiłem silnika izometrycznego, a moja macierzowa matematyka jest ogólnie zardzewiała, więc mam problemy.Unprojecting na ekranie wskazuje na izometrycznie rzutowany świat

mam macierz projekcji, która w swej najprostszej postaci jest to:

0.7  0.35  0 
0  -0.87  0 
-0.71  0.35  1 

Kilka znaków są odwrócone, ponieważ moje silniki układu współrzędnych 0,0 w lewym górnym rogu, a + x do prawo/wschód i + Z na południu.

Teraz odwrotność czyli:

1.4080 0.5670 0.0000 
0.0000 -1.1490 0.0000 
1.0000 0.8050 1.0000 

Teraz te macierze głównie praca.

Przykładowo

WC: 500,0,500 = ekranu: -1,44, 350, 500 (X i Y są poprawne)

WC: 0,0,500 = ekranu: -355, 175, 500 (X i Y znów są poprawne)

Ale teraz, jeśli chcesz przejść w drugą stronę, nie masz już tej przydatnej wartości Z, więc

ekranu: -1,44, 350, 0 = WC: -2, -402,97, 0 (. Więc, śmieci)

i wiele więcej - tak szybko, jak ja nie mają już tej wartości oo Nie mogę odzyskać światowych współrzędnych z ekranów.

Co to jest obejście?

EDIT

muszę podkreślić, że punktem unproject jest uzyskanie ray do podnoszenia myszki ..

Wydaje się, że to tylko moje błędne przekonanie o tym, co robiłem, który został wkręcania mnie tutaj.

+0

Wszelkie wzmianki o tym, jak się tu dostałeś, byłyby bardzo pomocne! Próbuję wymyślić coś podobnego - symulację 3D za kurtyną podczas renderowania 2D. –

+0

Udało mi się to rozgryźć - wewnątrz XNA można łatwo tworzyć te macierze za pomocą funkcji Matrix.CreateOrthographic, itp. –

Odpowiedz

8

Jak odkryłeś, twoja konwersja z powrotem do przestrzeni 3D wymaga jakiejś współrzędnej Z, aby w ogóle mieć jakikolwiek sens.

Proponuję dwukrotne przekształcenie .Raz z współrzędną Z w pobliżu ekranu (najbliżej obserwatora) i raz z współrzędną Z w tylnej części sceny 3D. Te dwa punkty 3D dałyby linię 3D, która zajmowałaby wszystkie pozycje "za" tym punktem 2D.

2

Nie możesz. wyświetlasz się na ekranie, który traci informacje.

Jeśli o tym pomyślisz, kilka współrzędnych 3D zostanie wyświetlonych w tym samym punkcie na ekranie, a po prostu wiedząc, że współrzędne ekranu nie wystarczą, aby pobrać oryginalną współrzędną.

[edytuj] patrząc na współrzędne ekranu, podajesz im całą wartość z0, co oznacza, że ​​ostatnie kolumny macierzy projekcji powinny mieć wszystkie zera, czyniąc tę ​​macierz nieodwracalną.

2

Każdy piksel na ekranie reprezentuje linię od oka patrzącego do wyobrażonego świata 3D za ekranem. Trzeba przeciąć tę linię z przedmiotami, które mogą czaić się w tym świecie, aby uzyskać współrzędne 3D.