it-swarm-eu.dev

Proč DirectX používá levostranný souřadnicový systém?

Uvažoval jsem o zveřejnění příspěvku na Stack Overflow, ale otázka mi připadá jako příliš subjektivní, protože si nedokážu představit rozumné technické vysvětlení pro výběr Microsoftu v této záležitosti. Ale tato otázka mě už tak dlouho obtěžovala a tento problém se stále objevuje v jednom z mých projektů a nikdy jsem neviděl pokus vysvětlit toto:

OpenGL používá pravoúhlý souřadnicový systém, kde + Z část světového souřadnicového systému sahá směrem k divákovi.

DirectX používá levotočivý systém, kde + Z část světové souřadnice se rozšiřuje na na obrazovku, mimo prohlížeč .

Nikdy jsem nepoužil Glide API , takže nevím, jak to fungovalo, ale z toho, co mohu shromáždit, používá také levotočivý systém.

Existuje technický důvod? A pokud ne, existuje určitá koncepční výhoda pro konkrétní handedness souřadnicového systému? Proč by si jeden vybral jeden nad druhým?

52
greyfade

Vím, že se jedná o starý příspěvek, ale viděl jsem, že se na tento příspěvek odkazuje a nemá rád tón zvolené odpovědi.

Takže jsem udělal trochu vyšetřování!

  1. DirectX je starý. Poprvé vyšlo v roce 1995, kdy svět měl mnohem více než Nvidia a ATI , DirectX vs OpenGL. To je více než 15 let, lidi.
  2. dfx Interactive's Glide (jeden z konkurentů DirectX zpět v den. OpenGL nebylo určeno pro hraní zpět) používal levotočivý souřadnicový systém.
  3. POV-Ray a RenderMan (vizualizační software Pixar), také použijte levostranný souřadnicový systém.
  4. DirectX 9+ může pracovat s oběma souřadnými systémy.
  5. WPF a XNA (které pracují s DirectX v rámci scén) používají právo -handed souřadnicový systém.

Z toho mohu spekulovat o několika věcech:

  • Průmyslové standardy nejsou tak standardní jako lidé.
  • Direct3D byl postaven v době, kdy každý dělal věci svým vlastním způsobem, a vývojáři pravděpodobně nevěděli lépe.
  • Levostrannost je volitelná, ale ve světě DirectX je obvyklá.
  • Vzhledem k tomu, že konvence vymřou, každý si myslí, že DirectX může pracovat pouze s levotočivostí.
  • Microsoft se nakonec dozvěděl a dodržoval standard ve všech nových API, která vytvořili.

Můj závěr by tedy byl:

Když si museli vybrat, neznali standard, vybrali „jiný“ systém a všichni ostatní prostě šli na cestu. Žádné pochybné podnikání, pouze nešťastné návrhové rozhodnutí, které bylo provedeno, protože zpětná kompatibilita je název hry společnosti Microsoft.

64
Kyte

Překvapuje mě, že nikdo nic nezmínil: OpenGL funguje také v levostranném souřadnicovém systému. Alespoň to dělá, když pracujete se shadery a používáte výchozí rozsah hloubky.

Jakmile vyhodíte potrubí s pevnou funkcí, vypořádáte se přímo s „klipovým prostorem“. Specifikace OpenGL definuje klipový prostor jako homogenní souřadnicový systém 4D. Když sledujete transformace pomocí normalizovaných souřadnic zařízení a až do prostoru okna, najdete to.

Prostor okna je v prostoru pixelů okna. Původ je v levém dolním rohu, + Y nahoru a + X doprava. To zní velmi jako pravoúhlý souřadnicový systém. Ale co Z?

Výchozí rozsah hloubky (glDepthRange) nastaví hodnotu blízkého Z na 0 a vzdálenou hodnotu Z na jedna. Takže + Z jde pryč z prohlížeče.

