Czy istnieje krótka odpowiedź na temat tego, jak zrobić efekt typu Kart 7 / Mario Kart w grze pygame?
Poszukałem obszernie, wszystkie dokumenty, które mogę wymyślić, to dziesiątki stron w innych językach (asm, c) z wieloma dziwnie wyglądającymi równaniami i tym podobne.
Idealnie chciałbym znaleźć coś wyjaśnionego bardziej w języku angielskim niż w kategoriach matematycznych.
Mogę używać PIL lub pygame do manipulowania obrazem / teksturą lub cokolwiek innego, co jest konieczne.
Naprawdę chciałbym osiągnąć efekt trybu 7 w grze pygame, ale wydaje mi się, że jestem bliski końca mojego dowcipu. Pomoc byłaby bardzo mile widziana. Wszelkie dostępne zasoby i wyjaśnienia byłyby fantastyczne, nawet jeśli nie są tak proste, jak chciałbym.
Jeśli uda mi się to rozgryźć, napiszę definitywne instrukcje dotyczące trybu 7 dla początkujących.
edycja: mode 7 doc: http://www.coranac.com/tonc/text/mode7.htm
Odpowiedzi:
Tryb 7 to bardzo prosty efekt. Wyświetla teksturę 2D (lub kafelki) 2D na pewnej podłodze / suficie. Stare SNES używają do tego sprzętu, ale współczesne komputery są tak potężne, że możesz to robić w czasie rzeczywistym (i jak już wspomniałeś, nie potrzebujesz ASM).
Podstawowa formuła matematyczna 3D do rzutowania punktu 3D (x, y, z) na punkt 2D (x, y) to:
Kiedy się nad tym zastanowić, ma to sens. Obiekty znajdujące się w dużej odległości są mniejsze niż obiekty w pobliżu. Pomyśl o torach kolejowych zmierzających do nikąd:
Jeśli spojrzymy wstecz na wartości wejściowe formuły:
x
iy
będzie to bieżący piksel, który przetwarzamy, iz
będzie informacja o odległości, jak daleko jest punkt. Aby zrozumieć, coz
powinno być, spójrz na to zdjęcie, pokazujez
wartości dla powyższego obrazu:W tym przykładzie
z
wartość toy - horizon
(zakładając, że(x:0, y:0)
jest na środku ekranu)Jeśli poskładamy wszystko razem, staje się: (pseudokod)
I ostatnia rzecz: jeśli chcesz stworzyć grę Mario Kart, przypuszczam, że chcesz również obrócić mapę. Cóż, jest to również bardzo łatwe: obracaj
sx
isy
zanim uzyskasz wartość tekstury. Oto wzór:a jeśli chcesz przejść przez mapę, po prostu dodaj przesunięcie, zanim uzyskasz wartość tekstury:
UWAGA: przetestowałem algorytm (prawie kopiuj-wklej) i działa. Oto przykład: http://glslsandbox.com/e#26532.3 (wymaga najnowszej przeglądarki i włączonej WebGL)
UWAGA 2: używam prostej matematyki, ponieważ powiedziałeś, że chcesz czegoś prostego (i nie wydaje się, że znasz matematykę wektorową). Możesz osiągnąć te same rzeczy, używając formuły wikipedia lub samouczków, które dajesz. Sposób, w jaki to zrobili, jest znacznie bardziej złożony, ale masz znacznie więcej możliwości konfiguracji efektu (w końcu działa tak samo ...).
Aby uzyskać więcej informacji, sugeruję przeczytanie: http://en.wikipedia.org/wiki/3D_projection#Perspective_projection
źródło
Oto kod, aby to zrobić. Jestem tym samym kodem samouczka, który napisałem na moim blogu . Sprawdź tam, aby poznać metodę Mode 7 i RayCasting.
Zasadniczo pseudo kod to:
Oto kod, który wykonałem w JAVA, postępując zgodnie z moim samouczkiem.
Wynik to:
źródło