Zastanawiałem się więc nad stworzeniem gry 2D, w której można również poruszać się wzdłuż osi Z, zmieniając warstwę. W zależności od głębokości chcę przeskalować moje duszki 2D.
Kiedyś ktoś pokazał mi demo, w którym miał dużo duszek 2d, a przewijając mógł zmienić głębokość kamery. Podczas powiększania obiekty zbliżają się do gracza i wydają się większe. Potem zastanawiałem się, o ile większy powinien być obiekt, gdy zbliży się o 1 jednostkę. Jak byś to obliczył? Facet powiedział mi: stosuję jedną podstawową zasadę: „obiekty dwa razy bliżej, wydają się dwa razy większe”.
Teraz, testując go sam, wiem, że reguła nie ma zastosowania w prawdziwym świecie;) Ale czy jest jakaś stała, która jest używana w obliczeniach rzeczywistego świata dla perspektywy czy coś takiego? Czy formuła?
Wiem, że to może nie być najlepsze miejsce do zadawania takich pytań, ale ponieważ jest to jedyna strona, z której korzystam w przypadku pytań związanych z grami, a mój kontekst to gra, pomyślałem, że spróbuję. Spodziewam się też, że znajdzie się tutaj osoba, która wie wszystko o perspektywach i matrycach 3D, czy coś takiego, ponieważ może to dotyczyć gier 3D;)
tl; dr:
„obiekt dwa razy bliżej, wydaje się dwa razy większy” To nie jest prawda w prawdziwym świecie. Ale która stała lub wzór jest poprawny?
źródło
Odpowiedzi:
Zasadniczo jest to prawdą, w zależności od punktu widzenia i kierunku, w którym się przesunął, a także kąta widzenia.
Zwróć uwagę, jak w pierwszym widoku kamery, ponieważ czerwony blok jest prostopadły do widoku z kamery, obiekt wydaje się dwa razy większy w idealnym stosunku 1: 2 (zwróć uwagę na strzałkę wskazującą, że po przesunięciu uderza w krawędź widoku dwa razy bliżej)
Drugi to blok tego samego rozmiaru obrócony o 45 stopni. Po obróceniu dolna krawędź nie znajduje się już w tej samej odległości od kamery, co górna krawędź, więc SEEM nie skaluje się prawidłowo do stosunku 1: 2, ale w rzeczywistości jest dwa razy większy (niż w ten sam kąt na dalszym niebieskim bloku, tak jak w niebieskim zamkniętym bloku).
Podsumowując, oznacza to, że twój przyjaciel miał rację, a stosunek 1: 1 („obiekty dwa razy bliżej, wydają się dwa razy większe”) dla twoich obiektów to dobry wybór.
źródło
Obiekt dwa razy bliżej wydaje się dwa razy większy. Jest to konsekwencja twierdzenia Thalesa i jest prawdziwa w prawdziwym świecie.
Można argumentować, że Twierdzenie Thalesa jest podstawowym narzędziem matematycznym stojącym za rzutowaniem perspektywicznym i tym, co znane jest w potoku graficznym (OpenGL lub DirectX) jako podział perspektywy . To twierdzenie, które powinieneś zdecydowanie wiedzieć i nauczyć się rozpoznawać, kiedy można go użyć.
źródło
W rzeczywistości jest to w zasadzie prawdą (jeśli przesuniesz obiekt dwa razy dalej, będzie on wyglądał na pół większy), ale przesłania to, jak zmienia się rozmiar wizualny obiektów podczas poruszania się widzów. W szczególności obiekty wydają się powiększać szybciej, im bliżej są. Dzieje się tak, ponieważ widz przebywa o połowę odległość znacznie szybciej, gdy obiekt jest blisko, w porównaniu do tego, gdy obiekt znajduje się dalej. Innymi słowy, gdy prędkość widza jest stała, wartość „połowy odległości” zmienia się wraz ze zmianą odległości do obiektu.
źródło
Ponieważ tak naprawdę nie pracujesz w przestrzeni 3D, możemy założyć, że duszki nigdy się nie obracają (obrót można symulować za pomocą pochylania itp.) To proste ograniczenie bardzo ułatwia uzyskanie dość dokładnych liczb na temat tego, jaki rozmiar powinien być zależny od odległości z kamery.
Najpierw musisz zrozumieć, w jaki sposób renderowane są obiekty 3D. Mimo że kamera zbiega się w jednym punkcie, istnieje niewidoczna płaszczyzna, która działa jak ekran do rysowania obiektów. Jedyne, co musisz wiedzieć o ekranie, to odległość od aparatu.
Oto schemat renderowania obiektu w kamerze z dwóch różnych odległości.
Jak można się spodziewać, wysokość obiektu zależy od odległości od kamery. ALE ponieważ renderowanie odbywa się na prawie płaszczyźnie uboju, musimy obliczyć wysokość duszka w tym punkcie.
Niektóre podstawowe obliczenia wyzwalaczy doprowadzą cię do następującej formuły:
PRZYKŁAD:
Sugerowałbym zacząć od,
v=5
a następnie dostosować od tego na podstawie tego, jak to wygląda. Mogę rzucić skrzypce, które pozwalają zobaczyć zmiany w czasie rzeczywistym.TL; DR
EDYCJA: Kiedy mówisz poruszaj się wzdłuż osi Z, zakładam, że będziesz potrzebować widoku perspektywicznego (jak większość gier 3D; strzelanki itp.) Matematyka do obliczania wielkości obiektu na podstawie odległości będzie również zależeć od położenia w ramce, podobny do widzenia peryferyjnego. Zamiast tego spróbowałbym tego z matematyki, która jest poglądem ortograficznym (pomyśl Mario, Angry Birds, Super Smash Bros itp.). Nie wiem, jaki wygląd chcesz, ale dopóki wydaje się to prawdziwe, gracze nigdy się nie dowiedzą!
PRÓBNY!
źródło
Nie zostało to uwzględnione i pomyślałem, że może to być korzystne: należy zauważyć, że gdy będziesz w połowie odległości, podwojenie rozmiaru zarówno w wymiarach X, jak i Y zwiększy czterokrotnie całkowitą powierzchnię duszka. To dlatego, że:
Po powiększeniu:
Może to sprawiać wrażenie, że efekt powiększania zachodzi szybko lub jest zbyt intensywny. Możesz dostosować współczynnik, zmieniając 2 w powyższym wzorze na wartość zmiennoprzecinkową, np. 1,5 lub 1,33.
Alternatywnie, to co zrobiłem, to zapisanie głębokości kamery (odległości) do twoich kafelków w wartości bajtowej wraz z translacją kamery (X i Y), a następnie oblicz w ten sposób rzutowany rozmiar kafelka:
Pamiętaj, że
CameraZ
musi to być wartość z przedziału 1-255, a to ograniczenie może być dla ciebie korzyścią lub zmorą w przyszłości.źródło