To je levotočivý souřadnicový systém. Ano, můžete změnit hloubkový test z GL_LESS na GL_GREATER a změnit glDepthRange z [0, 1] na [1, 0]. Ale stav výchozí OpenGL má fungovat v levotočivém souřadném systému. A žádná z transformací nutných k tomu, abychom se dostali do okenního prostoru z klipového prostoru, negují Z. Takže klipový prostor je výstupem shaderu vrcholů (nebo geometrie) levý prostor (trochu. Je to homogenní prostor 4D, takže je obtížné sevřít poddajnost).

V potrubí s pevnou funkcí se standardní projekční matice (produkované glOrtho, glFrustum a podobně) všechny proměňují z pravotočivého prostoru na levotočivý jeden. Převracejí význam Z; stačí zkontrolovat matice, které generují. V očním prostoru se + Z posune směrem k divákovi; v post-projekčním prostoru se pohybuje pryč.

Mám podezření, že Microsoft (a GLide) se prostě neobtěžoval provést negaci ve svých projekčních matricích.

37
Nicol Bolas

Je to čistá historie. V dávných dobách považovali programátoři raných jeskynních grafů monitorovací povrch (teletyp? Stonetyp?) Za dvourozměrný milimetrový papír. V matematice a strojírenství jsou obvyklé konvence pro vykreslování datových bodů na milimetrovém papíře: x = vpravo, y = nahoru. Jednoho dne, asi týden po vynálezu silikonového kola, si někdo pomyslel na 3D grafiku. Když svíčka této myšlenky z jakéhokoli důvodu zamrkala nad jejich hlavou, rozhodnou se přidat Z = od diváka. (No, moje pravá ruka to bolí, jen si to představuji.)

Netušili, že jednoho dne se jejich vzdálení potomci stanou inženýry, vědci, výtvarnými umělci, komerčními umělci, animátory, návrháři produktů atd. A zjistí, že je 3D grafika užitečná. Všichni tito moderní lidé používají pravoúhlé souřadnicové systémy, aby byly v souladu s ostatními a se zavedenými matematickými texty a fyzikálními konvencemi.

Je pošetilé založit 3D souřadnicový systém na povrchu displeje. Počítá se s tímto modelem - trojúhelníky a mnohoúhelníky a letadla popisující dům, židli, zelený ogre s nadváhou nebo galaxii. V dnešní době jsme všichni navrhovali a modelovali věci v pravostranných systémech XYZ, a děláme to z hlediska světa modelu, ještě předtím, než přemýšlíme, jak bude vykreslen. Fotoaparát je přidán v určitém okamžiku, možná nucen létat kolem bláznivým způsobem, a je to neviditelná infrastruktura, která převádí model na pixely, které se v jeho útrobách musí proklínat s koordinovanými systémovými transformacemi.

Jen pro doplnění zmatku některé grafické knihovny uznávají, že CRT skenují obraz shora dolů, a tedy mají Y = dolů. Používá se to i dnes ve všech okenních systémech a správcích oken - X11, fvwm, gtk +, Win31 API atd. Jak se nové GUI systémy, jako je Clutter, Beryl atd., Zabývají Z, je samostatný problém od 3D grafického modelování. To se týká pouze aplikačních programátorů a návrhářů grafického uživatelského rozhraní.

11
DarenW

Oba jsou v podstatě rovnocenné, protože jeden může být snadno transformován do druhého. Jedinou výhodu, kterou mohu pro levotočivý systém najít, je: protože objekty jsou dále od pozorovatele, v jakémkoli směru (x, y nebo z) je vzdálenost vyšší hodnotou. Ale nemám tušení, jestli to je důvod, proč se Microsoft rozhodl pro sebe.

POV-Ray také používá levotočivý chodebný systém.

10
tcrosley

hlavní vývojář DirectX (a Direct3D) Alex St. John, nedávno o tom komentoval. V článku o historii Direct3D napsal:

Byl jsem [...] požádán, abych si vybral vhodnost pro rozhraní Direct3D API. Vybral jsem si levotočivý souřadný systém, částečně mimo osobní preference . [...] to byla libovolná volba.

