it-swarm.it

Perché DirectX utilizza un sistema di coordinate per mancini?

Ho considerato di pubblicare su Stack Overflow, ma la domanda mi sembra troppo soggettiva poiché non riesco a pensare a una spiegazione tecnica ragionevole per la scelta di Microsoft in questa materia. Ma questa domanda mi ha infastidito per così tanto tempo e il problema continua a sorgere in uno dei miei progetti e non ho mai visto un tentativo di spiegarlo:

OpenGL utilizza un sistema di coordinate destrorso, in cui la parte + Z del sistema di coordinate del mondo si estende verso lo spettatore.

DirectX utilizza un sistema per mancini in cui la parte + Z della coordinata mondiale si estende in lo schermo, lontano dallo spettatore .

Non ho mai usato Glide API , quindi non so come funzionasse, ma da quello che posso raccogliere usa anche un sistema per mancini.

C'è un motivo tecnico per questo? E se no, c'è qualche vantaggio concettuale in una particolare mano di un sistema di coordinate? Perché uno dovrebbe scegliere uno sopra l'altro?

52
greyfade

So che questo è un vecchio post, ma ho visto questo post referenziato e non mi piace il tono della risposta scelta.

Quindi ho fatto un po 'di indagine!

  1. DirectX è vecchio. È stato rilasciato per la prima volta nel 1995, quando il mondo aveva molto più di Nvidia e ATI , DirectX vs OpenGL. Sono passati più di 15 anni, gente.
  2. dfx Interactive's Glide (uno dei concorrenti di DirectX nel passato. All'epoca OpenGL non era pensato per i giochi) utilizzava un sistema di coordinate per mancini.
  3. POV-Ray e RenderMan (software di rendering Pixar), utilizzano anche un sistema di coordinate per mancini.
  4. DirectX 9+ può funzionare con entrambi i sistemi di coordinate.
  5. Entrambi WPF e XNA (che funzionano con DirectX sotto le scene) usano un diritto sistema di coordinate a mano.

Da questo, posso speculare su un paio di cose:

  • Gli standard del settore non sono standard come la gente piace.
  • Direct3D è stato creato in un momento in cui ognuno ha fatto le cose a modo suo e gli sviluppatori probabilmente non lo sapevano meglio.
  • La mancina è facoltativa, ma consueta nel mondo DirectX.
  • Poiché le convenzioni si estinguono duramente, tutti pensano che DirectX possa funzionare solo con la mano sinistra.
  • Alla fine Microsoft ha appreso e seguito lo standard in tutte le nuove API che hanno creato.

Pertanto, la mia conclusione sarebbe:

Quando hanno dovuto scegliere, non conoscevano lo standard, hanno scelto l '"altro" sistema e tutti gli altri sono andati a fare un giro. Nessun affare losco, solo una sfortunata decisione di progettazione che è stata portata avanti perché la compatibilità con le versioni precedenti è il nome del gioco di Microsoft.

64
Kyte

Sono sorpreso che nessuno abbia menzionato qualcosa: OpenGL funziona anche in un sistema di coordinate per mancini. Almeno, quando si lavora con shader e si utilizza l'intervallo di profondità predefinito.

Una volta buttata via la pipeline a funzione fissa, hai a che fare direttamente con "spazio clip". Le specifiche OpenGL definiscono lo spazio clip come un sistema di coordinate omogeneo 4D. Quando segui le trasformazioni attraverso coordinate del dispositivo normalizzate e nello spazio della finestra, trovi questo.

Lo spazio della finestra è nello spazio dei pixel di una finestra. L'origine è nell'angolo in basso a sinistra, con + Y che sale e + X che va a destra. Sembra un sistema di coordinate destrorso. Ma che dire di Z?

L'intervallo di profondità predefinito (glDepthRange) imposta il valore Z vicino a 0 e il valore Z lontano su no. Quindi la + Z sta andando via dallo spettatore.

