Renderowanie izometryczne izometryczne?

23

Szukałem wzoru do kreślenia (świat-> ekran) i wybierania myszy (świat-> ekran) płytek izometrycznych w świecie w kształcie rombu. Te, których próbowałem zawsze wydają się być, cóż, wyłączone. Jak to zwykle / poprawnie to zrobić?

mpnk121
źródło
Dokładna zastosowana metoda i wzór zależy nieco od kształtu twoich kafelków i prawdopodobnie trochę od tego, jak rysujesz mapę (na górze, dole lub jednej z boków mapy jest 0,0) Więcej szczegółów o twoim problemie pomogłoby.
thedaian
1
Płytki mają format 2: 1 (a dokładniej 64x32). Układ współrzędnych nie ma znaczenia, ponieważ piszę edytor. (0,0 u góry lub po lewej wydaje się jednak rozsądne.)
mpnk121
Bardzo późno na pytanie i nawet nie mam pełnej odpowiedzi, ale było bardzo dobre Google Tech Talk na ten precyzyjny temat. Ich konfiguracja obejmuje wybranie nieprzezroczystej części dowolnych obrazów (w javascript, nie mniej). youtube.com/watch?v=_RRnyChxijA
Seth Battin

Odpowiedzi:

21

W oparciu o twój komentarz, oto kod, którego używam do konwersji wartości kafelka x, y na współrzędne ekranu. Teraz nie bierze pod uwagę „kafelków 3D”, wszystko uważa się za znajdujące się na tej samej płaszczyźnie, więc jeśli piszesz grę, w której to ma znaczenie, ten kod nie będzie działać.

//this converts a map x/y coordinate into screen coordinates
//public, static method, so can be called outside the Tile object
point Tile::convertToScreen(int x, int y, int offsetX, int offsetY)
{
        point screen;
        //calculate the screen coordinates
        //note: these will then be modified by the camera
        screen.x = offsetX - (y * TILE_WIDTH/2) + (x * TILE_WIDTH/2) - (TILE_WIDTH/2);
        screen.y = offsetY + (y * TILE_DEPTH/2) + (x * TILE_DEPTH/2);
        return screen;
 }

point jest po prostu strukturą zawierającą x i y ints, TILE_WIDTH to 64 w twoim przypadku, TILE_DEPTH jest trochę źle nazwane (w rzeczywistości jest to wysokość grafiki kafelkowej), ale w twoim przypadku będzie to 32. Przesunięcia mają miejsce, jeśli chcesz, aby mapa kafelków „zaczynała się” w innym miejscu x, y (np. Jeśli chcesz, aby kafelki znajdowały się powyżej innego zestawu kafelków). Zazwyczaj przesunięcie może wynosić 0,0.

Spowoduje to wygenerowanie mapy z 0,0 na górze, w środku, w następujący sposób:

        0,0
    0,1     1,0
0,2     1,1     2,1

Jeśli chodzi o znalezienie kafelka x, y kursora:

point selectedTile;
int x = mX - camera.x;
int y = mY - camera.y;
selectedTile.x = (y + x/2)/TILE_DEPTH;
selectedTile.y = (y - x/2)/TILE_DEPTH;

W tym fragmencie kodu mX i mY to współrzędne ekranu myszy, które łączymy z wartościami kamery, aby dowiedzieć się, gdzie jesteśmy w „współrzędnych świata”. Cała reszta jest taka sama jak w poprzednim przykładzie kodu.

Ponownie zakłada to płaską izometryczną mapę kafelków 2d. Jest trochę dodatkowej pracy, jeśli chcesz użyć widoku mapy 3D w pół-3d, a to wszystko zakłada, że ​​i tak pracujesz w 2D.

thedaian
źródło
1
Dziękuję Ci! - Działa to doskonale w przypadku płaskich map. Czy możesz mi teraz powiedzieć coś więcej o tym, jak mogę dodać płytki o dowolnej wielkości (tj. O głębokości Z), które znajdują się na innej warstwie? (Takich jak rekwizyty jak studnia lub
latarnia uliczna
2
Wtedy używasz wartości offsetY i offsetX. Jeśli latarnia ma rozmiar 64 x 64, to przekazanie ujemnej wartości 32 dla wartości offsetY powinno sprawić, że pojawi się ona we właściwym miejscu. Mam nadzieję, że to wystarczy, aby zacząć.
thedaian
6
Czy współrzędna „2,1” w twoim przykładzie nie powinna być „2,0”?
Chris