Zdroj: http://www.alexstjohn.com/WP/2013/07/22/the-evolution-of-direct3d/

10
Daniel Rikowski

Věc, kterou je třeba pochopit, je, že se obrovské množství programátorského času promarnilo přeměnou mezi levotočivými a pravostrannými souřadnicovými systémy a ještě více programátorského času se promarnilo zapamatováním, který systém byl potřebný v kterémkoli konkrétním okamžiku.

To vše zmizelo, když se pravoúhlé souřadnicové systémy staly průmyslovým standardem.

Existuje již dost souřadnicových systémů, které se běžně používají, aniž by se počet zdvojnásobil zavedením otázky handedness. Viz Minkler & Minkler, „Letecké souřadnicové systémy a transformace“ . Pokud jste v leteckém koordinačním podnikání, děláte např. letové simulace, [~ # ~] potřebujete [~ # ~] tu knihu.

Myslím, že Microsoft neměl ANYONE na projektu DirectX, který věděl něco o průmyslových standardech, neuvědomil si, že existuje průmyslový standard, a zjistil, že na tom nezáleží.

Další možnost, že věděli, že pravotočivé systémy jsou průmyslovým standardem, a úmyslně učinili DirectX levou rukou, aby bylo pro lidi HARD, aby převedli kód, který používal DirectX k použití OpenGL místo, se nebere v úvahu. Kdybych zjistil, že tomu tak skutečně bylo, považoval bych za nutné zahájit novou a pravděpodobně krátkodobou kariéru jako vraha seker v Redmondu.

5
John R. Strohm

Skutečná odpověď na dřívější levostrannost Direct3D je mnohem méně zlověstná, než někteří z vás spekulují. DirectX dostal svůj začátek, když Microsoft koupil RenderMorphics již v roce 1995.

V té době byl běžným grafickým textem používaným v kancelářích RenderMorphics „Principy interaktivní počítačové grafiky“ od společnosti Newmann a Sproul, který vše provádí pomocí levostranných souřadnic. Je to stejná kniha, kterou jsem použil na vysoké škole. Při pohledu na kód D3D jste je mohli dokonce vidět pomocí názvů proměnných, které odpovídaly rovnicím v knize.

Nejedná se o spiknutí Microsoftu. Rozhodnutí bylo učiněno dříve, než Microsoft vstoupil do obrazu.

5
Stephen Coy

Pro všechny, kdo si myslí, že není výhoda pro praváky nebo leváky, jste naprosto špatně. Pravostrannost kartézských souřadných systémů vychází z definice vektorového křížového produktu. Pro základní vektory XYZ u, v a w, w = u X v.

Tato definice je základem vektorové matematiky, vektorového počtu a velké části fyziky. Předpokládejme, že se pokoušíte simulovat elektromagnetické interakce. Máte vektor magnetického pole M a nabitá částice pohybující se v tomto poli rychlostí v. Jakým způsobem se náboj zrychluje? Snadné - ve směru M X v. Až na to, že si nějaký idiot myslel, že by bylo zábavné, aby byl váš zobrazovací systém levák, takže se zrychluje ve směru -M X v.

Jakákoli fyzická interakce mezi dvěma vektorovými veličinami je v podstatě definována jako pravotočivá, takže kdykoli budete potřebovat simulovat tuto interakci, měli byste raději doufat, že váš grafický systém je pravák, nebo si budete muset pamatovat, abyste se pohybovali kolem negativních znaků v veškerá vaše matematika.

5
Tom

Ani jeden není nakonec lepší než ten druhý - mapujete 3D souřadnice na 2D povrch, takže třetí rozměr (který ve skutečnosti dělá věci 3D) může být zvolen libovolně, ukazující na diváka nebo na obrazovku. Stejně se chystáte prosadit matici 4x4, takže není žádný technický důvod vybrat si jednu z druhé. Funkčně lze argumentovat:

  • Ve výpočtech a dalších polích existuje poměrně široký konsenzus, aby osa X probíhala zleva doprava (letectví je zjevně významnou výjimkou).
  • V matematice ukazuje osa Y nahoru. (Nahoru je také místo, kde bubliny jdou).
  • Na počítačových obrazovkách ukazuje osa Y dolů (protože takto fungují obrazovky CRT a také proto, že to je pořadí, ve kterém většina lidských skriptů uspořádá řádky).
  • Když se podíváte na „viditelnou“ stranu povrchu v rovině X/Y, normální by měla směřovat k divákovi (například když se díváte na satelitní záznam; „výška nad hladinou moře“ ukazuje na satelit, nikoli na střed Země). Protože normální pro rovinu X/Y je vektor osy Z, znamená to, že osa Z by také měla směřovat k divákovi.
  • Když se díváte na 3D obrazy na obrazovce počítače, body, které jsou dále od prohlížeče, by měly mít větší komponentu Z. Osa Z by proto měla směřovat do obrazovky.

Závěr: Existuje určitá shoda pro osu X, ale pro další dva lze obhajovat oba směry, což vede ke dvěma konfiguracím pro praváky a dvě leváky, a všechny mají smysl.

3
tdammers

Zajímavý fakt.

Direct3D (nikoli DirectX - DirectX také pokrývá vstup, zvuk atd.) Ve skutečnosti nemá má levotočivý souřadný systém.

Je dokonale schopen podporovat systémy RH a LH). Pokud se podíváte do dokumentace SDK, uvidíte funkce, jako je D3DXMatrixPerspectiveFovLH a D3DXMatrixPerspectiveFovRH. vytvořte promítací matici, kterou lze úspěšně použít se zvoleným souřadným systémem. Do pekla můžete dokonce použít sloupec major v Direct3D, pokud si přejete, jde pouze o knihovnu softwarové matice a nemusíte ji používat. na druhou stranu, pokud ji chcete používat s OpenGL, zjistíte, že to také funguje dobře is OpenGL (což je snad definitivní důkaz nezávislosti maticové knihovny na samotném Direct3D).

