Skocz do zawartości
Mateusz Nejman

[XNA] Konwersja współrzędnych do rzutu izometrycznego

Rekomendowane odpowiedzi

Witajcie wszyscy! Mam problem z którym nie mogę sobie poradzić od kilku dni. Rysuję sobie mapę takim kodem:

Rectangle destinationRectangle =
                 new Rectangle(0, 0, 128, 64);
             for (int y = 0; y < map.MapDimensions.Y; y++)
             {
                 for (int x = 0; x < map.MapDimensions.X; x++)
                 {
                     int poprawkaX = x * v1 - y * v2 + TileOffset;
                     int poprawkaY = x * v3 + y * v4;
                     destinationRectangle.X =
                         (int)mapOriginPosition.X + poprawkaX;
                     destinationRectangle.Y =
                         (int)mapOriginPosition.Y + poprawkaY;

                     if (CheckVisibility(destinationRectangle))
                     {
                         Point mapPosition = new Point(x, y);
                         if (drawBase)
                         {
                             Rectangle sourceRectangle = new Rectangle(64*(map.BaseLayerMulti[x,y]-(int)(Math.Floor((double)(map.BaseLayerMulti[x,y]/10))*10)),(64* (int)(Math.Floor((double)(map.BaseLayerMulti[x, y] / 10)))) +32,64,32);
                             spriteBatch.Draw(map.Texture, destinationRectangle,
                                     sourceRectangle, Color.White);
                         }
                     }
                 }
             }

 

I problem mam z przekonwertowaniem współrzędnych(destinationRectangle) do mapy w rzucie izometrycznym(0;0, 1;2...)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
Witajcie wszyscy! Mam problem z którym nie mogę sobie poradzić od kilku dni. Rysuję sobie mapę takim kodem:

...

 

I problem mam z przekonwertowaniem współrzędnych(destinationRectangle) do mapy w rzucie izometrycznym(0;0, 1;2...)

 

Tak, hmm... taa...

Genialne. Idziesz dobrą drogą...

I zapewne za chwilę wymyślisz obracanie tego rzutu w ośmiu kierunkach...

A tak, i dodasz do niego wysokości kafelków :)

Być może w odwrotnej kolejności...

 

Taaa...

 

I gdzieś tam wyjdzie Ci zasłanianie jednych przez drugie, a po obróceniu...

 

 

Gdzieś w demach wrzuciłem robociki w labiryncie robione kilka lat temu.

Kod rzutowania wygląda identycznie tylko trochę się upasł. Nawet ma identyczne wartości liczbowe.

 

Jak bardzo potrzebujesz to Ci przyślę cały projekt sobie przejrzysz gdzie dojdziesz.

 

 

Sama koncepcja zrobienia tego co robisz jest chybiona w założeniach. Rzut izometryczny nie jest konwersją przestrzeni płaskiej, rzut izometryczny jest płaski i jedynie dla naszych oczu daje pozór tego czym nie jest. Musisz mapę od razu przygotować jako rzut izometryczny, a skalować fizykę, nie odwrotnie gdyż...

 

...gdyż rowiązanie odwrotne to po prostu zestaw funkcji upakowanych w d3d które robią to co chcesz dobrze, a nawet lepiej w przypadku izometrii dla rzutu ortogonalnego po wybranym kątem (1,1,1);

 

Oczywiście jeśli chcesz zmarnować kilka tygodni na łażenie ścieżką, którą każdy uparcie próbuje iść :)

Ale może zacznij od przeczytania tego jak działa transformacja macierzy świata, na macierz rzutu (world matrix, camera matrix, view matrix), są tam wszystkie składniki których szukasz już upakowane w funkcje.

 

 

Koncepcja jednakże bardzo prawidłowa rozwojowo, tylko prowadząca na ścianę.

 

 

 

To co napisałeś to część części szczególnego przypadku rozpisania tej macierzy.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się tutaj.

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×