Dlaczego DirectX używa układu współrzędnych dla leworęcznych?

52

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?

greyfade
źródło
5
To wydaje się pytaniem, dlaczego arabski i hebrajski są pisane od prawej do lewej, podczas gdy każdy inny język jest pisany od lewej do prawej.
Gabe
17
Próbuję tylko zrozumieć, dlaczego istnieje tak rażąca niespójność między graficznymi interfejsami API, które mają solidne podstawy w matematyce. Kierunek alfabetów semickich zdecydowanie nie jest oparty na niezmiennych zasadach.
greyfade
3
To pytanie zostało przywołane w Dlaczego nie zatrudniamy programistów .NET (2011-03-25).
Peter Mortensen
2
Ani OpenGL, ani Direct3D nie są przeznaczone dla osób praworęcznych ani leworęcznych. Wcześniejsze zmiany na lewą rękę w przestrzeni klipu, podczas gdy przestrzeń ekranu późniejszego jest praworęczna, tj. W przestrzeni ekranu D3D obrót od X do Y, patrząc od strony + Z, jest ruchem przeciwnym do ruchu wskazówek zegara. ORAZ oba systemy pozwalają programistom stosować przestrzenie o dowolnej chiralności.
legends2k
1
@PeterMortensen To zabawne, że wszyscy hejterzy .NET nawet nie wiedzą, co to jest. To, do czego prawdopodobnie odnoszą się, to ASP.NET Webforms, platforma. .NET można opisać jako bibliotekę klas podstawowych i CLR.
The Muffin Man

Odpowiedzi:

64

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!

  1. DirectX jest stary . Został wydany po raz pierwszy w 1995 roku, kiedy świat miał znacznie więcej niż Nvidia i ATI , DirectX vs OpenGL. To ponad 15 lat, ludzie.
  2. Glide 3dfx Interactive (jeden z konkurentów DirectX w tamtym czasie. OpenGL nie był wtedy przeznaczony do grania) używał układu współrzędnych dla leworęcznych.
  3. POV-Ray i RenderMan (oprogramowanie do renderowania Pixar) również używają układu współrzędnych dla leworęcznych.
  4. DirectX 9+ może współpracować z oboma układami współrzędnych.
  5. Zarówno WPF, jak i XNA (które działają w scenach z DirectX) używają układu współrzędnych po prawej stronie.

Na tej podstawie mogę spekulować na temat kilku rzeczy:

  • Standardy branżowe nie są tak standardowe jak ludzie.
  • Direct3D został zbudowany w czasie, kiedy wszyscy robili rzeczy po swojemu, a programiści prawdopodobnie nie wiedzieli lepiej.
  • Leworęczność jest opcjonalna, ale zwyczajowa w świecie DirectX.
  • Ponieważ konwencje wymierają ciężko, wszyscy myślą, że DirectX może działać tylko z leworęcznością.
  • Microsoft ostatecznie się nauczył i postępował zgodnie ze standardem we wszystkich nowych interfejsach API, które utworzyli.

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.

Kyte
źródło
11
DirectX jest niemowlakiem w pieluszkowym ubraniu w porównaniu do grafiki komputerowej 3D, a to stosunkowo młode w porównaniu z programami komputerowymi, które muszą zarządzać wieloma układami współrzędnych 3D i przekształcać się między nimi. To było w połowie lat 70., kiedy po raz pierwszy wziąłem udział w grafice, a NAWET NASTĘPNIE instruktor (Frank Crow) bardzo mocno namawiał nas do używania wyłącznie układów współrzędnych dla praworęcznych. W 1983 r. Pracowałem nad pracą, która nie zawierała grafiki, ale trwały transformacje współrzędnych, a obowiązkową zasadą prawej ręki była PIERWSZA notatka projektowa. (I nie wydałem tego!)
John R. Strohm
7
Nie jestem pewien, czy wiek ma z tym coś wspólnego. Czy większość nauk fizycznych nie używa prawidłowego układu współrzędnych i ma wiele, wiele lat więcej niż komputery? Powiedziałbym, że jest to znacznie starsza konwencja niż te, po których następuje Glide, a następnie DX.
Thomas Owens
3
To, że standard stosowany w środowisku akademickim nie oznacza, że ​​będzie taki sam w zastosowaniach przemysłowych / innych. W końcu ludzie podążają za tym, co jest używane w ich własnej dziedzinie. W przeciwnym razie systemy graficzne miałyby swój początek w lewym dolnym rogu ekranu, a nie w lewym górnym rogu. Ponadto kwestia wieku polega na tym, że DX narodził się, gdy cały „rendering 3D dla komputerów stacjonarnych” był wciąż nowy, a „standardy” i „najlepsze praktyki” jeszcze nie zostały w pełni wypracowane.
Kyte
1
a) Nazywasz więc moją odpowiedź, która jest prostą listą faktów, które można udowodnić i którą ja osobiście nazywam własnymi osobistymi spekulacjami, „przesądnymi” i „nieuzasadnionymi w faktach”, gdy twoja własna oferta jest oskarżeniem o niewłaściwe zachowanie firmy bez żadnego cytowania lub wsparcie w ogóle? b) Jeśli nie podoba ci się moja odpowiedź, zawsze możesz dać własną. Kiedy udzieliłem tej odpowiedzi, zaakceptowana odpowiedź miała już rok. Możesz dodać więcej wiedzy, jeśli uważasz, że masz coś do wniesienia. c) Trudno jest stworzyć monopol, gdy Twoja pozycja na rynku jest niepewna. To nie jest nowoczesne wielonarodowe stwardnienie rozsiane.
Kyte
2
@Kyte 3Dfx miał zastrzeżone interfejsy API z konkretnego powodu, aby zablokować cię w ich sprzęcie. Zmusili użytkowników końcowych do zakupu sprzętu, ponieważ programiści zostali „przekupieni” za pisanie gier, które działały tylko z 3Dfx. Microsoft chciał zablokować cię w swoim interfejsie API, aby programiści pisali tylko gry dla systemu Windows, co ostatecznie zabiło 3Dfx. Proste i proste decyzje biznesowe, a nie złe zachowanie. To wciąż trwa. Nvida chce, abyś zablokował cię w swoich kartach za pomocą CUDA, AMD chce użyć OpenCL, 2012, z tego samego powodu. To jest historia, byłem wtedy w branży.
37

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.

