Perché DirectX utilizza un sistema di coordinate mancino?

51

Ho preso in considerazione la pubblicazione 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 venire in uno dei miei progetti, e non ho mai visto un tentativo di spiegare questo:

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 mancino in cui la parte + Z della coordinata del mondo si estende in lo schermo, lontano dal visualizzatore.

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

C'è una ragione tecnica per questo? E se no, c'è qualche vantaggio concettuale per una particolare manualità di un sistema di coordinate? Perché dovremmo scegliere uno sull'altro?

    
posta greyfade 07.11.2010 - 21:34
fonte

14 risposte

64

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 ricerche!

  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 più di 15 anni, persone.
  2. 3dfx Interactive's Glide (uno dei concorrenti di DirectX nel corso della giornata. OpenGL non era pensato per i giochi allora) usato a sinistra -un sistema di coordinate gestito.
  3. POV-Ray e RenderMan (software di rendering di Pixar), usa anche un sistema di coordinate mancino.
  4. DirectX 9+ può funzionare con entrambi i sistemi di coordinate.
  5. Entrambi WPF e XNA (che funziona con DirectX sotto le scene) usa un sistema di coordinate destrorso.

Da questo, posso speculare su un paio di cose:

  • Gli standard di settore non sono standard come quelli di.
  • Direct3D è stato creato in un momento in cui tutti hanno fatto le cose a modo loro e gli sviluppatori probabilmente non lo sapevano.
  • La mancina è facoltativa, ma consueta nel mondo di DirectX.
  • Dal momento che le convenzioni si estinguono molto, tutti pensano che DirectX possa funzionare solo con la mancina.
  • Alla fine Microsoft ha imparato e ha seguito lo standard in tutte le nuove API che hanno creato.

Pertanto, la mia conclusione sarebbe:

Quando dovevano scegliere, non conoscevano lo standard, scelsero il sistema "altro" e tutti gli altri se ne andarono. Nessun business losco, solo una sfortunata decisione progettuale che è stata portata avanti perché la compatibilità con le versioni precedenti è il nome del gioco di Microsoft.

    
risposta data 27.03.2011 - 01:19
fonte
37

Sono sorpreso che nessuno abbia menzionato qualcosa: OpenGL funziona anche con un sistema di coordinate mancino. Almeno, lo fa quando lavori con gli shader e usi l'intervallo di profondità predefinito.

Una volta eliminata la pipeline a funzione fissa, ti occupi direttamente di "clip-spazio". La specifica OpenGL definisce lo spazio clip come un sistema di coordinate omogeneo 4D. Quando segui le trasformazioni attraverso le coordinate normalizzate del dispositivo e fino allo spazio finestra, trovi questo.

Lo spazio della finestra si trova nello spazio dei pixel di una finestra. L'origine è nell'angolo in basso a sinistra, con + Y in aumento e + X in corso a destra. Sembra molto simile a un sistema di coordinate destrorse. Ma che dire di Z?

L'intervallo di profondità predefinito (glDepthRange) imposta il valore Z vicino a 0 e il valore Z lontano a uno . Quindi + Z sta andando lontano dal visualizzatore.

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

Nella pipeline a funzioni fisse, le matrici di proiezione standard (prodotte da glOrtho, glFrustum e simili) si trasformano da uno spazio per destrorsi a uno per mancini . Capovolgono il significato di Z; basta controllare le matrici che generano. Nello spazio degli occhi, + Z si sposta verso lo spettatore; nello spazio di post-proiezione, si allontana.

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

    
risposta data 01.07.2011 - 14:18
fonte
11

È pura storia. Nei tempi antichi i primi programmatori di caverne grafiche pensavano che il monitor (teletype? Stonetype?) Vedesse la superficie come una carta millimetrata. In matematica e ingegneria le solite convenzioni per tracciare i 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 ammiccò sopra la loro testa, per qualsiasi ragione, scelse di aggiungere Z = lontano dallo spettatore. (Ahi, la mia mano destra fa male solo a immaginarlo.)

Non avevano idea che un giorno i loro discendenti lontani sarebbero diventati ingegneri, scienziati, artisti, artisti commerciali, animatori, progettisti di prodotti ecc. e avrebbero trovato utile la grafica 3D. Tutte queste belle persone moderne usano i sistemi di coordinate della mano destra per essere coerenti tra loro e con i testi matematici e convenzionali più consolidati.

È sciocco basare il sistema di coordinate 3D sulla superficie del display. È il modello che conta: triangoli e poligoni e piani che descrivono una casa, una sedia, un orco o una galassia in sovrappeso. Oggigiorno progettiamo e modelliamo tutto in sistemi XYZ destrorsi, e lo facciamo nei termini del mondo del modello, anche prima di pensare a come verrà reso. La telecamera è stata aggiunta a un certo punto, probabilmente fatta per volare in giro in modo pazzesco, ed è un'infrastruttura invisibile che converte il modello in pixel che all'interno del suo intestino devono essere girati 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 = down. Questo è usato ancora oggi in tutti i sistemi di finestre e gestori di finestre - X11, fvwm, gtk +, API Win31, ecc. Come i nuovi sistemi di GUI 3D come Clutter, Beryl ecc. Si occupano di Z, è un problema separato dalla modellazione grafica 3D. Questa esigenza riguarda solo i programmatori di applicazioni e i progettisti della GUI.

    
risposta data 07.12.2010 - 00:00
fonte
10