Pokud tedy chcete ve svém programu používat systém RH, použijte pouze verzi funkce -RH. Pokud chcete použít systém LH, použijte verzi -LH. Direct3D to nezajímá. Podobně, pokud chcete použít systém LH v OpenGL - jen glLoadMatrix an LH promítací matice.) Žádné z těchto věcí není důležité a nikde není blízko k obrovskému problému, který někdy vidíte, aby byl.

3
Maximus Minimus

Poskytuji to jako doplňkový materiál k mé předchozí odpovědi zde. Ze staré specifikace OpenGL z 90. let:

OpenGL nenutí násilí vlevo nebo vpravo na žádném ze svých souřadnicových systémů.

(zdroj: http://www.opengl.org/documentation/specs/version1.2/opengl1.2.1.pdf ).

Takže, protože ani D3D, ani OpenGL nevynucují žádnou handedness, skutečnou otázkou je: proč to lidé vnímají jako něco velkého?

0
Maximus Minimus

Pro handedness není žádná technická výhoda, je to zcela svévolné. Oba fungují dobře, pokud jste konzistentní.

Kvůli výhodám konzistence by měl člověk v ideálním případě „používat to, co všichni používají“ - ale v mnoha případech je to docela obtížné, protože v praxi také neexistuje drtivá „preferovaná“ konvence: obě handedness jsou široce používány. V některých komunitách (např. OpenGL) existuje přinejlepším konzistence.

Takže si myslím, že základní odpověď na tuto otázku je: Vybrali si to, co si vybrali, protože se cítili dobře (bezpochyby měli nějaké předchozí zkušenosti s touto poddaností) a nebyl důvod, proč tomu tak bylo.

Nakonec to dělá jen malý rozdíl - kdokoli, kdo si vážně chce vyměňovat aktiva/kód s jinými systémy/komunitami, bude muset být stejně připraven ke konverzi handedness, protože v 3D grafice je to fakt života.

0
snogglethorpe