Nicol Bolas
źródło
4
Rzeczywiście interesujące. Przyznaję się, że nigdy nie przyjrzałem się tak uważnie. Podczas gdy moje pytanie dotyczy konkretnie przestrzeni świata, twoja odpowiedź daje mi do myślenia.
greyfade
Przekonałem się, że zmiana zakresu głębokości lub testu głębokości sprawiła, że ​​był on praworęczny, ale użycie obu anulowało się nawzajem, dając mi system leworęczny.
hultqvist
1
Intrygancki. Spójrz na transformację głębokości rzutni: z_wiewport = z_clip * (daleko-blisko) / 2 + (blisko + daleko) / 2. To sprawia, że ​​przestrzeń klipu -1 jest mapowana na bliską, a +1 na daleką. Dlatego też samą przestrzeń klipu można uznać za LEWĄ , nawet jeśli później można odwrócić sposób mapowania do rzutni.
Kos,
1
@NicolBolas: Czy zauważyłeś, że nawet Direct3D nie jest wyłącznie leworęczny, ponieważ jego miejsce na ekranie jest praworęczne? X od lewej do prawej, Y od góry do dołu i Z od przeglądarki, tzn. X do Y to obrót w lewo, patrząc z przeciwnej strony do osi Z.
legends2k
1
@ bobobobo „Zauważyłem, że matryca widoków wygenerowana przez gluLookAt również może zmienić ręczność” - Nie, nie robi tego. Tak właśnie oblicza się wektor do przodu, ale ta matryca jest jednak zwykłym przekształcaniem ciała sztywnego w przestrzeni po prawej stronie (w rzeczywistości + z jest rzeczywiście „do tyłu” w przestrzeni po prawej stronie). Negowanie wektora do przodu nie ma nic wspólnego ze zmianą ręczności przestrzeni współrzędnych.
Chris mówi Przywróć Monikę
11

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.

DarenW
źródło
1
Wszystko to jest bardzo interesujące i z pewnością tłumaczy uzasadnienie GLI SGI. ... Ale jak to wyjaśnia, że ​​DirectX jest leworęczny?
greyfade,
Wszystkie systemy 2D i 3D wywodzą swoje konwencje ze wspólnej historii.
DarenW
10

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.

tcrosley
źródło
5
Tak, myślę, że dla wielu początkujących grafików zwiększanie głębi ekranu jest bardziej naturalne. Ale chcą też x zwiększające się w prawo iy w górę, w stylu „osi wykresu”. To daje im układ współrzędnych dla leworęcznych. Dopiero później, gdy starają się robić bardziej złożone rzeczy, zdają sobie sprawę, że nie nadążają za prawicowym światem nauki / matematyki / inżynierii.
dzisiaj
6
@ Dzisiaj musisz nauczyć początkujących tajnej grafiki 3D bez uzgadniania. Wyciągnij prawą rękę z wyciągniętym kciukiem, palcem wskazującym i środkowym palcem, pod kątem prostym do siebie. Kciuk to X, palec wskazujący to Y, palec środkowy to Z. Teraz przesuń rękę, aby wyrównać z dowolnymi współrzędnymi, jakie chcesz, i od razu wiesz, jak ruch wpłynie na transformacje.
John R. Strohm,
3
@John: Hej, zgadnij co, fizycy też mają ten sam tajny uścisk dłoni!
dnia
1
@John Mimo że całkowicie zgadzam się z zaletami systemu praworęcznego, wiesz, że twoja zasada uścisku dłoni (której wszyscy powinni się nauczyć w szkole) również może być używana z lewą ręką w systemie leworęcznym.
Chris mówi Przywróć Monikę
@ChristianRau, której ręki używasz, zależy od rodzaju układu współrzędnych, który próbujesz opisać, prawo- lub leworęczny.
John R. Strohm
10