Sono entrambi sostanzialmente equivalenti, in quanto uno può essere facilmente trasformato nell'altro. L'unico vantaggio che posso trovare per il sistema mancino è: 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 sull'altro.

POV-Ray utilizza anche un sistema di corridoio mancino.

    
risposta data 07.11.2010 - 22:28
fonte
10

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

I [...] was asked to choose a handedness for the Direct3D API. I chose a left handed coordinate system, in part out of personal preference. [...] it was an arbitrary choice.

Fonte: link

    
risposta data 23.07.2013 - 13:27
fonte
5

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

Tutto ciò è andato via quando i sistemi di coordinate della mano destra sono diventati lo standard del settore.

Ci sono già abbastanza sistemi di coordinate di uso comune, senza raddoppiare il numero introducendo una domanda sulle mani. Vedi Minkler & Minkler, "Sistemi di coordinate aerospaziali e trasformazioni" . Se ti trovi nel settore delle coordinate aerospaziali, ad es. simulazione di volo, HAI BISOGNO quel libro.

La mia ipotesi è che Microsoft non avesse NESSUNO sul progetto DirectX che sapeva qualcosa sugli standard del settore, non si rendeva conto che esisteva uno standard del settore e pensava che non fosse importante.

L'altra possibilità, che sapevano che i sistemi destrorsi erano lo standard del settore, e deliberatamente hanno fatto mancini a DirectX, così da rendere HARD per le persone la conversione del codice che utilizzava DirectX per usare OpenGL, non supporta considerazione. Se dovessi scoprire che questo era davvero il caso, troverei necessario intraprendere una nuova e presumibilmente carriera di breve durata come ascia-assassino a Redmond.

    
risposta data 08.11.2010 - 09:46
fonte
5

La vera risposta alla mancata disponibilità di Direct3D è molto meno sinistra di quanto alcuni di voi stiano ipotizzando. DirectX ha avuto inizio quando Microsoft ha acquistato RenderMorphics nel 1995.

All'epoca il testo grafico standard utilizzato negli uffici RenderMorphics era "Principles of Interactive Computer Graphics" di Newmann e Sproul, che fa tutto usando le coordinate della mano sinistra. È lo stesso libro che ho usato al college. Osservando il codice D3D potresti persino vederli usando nomi variabili che corrispondono alle equazioni nel libro.

Non è una cospirazione Microsoft. La decisione è stata presa prima che Microsoft entrasse nella foto.

    
risposta data 18.01.2013 - 02:31
fonte
4

A tutti quelli che pensano che non ci siano vantaggi per la mancina o per mancini, hai assolutamente torto. La destrezza dei sistemi di coordinate cartesiane deriva dalla definizione del prodotto vettoriale trasversale. 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 interazioni elettromagnetiche. Hai un vettore di campo magnetico, M , e una particella carica si muove in quel campo con velocità v . In che modo la carica accelera? Facile - nella direzione di M X v . Tranne qualche idiota ha pensato che sarebbe stato divertente rendere il tuo sistema di visualizzazione mancino, quindi accelera in direzione di -M X v .

Sostanzialmente qualsiasi interazione fisica tra due quantità di vettori è definita come destrorsa, quindi ogni volta che hai bisogno di simulare quell'interazione, è meglio che speri che il tuo sistema grafico sia destrorso o che dovrai ricordare al carrello intorno segni negativi in tutti i tuoi calcoli.

    
risposta data 20.06.2012 - 14:19
fonte
3

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

  • C'è un consenso abbastanza ampio nell'informatica e in altri campi per fare in modo che l'asse X funzioni da sinistra verso destra (le aviation apparentemente sono un'eccezione notevole).
  • In matematica, l'asse Y punta verso l'alto. (Inoltre, Up Is Where The Bubbles Go).
  • Sul display del computer, l'asse Y punta verso il basso (perché è così che funzionano gli schermi CRT, e anche perché è l'ordine in cui la maggior parte degli script umani organizza righe).
  • Quando guardi il lato "visibile" di una superficie nel piano X / Y, il normale dovrebbe puntare verso lo spettatore (ad esempio quando guardi il metraggio satellitare, i punti "altezza sopra il livello del mare" al satellite , non al centro della Terra). Poiché il normale per il piano X / Y è il vettore dell'asse Z, segue che l'asse Z dovrebbe puntare anche verso il visualizzatore.
  • Quando guardi le immagini 3D sullo schermo di un computer, i punti più lontani dallo spettatore dovrebbero avere un componente Z più grande. Quindi, l'asse Z dovrebbe puntare sullo schermo.

Conclusione : c'è un certo consenso per l'asse X, ma per gli altri due, entrambe le direzioni possono essere discusse, dando due configurazioni destrorse e due mancini, e tutte fanno senso.

    
risposta data 23.08.2011 - 13:17
fonte
3

