Obiekt dwa razy bliżej wydaje się dwa razy większy?

16

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?

Jagoda
źródło
3
Nie mam pojęcia, jaka jest odpowiedź, ale wiem, jak mogłem się dowiedzieć. Zrób kilka zdjęć czegoś. Może kawałek papieru. Weź je z różnych znanych odległości, a następnie zrób matematykę, aby obliczyć, ile zdjęcia zajmuje kawałek papieru i określić przez to stosunek. To może być zabawny eksperyment!
SpartanDonut
Zastanawiam się, dlaczego nikt nie wspominał o logarytmach naturalnych ...
Chad Harrison
4
Dlaczego to nie jest prawda? Myślę, że to prawda.
Ivan Kuckir
@hydroparadise Co logarytmy naturalne mają wspólnego z tym pytaniem?
Nathan Reed
Wiem, że jestem po prostu pedantyczny, ale „Dwa razy bliżej” to dziwne zdanie. Czy nie powinno być „w połowie tak daleko”? „Dwa razy” jest większe, ale jeśli coś się zbliża, odległość maleje.
MrVimes,

Odpowiedzi:

19

Zasadniczo jest to prawdą, w zależności od punktu widzenia i kierunku, w którym się przesunął, a także kąta widzenia.

Przykład perspektyw dla obiektów

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.

Tom „Niebieski” Piddock
źródło
Świetna odpowiedź! Zdjęcia zdecydowanie wyjaśniają. Właściwie czuję się teraz naprawdę głupio, ponieważ próbowałem tego przed opublikowaniem pytania, trzymając dłoń przed twarzą i przybliżając ją. A potem pomyślałem: nie, to nie wydaje się dwa razy większe ... Powinienem był to dokładniej zmierzyć;) Perspektywa to zabawna rzecz! Poza tym Ifeel jakbym był w stanie sam wymyślić zdjęcia;) Ale świetna odpowiedź! Dzięki!
Berry,
@Mason Wheeler - Posortowano: P
Tom 'Blue' Piddock
8

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ć.

sam hocevar
źródło
Świetne referencje! Na pewno sprawdzę twierdzenie Thalesa i postaram się lepiej zrozumieć potok grafiki.
Berry,
7

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.

jhocking
źródło
2

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:

f(d, v) = v/(v+d)
* Where f is the size ratio to the original sprite aka size factor
    and v is the distance to the near clipping plane (trial and error value)
    and d is the distance from the near clipping plane to the object

PRZYKŁAD:

Assuming you have a sprite that is 2.5x1.8 units in size and 10 units away 
   from the camera, and that the near clipping plane is 5 units from the camera.

sizeFactor = 5/(5+10) = 0.3

renderHeight = actualHeight * sizeFactor = 1.8 * 0.3 = 0.54
renderWidth  = actualWidth * sizeFactor = 2.5 * 0.3 = 0.75

Sugerowałbym zacząć od, v=5a 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

The change in height or width should be multiplied by the following factor:

sizeFactor = v/(v+d)

Where v = Some number greater than 0 that never changes (try 1 thru 5)
  and d = the distance from the camera

So an object that is 2.5 units tall would be rendered at 2.5*sizeFactor units tall.

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!

Jim Buck
źródło
Tak, właściwie dążę do widoku ortograficznego. Gra, w której „pożyczam” moją inspirację, to Rayman Origins. W niektórych sekcjach gry możesz wskoczyć na kwiaty, a następnie odbić się na innej warstwie o innej głębokości. Następnie kamera powiększa lub zmniejsza obraz do tej głębokości. Axamples można zobaczyć w tym filmie o 4:50 i 5:00.
Berry,
Ponadto świetna odpowiedź! Ale ponieważ wystarczyłoby tylko potwierdzenie, że obowiązuje zasada „dwa razy bliżej, dwa razy więcej”, wybrałem odpowiedź Blue jako najlepszą.
Berry,
Dziękuję i powodzenia w grze! Ale chcę wyjaśnić innym, że „dwa razy bliżej, dwa razy więcej” zadziała świetnie, jeśli wszystko będzie bardzo blisko aparatu. W miarę oddalania się rzeczy postrzegana zmiana wielkości zmniejsza się. Na przykład spójrz na kciuk z bliska, a następnie wyciągnij rękę i spójrz na nią. Rozmiar kciuka wydaje się znacznie mniejszy. Następnie spójrz na coś daleko. Zrób krok do tyłu (mniej więcej tyle, ile długość ramienia). Zauważ, jak ledwie zmienił się rozmiar? Jeśli gra ma długie pole widzenia, użycie odrobiny matematyki zajmie długą drogę.
Jim Buck
EDYCJA: Popełniłem błąd w poprzednim komentarzu. „Dwa razy bliżej, dwa razy więcej” jest poprawne, gdy przedmioty pozostają dość blisko siebie w stosunku do odległości od aparatu.
Jim Buck
Oto krótkie demo, które przygotowałem, poruszaj myszką, a kółko przewijania zmieniaj głębokość.
Jim Buck
0

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:

Area = X * Y

Po powiększeniu:

NewArea = (x*2) * (y*2)

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:

XTileSize = (255 / CameraZ) * DefaultTileWidth
YTileSize = (255 / CameraZ) * DefaultTileHeight

Pamiętaj, że CameraZmusi to być wartość z przedziału 1-255, a to ograniczenie może być dla ciebie korzyścią lub zmorą w przyszłości.

Mark H.
źródło