Wiodący deweloper DirectX (Direct3D) i Alex Jana niedawno skomentował tego. W artykule na temat historii Direct3D napisał:

Poproszono mnie [...] o wybranie praktyczności dla interfejsu API Direct3D. Wybrałem układ współrzędnych leworęczny, częściowo z osobistych preferencji . [...] był to arbitralny wybór.

Źródło: http://www.alexstjohn.com/WP/2013/07/22/the-evolution-of-direct3d/

Daniel Rikowski
źródło
Jest to arbitralny wybór tylko wtedy, gdy nie masz pojęcia, co robi reszta świata, że ​​reszta świata de facto ustandaryzowała prawe układy współrzędnych dla grafiki.
John R. Strohm
1
@ JohnR.Strohm - czy w ogóle przeczytałeś link do artykułu?
Maximus Minimus
Link-rot zjadł tę stronę. Oto najnowsza działająca migawka: web.archive.org/web/20161101112002/http://www.alexstjohn.com/WP/…
Max Barraclough
5

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.

John R. Strohm
źródło
W moim pytaniu nie chciałem odejść od krytyki Microsoftu, więc nie chciałem wspominać o możliwości niezgodności z OpenGL, którą mieli na myśli.
greyfade,
3
@greyfade: OK, pozwólcie, że powiem to w ten sposób. Nie ma żadnego technicznego powodu, aby preferować współrzędne lewe niż współrzędne prawe lub odwrotnie. Istnieją jednak bardzo, bardzo dobre powody, aby preferować współrzędne po prawej stronie, a także smołować, upierzać i jeździć po mieście koleją, kto nawet szepcze coś o implementacji czegokolwiek przy użyciu współrzędnych leworęcznych. Czy to upraszcza?
John R. Strohm,
Nie wiem, czy mogłem z tego powodu uzyskać jakikolwiek prawy oburzenie. Pracuję z PostScript dość regularnie w ramach mojej pracy (gdzie współrzędne zaczynają się od [0, 0] jako lewy dolny róg i maksimum w prawym górnym rogu), więc konwersja współrzędnych jest po prostu faktem.
Inaimathi,
2
A więc to jest w 100% spekulacja? Dlaczego jest oznaczony jako odpowiedź?
Factor Mystic
3
Bicie mnie, to po prostu bezsensowny dekret i, jak na ironię, podobnie jak leworęczny układ współrzędnych, wiele osób po prostu zgodziło się z nim z jakiegoś powodu.
Szybki Joe Smith
5

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, vi w, 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 Mi naładowaną cząstkę poruszającą się w tym polu z prędkością v. W którą stronę przyspiesza ładowanie? Łatwe - w kierunku M 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.

Tomek
źródło
Elektromagnetyka to nie jedyne miejsce, w którym pojawia się produkt krzyżowy. Pokazuje się także w aerodynamice i mechanice orbitalnej. Musi sobie z tym poradzić symulacja lotu i tutaj zderzają się układy współrzędnych fizyki i układy współrzędnych grafiki. Zobacz Minkler & Minkler, cytowany w mojej odpowiedzi powyżej.
John R. Strohm,
@Tom: Nie jestem pewien, czy to prawda; weź 3 wektory powiedzmy (1, 0, 0), (0, 1, 0) i (0, 0, 1), wykonanie ixj daje k, ponieważ formuła dla iloczynu krzyżowego jest dobrze zdefiniowana, a liczby nie mają żadnych chiralność / zręczność; tylko człowiek interpretuje te trzy wektory w pewnym stopniu, nawet wtedy możemy zdecydować się na interpretację w obu rękach i nadal będzie spójny, tj. w leworęcznym ixj = k będzie nieobecny, podczas gdy w praworęcznym ixj = k będzie w kierunku. Pamiętaj, że ja też jestem praworęcznym facetem, ale tak jest.
legends2k
@ legends2k: Tak, myślę, że to prawda, o ile nie chcesz, żeby twoje liczby w ogóle coś znaczyły. Gdy tylko chcesz, aby twoje liczby reprezentowały fizyczną interakcję lub współrzędne w systemie wyświetlania, lub w ogóle cokolwiek, wtedy ma to bardzo duże znaczenie.
Tom
@ Tom Masz rację, że musimy nadać sens numeracji. To naprawdę ważne. Ale wciąż nie jest to powód, by powiedzieć, że lewa ręka znajduje się nad prawą. Mógłbym nadać sens 0,0,11,0,0 X 0,1,00,0,1
dalszemu rozwojowi,
@Tom Właściwie podczas wykonywania fizyki w układzie współrzędnych leworęcznych formuła jest nieruchoma, M X vale pole magnetyczne Muważ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_rule
Oscar Benjamin
5

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