Fatto interessante.

Direct3D (non DirectX - DirectX copre anche input, suoni, ecc.) non ha un sistema di coordinate mancino.

È perfettamente in grado di supportare entrambi i sistemi RH e LH. Se si guarda nella documentazione dell'SDK, verranno visualizzate funzioni come D3DXMatrixPerspectiveFovLH e D3DXMatrixPerspectiveFovRH. Entrambi funzionano e producono entrambi una matrice di proiezione che può essere utilizzata con successo con il sistema di scelta coordinata. Diavolo, puoi anche usare la colonna principale in Direct3D, se lo desideri; è solo una libreria di matrix software e non è necessario utilizzarla. D'altra parte, se vuoi usarlo con OpenGL scoprirai che funziona anche perfettamente con OpenGL (che è forse la prova definitiva dell'indipendenza della libreria della matrice da Direct3D stesso).

Quindi, se si desidera utilizzare un sistema RH nel proprio programma, basta usare la versione -RH della funzione. Se si desidera utilizzare un sistema LH, utilizzare la versione -LH. Direct3D non si preoccupa. Allo stesso modo, se si desidera utilizzare un sistema LH in OpenGL - solo glLoadMatrix una matrice di proiezione LH. Nessuna di queste cose è importante e non si avvicina nemmeno all'enorme problema che a volte lo si vede.

    
risposta data 17.05.2012 - 00:28
fonte
0

Non c'è alcun vantaggio tecnico per entrambe le mani, è completamente arbitrario. Entrambi funzionano bene finché sei coerente.

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

Quindi penso che la risposta di base a questa domanda sia: hanno scelto ciò che hanno scelto perché ritenuto giusto (senza dubbio avevano alcune precedenti esperienze con quella mano) e c'era poco motivo per non farlo.

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

    
risposta data 22.01.2012 - 03:55
fonte
0

Fornire questo materiale supplementare alla mia precedente risposta qui. Da una vecchia spec. OpenGL degli anni '90:

OpenGL does not force left-or right-handedness on any of its coordinates systems.

(fonte: link ).

Quindi, dal momento che né D3D né OpenGL impongono alcuna consegna, la vera domanda è: perché la gente vede questo come qualcosa di un grosso problema?

    
risposta data 01.07.2012 - 21:18
fonte
-1

Detesto dirtelo, ma la "mano" di un insieme di coordinate è in realtà soggettiva, dipende da come immagini che stai guardando le cose. Un esempio, dalle specifiche della mappa cubo OpenGL: se immagini di essere all'interno del cubo che guarda fuori, il sistema di coordinate è mancino, se pensi di guardare dall'esterno è destrorso. Questo semplice fatto causa un dolore infinito, perché per ottenere una risposta numericamente corretta tutte le tue ipotesi devono essere coerenti, anche se a livello locale non importa quale assunto tu faccia.

Le specifiche OpenGL sono ufficialmente "neutralità della mano" e fanno di tutto per evitare questo problema, cioè per rimandare il programmatore. Tuttavia c'è un "cambio di mano" tra le coordinate dell'occhio e le coordinate della clip: nello spazio del modello e dell'occhio che stiamo osservando, nella clip e nello spazio del dispositivo stiamo guardando fuori. Sono sempre alle prese con le conseguenze di questa senza dubbio complicazione accidentale.

Il prodotto incrociato è un nostro amico, perché consente di generare un sistema di coordinate 3D decisamente destrorso o mancino da una coppia di vettori. Ma quale mano dipende da quale di quei vettori chiami "X".

    
risposta data 10.01.2013 - 22:26
fonte
-3

Potrei dire che lo standard di settore è sbagliato dal primo posto

Lo standard di settore delle coordinate in realtà deriva dalle coordinate della scrivania, quando le persone disegnano tutto sulla scrivania, che è un piano orizzontale. X è sinistra / destra e Y è anteriore / posteriore, quindi basta che Z sia verso l'alto e che sia nato il sistema di coordinate a destra.

Ma Sai Ora usiamo con lo schermo del monitor È un piano verticale. X è ancora sinistra / destra, ma Y è l'alto e basso invece

Quindi quale sistema di coordinate a destra potrebbe causare? Fa + Z essere indietro e -Z essere avanti Che diavolo è questo? Su è + e Giù è - La destra è + e la sinistra è - BUT Forward è - e Backward è + ??? È così stupido se realizziamo un gioco con quel personaggio che gira nel mondo 3D, ma abbiamo bisogno di meno z per andare avanti. Ecco perché il programmatore di giochi apprezza maggiormente DirectX

Prendere uno standard che proviene dalla scrivania e usarlo sul monitor è così sbagliato a molti livelli fin dal primo posto. E ora dovremmo ammettere che loro, OpenGL e Industria, hanno torto. Usano solo quello che pensano che li renderebbe comodi ma sono sbagliati e il sistema di coordinate a destra è solo un'eredità spazzatura che dovrebbe essere buttata via il più velocemente possibile

    
risposta data 26.07.2013 - 19:18
fonte

Leggi altre domande sui tag