Zastanawiałem się nad opublikowaniem w usłudze Stack Overflow, ale pytanie wydaje mi się zbyt subiektywne, ponieważ nie mogę wymyślić rozsądnego technicznego wyjaśnienia wyboru Microsoftu w tej sprawie. Ale to pytanie mnie tak długo denerwowało, a problem pojawia się w jednym z moich projektów i nigdy nie widziałem próby wyjaśnienia tego:
OpenGL wykorzystuje prawy układ współrzędnych, w którym część + Z światowego układu współrzędnych rozciąga się w kierunku widza.
DirectX używa systemu dla leworęcznych, w którym część + Z współrzędnej świata rozciąga się na ekran z dala od widza.
Nigdy nie korzystałem z Glide API , więc nie wiem, jak to działało, ale z tego, co mogę zebrać, używa również systemu dla leworęcznych.
Czy jest tego techniczny powód? A jeśli nie, to czy istnieje jakaś przewaga koncepcyjna nad konkretnym stosunkiem układu współrzędnych? Dlaczego jeden miałby wybierać jeden nad drugim?
Odpowiedzi:
Wiem, że to stary post, ale widziałem, że do tego wpisu się odwołuje i nie podoba mi się ton wybranej odpowiedzi.
Więc zrobiłem trochę dochodzenia!
Na tej podstawie mogę spekulować na temat kilku rzeczy:
Dlatego moim wnioskiem byłoby:
Kiedy musieli dokonać wyboru, nie znali standardu, wybrali „inny” system, a wszyscy inni wybrali się na przejażdżkę. Nie podejrzany biznes, tylko niefortunna decyzja projektowa, która została podjęta, ponieważ wsteczna kompatybilność to nazwa gry Microsoftu.
źródło
Dziwię się, że nikt o tym nie wspominał: OpenGL działa również w układzie współrzędnych dla leworęcznych. Przynajmniej działa, gdy pracujesz z modułami cieniującymi i używasz domyślnego zakresu głębokości.
Po wyrzuceniu potoku o stałej funkcji masz do czynienia bezpośrednio z „klip-space”. Specyfikacja OpenGL definiuje przestrzeń klipu jako jednorodny układ współrzędnych 4D. Gdy śledzisz transformacje za pomocą znormalizowanych współrzędnych urządzenia i do obszaru okna, znajdziesz to.
Przestrzeń okna znajduje się w przestrzeni pikseli okna. Początek znajduje się w lewym dolnym rogu, z + Y w górę i + X w prawo. To brzmi jak prawy układ współrzędnych. Ale co z Z?
Domyślny zakres głębokości (glDepthRange) ustawia wartość bliskiego Z na 0, a wartość dalekiej Z na jeden . Więc + Z odchodzi od widza.
To leworęczny układ współrzędnych. Tak, możesz zmienić test głębokości z GL_LESS na GL_GREATER i zmienić glDepthRange z [0, 1] na [1, 0]. Ale domyślnym stanem OpenGL jest praca w układzie współrzędnych leworęcznych . Żadna z transformacji potrzebnych do przejścia do przestrzeni okna z przestrzeni klipu nie neguje Z. Tak więc przestrzeń klipu, wyjście modułu cieniującego wierzchołków (lub geometrii) jest przestrzenią dla leworęcznych (trochę. Jest to przestrzeń jednorodna 4D, więc trudno jest określić jego przydatność).
W potoku o stałej funkcji standardowe macierze projekcji (produkowane przez glOrtho, glFrustum i tym podobne) przekształcają się z przestrzeni dla osób praworęcznych w miejsca dla osób leworęcznych . Odrzucają znaczenie Z; po prostu sprawdź generowane macierze. W przestrzeni oka + Z przesuwa się w stronę widza; w przestrzeni po projekcji odsuwa się.
Podejrzewam, że Microsoft (i GLide) po prostu nie zadał sobie trudu, aby wykonać negację w swoich matrycach projekcyjnych.
źródło
To czysta historia. W dawnych czasach programiści zajmujący się grafiką jaskiniową uważali, że monitor (teletyp? Typ kamieni?) Patrzy na powierzchnię jako dwuwymiarowy papier milimetrowy. W matematyce i inżynierii typowe konwencje rysowania punktów danych na papierze milimetrowym to: x = prawo, y = góra. Aż pewnego dnia, około tygodnia po wynalezieniu silikonowego koła, ktoś pomyślał o grafice 3D. Gdy świeca tego pomysłu migała nad ich głową, z jakiegokolwiek powodu, wybierają Z = z dala od widza. (Ojej, moja prawa ręka boli, wyobrażając sobie to.)
Nie mieli pojęcia, że kiedyś ich dalsi potomkowie staną się inżynierami, naukowcami, artystami, artystami komercyjnymi, animatorami, projektantami produktów itp. I uznają grafikę 3D za przydatną. Wszyscy ci wspaniali współcześni ludzie używają prawostronnych układów współrzędnych, aby być ze sobą spójnymi oraz bardziej ugruntowanymi tekstami matematycznymi i konwencjami fizyki.
Głupio jest opierać układ współrzędnych 3D na powierzchni wyświetlacza. Liczy się model - trójkąty, wielokąty i płaszczyzny opisujące dom, krzesło, nadwagę zielonego ogru lub galaktyki. Obecnie wszyscy projektujemy i modelujemy rzeczy w praworęcznych systemach XYZ i robimy to w kategoriach świata modelu, nawet zanim zastanowimy się, jak to będzie renderowane. W pewnym momencie kamera została dodana, być może stworzona do latania w szalony sposób, a jej niewidoczna infrastruktura przekształca model w piksele, które w jego wnętrznościach muszą drgać ze skoordynowanymi transformacjami systemowymi.
Żeby dodać zamieszanie, niektóre biblioteki graficzne rozpoznają, że CRT skanują obraz od góry do dołu, więc Y = dół. Jest to stosowane nawet dzisiaj we wszystkich systemach okienkowych i menedżerach okien - X11, fvwm, gtk +, Win31 API itp. Jak radzą sobie nowe systemy 3D GUI, takie jak Clutter, Beryl itp., Z Z, to osobna kwestia od modelowania grafiki 3D. Ta potrzeba dotyczy tylko programistów aplikacji i projektantów GUI.
źródło
Oba są zasadniczo równoważne, ponieważ jedno można łatwo przekształcić w drugie. Jedyną zaletą, jaką mogę znaleźć dla systemu leworęcznego, jest to, że ponieważ obiekty znajdują się dalej od obserwatora, w dowolnym kierunku (x, y lub z), odległość jest wyższa. Ale nie mam pojęcia, czy właśnie dlatego Microsoft wybrał jedną z nich.
POV-Ray wykorzystuje również leworęczny system korytarza.
źródło
Wiodący deweloper DirectX (Direct3D) i Alex Jana niedawno skomentował tego. W artykule na temat historii Direct3D napisał:
Źródło: http://www.alexstjohn.com/WP/2013/07/22/the-evolution-of-direct3d/
źródło
Należy zrozumieć, że ogromna ilość czasu programisty została zmarnowana na konwersję między układami współrzędnych leworęcznych i praworęcznych, a jeszcze więcej czasu programisty zmarnowano na zapamiętywanie, który system był potrzebny w danym momencie.
Wszystko to minęło, gdy prawe układy współrzędnych stały się standardem branżowym.
Istnieje już dość powszechnie używanych układów współrzędnych, bez podwojenia liczby poprzez wprowadzenie pytania praktycznego. Patrz Minkler i Minkler, „Układy i transformacje współrzędnych kosmicznych” . Jeśli zajmujesz się koordynacją lotniczą i kosmiczną, np. Wykonując symulacje lotów, POTRZEBUJESZ tej książki.
Domyślam się, że Microsoft nie miał ŻADNEGO z projektu DirectX, który wiedziałby cokolwiek o standardach branżowych, nie zdawał sobie sprawy z tego, że istniał standard branżowy i uznał, że to nie ma znaczenia.
Inna możliwość, że wiedzieli, że systemy praworęczne są standardem branżowym i celowo stworzyli DirectX dla osób leworęcznych, aby utrudniać konwersję kodu używającego DirectX zamiast OpenGL, nie jest brana pod uwagę. Gdybym odkrył, że tak rzeczywiście jest, uważam za konieczne podjęcie nowej i prawdopodobnie krótkotrwałej kariery jako mordercy z siekierą w Redmond.
źródło
Wszystkim, którzy myślą, że nie ma korzyści dla prawo- i leworęcznych, całkowicie się mylisz. Prawidłowość kartezjańskich układów współrzędnych wynika z definicji iloczynu wektorowego. Dla XYZ wektorów bazowych
u
,v
iw
,w = u X v
.Ta definicja ma podstawowe znaczenie dla matematyki wektorowej, rachunku wektorowego i znacznej części fizyki. Załóżmy, że próbujesz symulować interakcje elektromagnetyczne. Masz wektor pola magnetycznego
M
i naładowaną cząstkę poruszającą się w tym polu z prędkościąv
. W którą stronę przyspiesza ładowanie? Łatwe - w kierunkuM X v
. Z wyjątkiem jakiegoś idioty, który pomyślałby, że fajnie byłoby sprawić, by system wyświetlania był leworęczny, więc przyspiesza w kierunku-M X v
.Zasadniczo każda fizyczna interakcja między dwiema wielkościami wektorowymi jest definiowana jako praworęczna, więc za każdym razem, gdy trzeba zasymulować tę interakcję, lepiej mieć nadzieję, że twój system graficzny jest praworęczny, lub będziesz musiał pamiętać, aby ominąć znaki ujemne w cała twoja matematyka.
źródło
0,0,1
1,0,0 X 0,1,0
0,0,1
M X v
ale pole magnetyczneM
uważa się za skierowane w przeciwnym kierunku, ponieważ jest to pseudowektor. Możesz użyć tych samych równań w każdym systemie: jedyną rzeczą, która się zmienia, jest twoja interpretacja tego, w jaki sposób pseudowektory „wskazują”. Odpowiednie wektory, takie jak przyspieszenie, zawsze będą działały tak samo w każdym układzie współrzędnych. en.wikipedia.org/wiki/Pseudovector#The_right-hand_rulePrawdziwa odpowiedź na wczesną lewą rękę Direct3D jest o wiele mniej złowroga niż niektórzy z was spekulują. DirectX zaczął działać, gdy Microsoft kupił RenderMorphics w 1995 roku.
W tym czasie standardowym tekstem graficznym używanym w biurach RenderMorphics były „Zasady interaktywnej grafiki komputerowej” Newmanna i Sproula, który robi wszystko przy użyciu współrzędnych leworęcznych. To ta sama książka, której użyłem na studiach. Patrząc na kod D3D, można nawet zobaczyć je przy użyciu nazw zmiennych, które pasują do równań w książce.
To nie jest jakiś spisek Microsoftu. Decyzja została podjęta jeszcze przed pojawieniem się Microsoft.
źródło
Żadne z tych rozwiązań nie jest ostatecznie lepsze niż inne - odwzorowujesz współrzędne 3D na powierzchnię 2D, więc trzeci wymiar (który faktycznie tworzy rzeczy 3D) można wybrać dowolnie, wskazując na widza lub na ekran. W każdym razie zamierzasz przełożyć matrycę 4x4, więc nie ma technicznego powodu, aby wybierać jedną z nich. Funkcjonalnie można argumentować:
Wniosek : istnieje pewna zgoda co do osi X, ale w przypadku pozostałych dwóch można argumentować w obu kierunkach, uzyskując dwie konfiguracje praworęczne i dwie leworęczne i wszystkie one mają sens.
źródło
Interesujący fakt.
Direct3D (nie DirectX - DirectX obejmuje również wejście, dźwięk itp.) Tak naprawdę nie ma układu współrzędnych dla leworęcznych.
Doskonale obsługuje zarówno systemy RH, jak i LH. Jeśli zajrzysz do dokumentacji SDK, zobaczysz takie funkcje, jak D3DXMatrixPerspectiveFovLH i D3DXMatrixPerspectiveFovRH. Oba działają i oba tworzą macierz projekcji, którą można z powodzeniem stosować w wybranym układzie współrzędnych. Do diabła, możesz nawet użyć major-kolumny w Direct3D, jeśli chcesz; to tylko biblioteka matryc programowych i nie musisz jej używać. Z drugiej strony, jeśli chcesz go używać z OpenGL, przekonasz się, że działa on również doskonale z OpenGL (co może być ostatecznym dowodem niezależności biblioteki macierzy od samego Direct3D).
Więc jeśli chcesz użyć systemu RH w swoim programie, po prostu użyj wersji -RH funkcji. Jeśli chcesz korzystać z systemu LH, użyj wersji -LH. Direct3D nie obchodzi. Podobnie, jeśli chcesz używać systemu LH w OpenGL - po prostu glLoadMatrix i macierz projekcji LH. Żadna z tych rzeczy nie jest ważna i nie jest daleka od ogromnego problemu, który czasem można zobaczyć.
źródło
Nie ma żadnej korzyści technicznej dla żadnej z rąk, jest to całkowicie arbitralne. Oba działają dobrze, o ile jesteś konsekwentny.
Ze względu na zalety spójności najlepiej byłoby po prostu „używać tego, co wszyscy inni używają” - ale w wielu przypadkach jest to dość trudne, ponieważ w praktyce nie ma zbyt „preferowanej” konwencji: obie ręce są szeroko stosowane. W najlepszym przypadku istnieje pewna spójność w niektórych społecznościach (np. OpenGL).
Myślę więc, że podstawową odpowiedzią na to pytanie jest: wybrali to, co wybrali, ponieważ było to właściwe (bez wątpienia mieli pewne wcześniejsze doświadczenia z tą sprawnością) i nie było powodu, aby tego nie robić.
W końcu nie ma to większego znaczenia - każdy, kto poważnie chce wymieniać zasoby / kod z innymi systemami / społecznościami, będzie musiał być przygotowany do poradzenia sobie z konwersją ręczności, ponieważ jest to faktem w grafice 3D.
źródło
Dostarczam to jako materiał uzupełniający do mojej poprzedniej odpowiedzi tutaj. Ze starej specyfikacji OpenGL z lat 90. XX wieku:
(źródło: http://www.opengl.org/documentation/specs/version1.2/opengl1.2.1.pdf ).
A zatem, skoro ani D3D, ani OpenGL nie wymuszają żadnej zręczności, prawdziwe pytanie brzmi: dlaczego ludzie uważają to za coś wielkiego?
źródło
Nienawidzę ci mówić, ale „ręka” zbioru współrzędnych jest w rzeczywistości subiektywna - zależy to od tego, w jaki sposób wyobrażasz sobie, że patrzysz na rzeczy. Przykład ze specyfikacji mapy kostek OpenGL: jeśli wyobrażasz sobie, że jesteś wewnątrz sześcianu, układ współrzędnych jest leworęczny, a jeśli patrzysz na niego z zewnątrz, jest on praworęczny. Ten prosty fakt powoduje niekończący się smutek, ponieważ aby uzyskać poprawną numerycznie odpowiedź, wszystkie twoje założenia muszą być spójne, nawet jeśli lokalnie nie ma znaczenia, jakie przyjmujesz założenie.
Specyfikacja OpenGL jest oficjalnie „neutralna pod względem ręczności” i dokłada wszelkich starań, aby uniknąć tego problemu - to znaczy odłożyć go na programistę. Istnieje jednak „zmiana ręki” między współrzędnymi oka i współrzędnymi klipu: w modelu i przestrzeni oka, na którą patrzymy, w przestrzeni klipu i urządzenia, na którą patrzymy. Zawsze zmagam się z konsekwencjami tej niewątpliwie przypadkowej komplikacji.
Ten produkt krzyżowy jest naszym przyjacielem, ponieważ pozwala wygenerować układ współrzędnych 3D zdecydowanie praworęczny lub leworęczny z pary wektorów. Ale która ręka zależy od tego, który wektor nazywamy „X”.
źródło
Mógłbym powiedzieć, że standard branżowy jest z początku niewłaściwy
Współrzędny standard branżowy faktycznie pochodzi od współrzędnych biurka, gdy ludzie rysują wszystko na biurku, czyli płaszczyźnie poziomej. X jest lewy / prawy, a Y jest przedni / tylny, więc po prostu sprawia, że Z jest skierowany do góry, i to narodził się Układ współrzędnych praworęcznych
Ale wiesz, że teraz używamy z ekranem monitora Jest to płaszczyzna pionowa. X jest nadal w lewo / prawo, ale Y to w górę i w dół zamiast tego
Więc co spowodowałby układ współrzędnych praworęcznych? To sprawia, że + Z jest do tyłu i -Z do przodu Co to do cholery jest? Góra to +, a dół to - Prawo to + a Lewo to - ALE Naprzód to - a Wstecz to + ??? To głupie, jeśli tworzymy grę, która działa w świecie 3D, ale musimy pomniejszyć z, aby iść naprzód. Dlatego programista gier najbardziej docenia DirectX
Chwytanie standardu, który wyszedł z biurka i używanie go na monitorze, jest tak źle na wielu poziomach od samego początku. A teraz powinniśmy przyznać, że oni, OpenGL i przemysł, są w błędzie. Po prostu używają tego, co według nich byłoby dla nich wygodne, ale są w błędzie, a układ współrzędnych dla praworęcznych to tylko śmieciowe dziedzictwo, które należy jak najszybciej wyrzucić
źródło