Stephen Coy
źródło
Zgadzam się z komentarzem , że brzmi to jak miejska legenda, ale miło jest uzyskać osobistą perspektywę.
Josiah Yoder
3

Ż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ć:

  • Istnieje dość szeroki konsensus w dziedzinie komputerów i innych dziedzin, aby oś X przebiegała od lewej do prawej (lotnictwo najwyraźniej jest znaczącym wyjątkiem).
  • W matematyce oś Y wskazuje w górę. (Również Up Is Where The Bubbles Go).
  • Na wyświetlaczach komputerowych oś Y wskazuje w dół (ponieważ tak działają ekrany CRT, a także dlatego, że w takiej kolejności większość ludzkich skryptów układa wiersze).
  • Kiedy patrzysz na „widoczną” stronę powierzchni w płaszczyźnie X / Y, normalna powinna być skierowana w stronę widza (na przykład, gdy patrzysz na materiał satelitarny; „wysokość nad poziomem morza” wskazuje na satelitę, a nie na środek Ziemi). Ponieważ normalną dla płaszczyzny X / Y jest wektor osi Z, wynika z tego, że oś Z powinna również wskazywać w stronę widza.
  • Gdy patrzysz na obrazy 3D na ekranie komputera, punkty znajdujące się dalej od widza powinny mieć większy komponent Z. Dlatego oś Z powinna wskazywać na ekran.

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.

tdammers
źródło
3

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

Maximus Minimus
źródło
0

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.

snogglethorpe
źródło
0

Dostarczam to jako materiał uzupełniający do mojej poprzedniej odpowiedzi tutaj. Ze starej specyfikacji OpenGL z lat 90. XX wieku:

OpenGL nie wymusza na leworęcznych lub praworęcznych żadnym ze swoich układów współrzędnych.

(ź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?

Maximus Minimus
źródło
1
dlaczego opublikowałeś go w osobnej odpowiedzi? Mam na myśli, że możesz edytować swoją poprzednią odpowiedź, aby ją dodać, prawda?
komara
-1

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

Thomas Sharpless
źródło
3
Produkt krzyżowy działa przeciwutleniająco. A x B == - B x A. Jako taki, produkt krzyżowy jest zdefiniowany tak, aby pobrać niekoliniowy pierwszy wektor i drugi wektor, zapisane w tej kolejności, i wytworzyć trzeci wektor, normalny do płaszczyzny zawierającej pierwszy i drugi wektor oraz o kierunku odpowiednim do utworzenia układu współrzędnych po prawej stronie, gdy wektory są wyliczane w kolejności (pierwsza, druga, wynik). Jeśli zdecydujesz się to zboczyć, nie krępuj się, ALE BĄDŹ OSTRZEŻONY: Jeśli robisz to wokół mnie, lepiej delektuj się smołą, piórami i drzazgami w tyłku podczas jazdy koleją poza miasto.
John R. Strohm,
Całkiem słusznie, John; ale wciąż musicie zmierzyć się z faktem, że taka perwersja jest możliwa, co oznacza, że ​​nie ma czegoś takiego jak „absolutna praworęczność”, co oznacza, że ​​to od ciebie i mnie nadal zależy, czy uda ci się naprawić znaki.
Thomas Sharpless,
-3

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ć

Thaina
źródło
2
-1 za ignorancję. Konwencja prawostronna pochodzi z fizyki i matematyki, w szczególności z operacji krzyżowego produktu wektorowego, która jest fundamentalna dla teorii pola elektromagnetycznego i mechaniki. Komputery przyjęły to, ponieważ pierwotnym zastosowaniem komputerów było rozbicie liczb.
John R. Strohm,
Powinien -1 zamiast twojej ignorancji. Tak jak mówiłem, „fizyka i matematyka„ współrzędne biurka ”w dawnych czasach zawsze działały na biurku, a nie na monitorze, dlatego nazwałem to„ współrzędną biurka ”, ponieważ obliczasz fizykę i matematykę na poziomym biurku
Thaina