Questo è un sistema di coordinate per mancini. Sì, è possibile modificare il test di profondità da GL_LESS a GL_GREATER e modificare la gamma glDepth da [0, 1] a [1, 0]. Ma lo stato predefinito di OpenGL deve funzionare in un mancino sistema di coordinate. E nessuna delle trasformazioni necessarie per raggiungere lo spazio finestra dallo spazio clip nega la Z. Quindi lo spazio clip, l'output dello shader vertice (o geometria) è uno spazio per mancini (kinda. È uno spazio omogeneo 4D, quindi è difficile definire la mano).

Nella pipeline a funzione fissa, le matrici di proiezione standard (prodotte da glOrtho, glFrustum e simili) si trasformano tutte da uno spazio per la mano destra in uno per la mano sinistra uno. Capovolgono il significato di Z; basta controllare le matrici che generano. Nello spazio degli occhi, + Z si sposta verso lo spettatore; nello spazio post-proiezione, si allontana.

Sospetto che Microsoft (e GLide) semplicemente non si siano preoccupati di eseguire la negazione nelle loro matrici di proiezione.

37
Nicol Bolas

È pura storia. Nei tempi antichi i primi programmatori di grafica delle caverne pensavano al monitor (teletipo? Stonetype?) Che visualizzava la superficie come carta millimetrata bidimensionale. In matematica e ingegneria le convenzioni usuali per la stampa di punti dati su carta millimetrata sono: x = destra, y = su. Poi un giorno, circa una settimana dopo l'invenzione della ruota in silicone, qualcuno ha pensato alla grafica 3D. Quando il bulbo di candela di questa idea lampeggiava sopra la loro testa, per qualsiasi motivo, hanno scelto di aggiungere Z = lontano dallo spettatore. (Ahi, la mia mano destra fa male solo immaginandolo.)

Non avevano idea che un giorno i loro lontani discendenti sarebbero diventati ingegneri, scienziati, bravi artisti, artisti commerciali, animatori, designer di prodotti ecc. E avrebbero trovato utili la grafica 3D. Tutte queste belle persone moderne usano i sistemi di coordinate destrorsi per essere coerenti tra loro e con i testi matematici e le convenzioni di fisica più consolidati.

È sciocco basare il sistema di coordinate 3D sulla superficie del display. È il modello che conta: i triangoli, i poligoni e gli aerei che descrivono una casa, una sedia, un ogre verde sovrappeso o una galassia. Al giorno d'oggi progettiamo e modelliamo tutti gli elementi nei sistemi XYZ per destrorsi, e lo facciamo in termini di mondo del modello, anche prima di pensare a come verrà reso. La fotocamera viene aggiunta ad un certo punto, probabilmente fatta per volare in modo folle, ed è un'infrastruttura invisibile che converte il modello in pixel che all'interno delle sue viscere devono aggirarsi con trasformazioni di sistema coordinate.

Solo per aggiungere confusione, alcune librerie grafiche riconoscono che i CRT scansionano l'immagine dall'alto verso il basso, e quindi hanno Y = giù. Questo è usato ancora oggi in tutti i sistemi di finestre e gestori di finestre - X11, fvwm, gtk +, API Win31, ecc. Il modo in cui i nuovi sistemi di interfaccia grafica 3D come Clutter, Beryl ecc. Gestiscono Z, è un problema separato dalla modellazione grafica 3D. Questa esigenza riguarda solo i programmatori di applicazioni e i progettisti di GUI.

11
DarenW

Entrambi sono essenzialmente equivalenti, in quanto uno può essere facilmente trasformato nell'altro. L'unico vantaggio che posso trovare per il sistema per mancini è: poiché gli oggetti sono più lontani dall'osservatore, in qualsiasi direzione (x, y, o z), la distanza è un valore più alto. Ma non ho idea se questo è il motivo per cui Microsoft ha scelto l'uno rispetto all'altro.

POV-Ray utilizza anche un sistema di corridnate per mancini.

10
tcrosley

Lo sviluppatore principale di DirectX (e Direct3D) Alex St. John ha recentemente commentato questo. In un articolo sulla storia di Direct3D ha scritto:

Mi è stato [...] chiesto di scegliere una mano per l'API Direct3D. Ho scelto un sistema di coordinate per mancini, in parte su preferenza personale . [...] è stata una scelta arbitraria .

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

10
Daniel Rikowski

La cosa da capire è che una quantità ENORME di tempo del programmatore è stata sprecata per la conversione tra sistemi di coordinate per mancini e destrimani e che è stato sprecato ancora più tempo per il programmatore ricordando quale sistema era necessario in un determinato istante.

Tutto ciò è scomparso quando i sistemi di coordinate destrorsi sono diventati lo standard del settore.

Esistono già abbastanza sistemi di coordinate di uso comune, senza raddoppiare il numero introducendo una domanda sulla mano. Vedi Minkler & Minkler, "Sistemi di coordinate aerospaziali e trasformazioni" . Se sei nel settore delle coordinate aerospaziali, ad es. simulazione di volo, tu [~ # ~] hai bisogno di [~ # ~] quel libro.

La mia ipotesi è che Microsoft non avesse NESSUNO nel progetto DirectX che sapesse qualcosa sugli standard del settore, non si rendesse conto che c'era uno standard del settore e pensò che non avesse importanza.

L'altra possibilità, che sapevano che i sistemi per destrimani erano lo standard del settore, e hanno deliberatamente creato i mancini per DirectX, in modo da rendere DIFFICILE per le persone convertire il codice che utilizzava DirectX per usare OpenGL, non tiene conto. Se dovessi scoprire che era proprio così, troverei necessario intraprendere una nuova e presumibilmente breve vita come assassino d'ascia a Redmond.

5
John R. Strohm

La vera risposta alla prima mano sinistra di Direct3D è molto meno sinistra di quanto alcuni di voi stiano ipotizzando. DirectX ha iniziato quando Microsoft ha acquistato RenderMorphics nel 1995.

A quel tempo il testo grafico standard utilizzato negli uffici RenderMorphics era "Principles of Interactive Computer Graphics" di Newmann e Sproul che fa tutto usando le coordinate per mancini. È lo stesso libro che ho usato al college. Guardando il codice D3D potresti persino vederli usando nomi di variabili che corrispondevano alle equazioni nel libro.

Non è una cospirazione di Microsoft. La decisione è stata presa prima ancora che Microsoft entrasse in scena.

5
Stephen Coy

Per tutti coloro che pensano che non ci sia alcun vantaggio per la mano destra o per la mano sinistra, hai assolutamente torto. La mano destra dei sistemi di coordinate cartesiane deriva dalla definizione del prodotto incrociato vettoriale. Per i vettori di base XYZ u, v e w, w = u X v.

Questa definizione è fondamentale per la matematica vettoriale, il calcolo vettoriale e gran parte della fisica. Supponiamo che tu stia cercando di simulare le interazioni elettromagnetiche. Hai un vettore di campo magnetico, M e una particella carica che si muove in quel campo con velocità v. In che modo accelera la carica? Facile - nella direzione di M X v. Tranne qualche idiota, ha pensato che sarebbe stato divertente rendere il sistema di visualizzazione mancino, quindi accelera nella direzione di -M X v.

Fondamentalmente qualsiasi interazione fisica tra due quantità di vettori viene definita come destrorsa, quindi ogni volta che è necessario simulare tale interazione, è meglio sperare che il sistema grafico sia destrorso o che sarà necessario ricordare di aggirare i segni negativi in tutta la tua matematica.

5
Tom

Nessuno dei due è in definitiva migliore dell'altro: stai mappando le coordinate 3D su una superficie 2D, quindi la terza dimensione (che in realtà rende le cose 3D) può essere scelta arbitrariamente, indicando lo spettatore o sullo schermo. Passerai comunque le cose attraverso una matrice 4x4, quindi non c'è motivo tecnico per sceglierne una rispetto all'altra. Funzionalmente, si potrebbe obiettare:

  • Esiste un consenso abbastanza ampio nel campo informatico e in altri campi per far funzionare l'asse X da sinistra a destra (apparentemente le aviazione rappresentano un'eccezione notevole).
  • In matematica, l'asse Y punta verso l'alto. (Inoltre, Su è dove vanno le bolle).
  • Sui display dei computer, l'asse Y punta verso il basso (perché è così che funzionano le schermate CRT e anche perché è l'ordine in cui la maggior parte degli script umani organizza le righe).
  • Quando guardi il lato "visibile" di una superficie nel piano X/Y, la normale dovrebbe puntare verso lo spettatore (come quando guardi le riprese satellitari; l '"altezza sopra il livello del mare" punta verso il satellite, non verso il centro della Terra). Poiché la normale per il piano X/Y è il vettore dell'asse Z, ne consegue che anche l'asse Z dovrebbe puntare verso il visualizzatore.
  • Quando guardi le immagini 3D sullo schermo di un computer, i punti più distanti dal visualizzatore dovrebbero avere un componente Z più grande. Quindi, l'asse Z dovrebbe puntare sullo schermo.

Conclusione: Esiste un certo consenso per l'asse X, ma per le altre due si possono argomentare entrambe le direzioni, producendo due configurazioni per la mano destra e due per la mano sinistra, e tutte hanno un senso.

3
tdammers

Fatto interessante.

Direct3D (non DirectX - DirectX copre anche input, audio, ecc.) non hanno un sistema di coordinate per mancini.

È perfettamente in grado di supportare sia RH che LH sistemi. Se guardi nella documentazione SDK vedrai funzioni come D3DXMatrixPerspectiveFovLH e D3DXMatrixPerspectiveFovRH. Entrambi funzionano ed entrambi produce una matrice di proiezione che può essere utilizzata con successo con il tuo sistema di coordinate preferito. Inferno, puoi anche usare la colonna maggiore in Direct3D se lo desideri; è solo una libreria di matrici software e non ti viene richiesto di usarla. d'altra parte, se vuoi usarlo con OpenGL scoprirai che funziona perfettamente anche con OpenGL (che è forse la prova definitiva dell'indipendenza della libreria di matrici da Direct3D stesso).

Quindi, se vuoi usare un sistema RH nel tuo programma, usa semplicemente la versione -RH della funzione. Se vuoi usare un LH sistema, usa la versione -LH. A Direct3D non importa. Allo stesso modo, se vuoi usare un LH sistema in OpenGL - solo glLoadMatrix an LH matrice di proiezione. Nessuna di queste cose è importante ed è in nessun posto vicino all'enorme problema che a volte vedi che è stato risolto.

3
Maximus Minimus

Fornendo questo come materiale supplementare alla mia precedente risposta qui. Da una vecchia specifica OpenGL degli anni '90:

OpenGL non forza la mano sinistra o la mano destra su nessuno dei suoi sistemi di coordinate.

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

Quindi, dal momento che né D3D né OpenGL impongono alcuna mano, la vera domanda è: perché la gente vede questo come qualcosa di molto importante?

0
Maximus Minimus

Non vi è alcun vantaggio tecnico in nessuna delle mani, è completamente arbitrario. Entrambi funzionano bene finché sei coerente.

A causa dei vantaggi della coerenza, idealmente si dovrebbe semplicemente "usare ciò che tutti gli altri stanno usando", ma è abbastanza difficile in molti casi, perché in pratica non c'è nemmeno una convenzione "preferita" in modo schiacciante: entrambe le mani sono ampiamente utilizzate. Nella migliore delle ipotesi, esiste una certa coerenza all'interno di determinate comunità (ad esempio OpenGL).

Quindi penso che la risposta di base a questa domanda sia: hanno scelto ciò che hanno scelto perché sembrava giusto (senza dubbio avevano avuto qualche esperienza precedente con quella mano) e c'erano poche ragioni per non farlo.

Alla fine fa poca differenza: chiunque voglia seriamente scambiare risorse/codice con altri sistemi/comunità dovrà essere preparato ad affrontare comunque la conversione della mano, perché è un dato di fatto nella vita della grafica 3D.

0
snogglethorpe