Perché DirectX utilizza un sistema di coordinate per mancini?


52

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 nello schermo, lontano dallo spettatore.

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'è 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?


5
Questo sembra chiedere perché l'arabo e l'ebraico siano scritti da destra a sinistra, mentre ogni altra lingua è da sinistra a destra.
Gabe,

17
Sto solo cercando di capire perché c'è un'incongruenza così evidente tra le API grafiche, che condividono una solida base in matematica. La direzione degli alfabeti semitici non è decisamente fondata su regole immutabili.
Greyfade,

3
Questa domanda è stata citata in Perché non assumiamo programmatori .NET (25-03-2011).
Peter Mortensen,

2
Né OpenGL né Direct3D sono puramente destrorsi o mancini. Le modifiche precedenti allo spazio della mano sinistra nello spazio della clip mentre lo spazio dello schermo del secondo è destro, ovvero nello spazio dello schermo di D3D, la rotazione da X a Y se vista dal lato + Z è una rotazione antioraria. E entrambi i sistemi consentono agli sviluppatori di impiegare spazi di entrambe le chiralità.
legends2k,

1
@PeterMortensen È abbastanza divertente come tutti gli odiatori di .NET non sappiano nemmeno cosa sia. Ciò a cui probabilmente si riferiscono è ASP.NET Webforms, il framework. .NET può essere descritto come la libreria di classi base e CLR.
The Muffin Man,

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 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. Glide di 3dfx Interactive (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 (il software di rendering Pixar) usano anche un sistema di coordinate per mancini.
  4. DirectX 9+ può funzionare con entrambi i sistemi di coordinate.
  5. Sia WPF che XNA (che funzionano con DirectX sotto le scene) utilizzano un sistema di coordinate destrorso.

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 tempo in cui tutti hanno fatto le cose a modo loro e probabilmente gli sviluppatori 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.


11
DirectX è un bambino in abiti a fasce rispetto alla computer grafica 3D, ed è relativamente giovane rispetto ai programmi per computer che devono gestire più sistemi di coordinate 3D e trasformarsi tra loro. Era la metà degli anni '70 quando ho preso la lezione di grafica per la prima volta, e ANCHE allora l'istruttore (Frank Crow) ci stava spingendo fortemente a usare esclusivamente i sistemi di coordinate per destrimani. Nel 1983 stavo svolgendo un lavoro senza grafica, ma con trasformazioni di coordinate in corso e una prima regola obbligatoria era il PRIMO memo del progetto emesso. (E non l'ho emesso!)
John R. Strohm,

7
Non sono sicuro che l'età abbia qualcosa a che fare con esso. La maggior parte delle scienze fisiche non ha usato un sistema di coordinate destrorso, e lo sono da molti, molti più anni di quanto non esistano i computer? Direi che è una convenzione molto più antica di quelle seguite da Glide e poi DX.
Thomas Owens

3
Solo perché uno standard è utilizzato negli studiosi non significa che sarà lo stesso in applicazioni industriali / altre. Le persone seguono tutto ciò che viene utilizzato nel proprio campo, dopo tutto. Altrimenti i sistemi grafici avrebbero la loro origine nell'angolo in basso a sinistra dello schermo anziché in alto a sinistra. Inoltre, il punto sull'età è che DX è nato quando l'intera cosa del "rendering 3D per il desktop" era ancora nuova, e gli "standard" e le "migliori pratiche" dovevano ancora essere messi a punto.
Kyte,

1
a) Quindi tu chiami la mia risposta, che è un semplice elenco di fatti dimostrabili e ciò che chiamo esplicitamente la mia speculazione personale, "superstiziosa" e "priva di fondamento nei fatti", quando la tua offerta è un'accusa di comportamento scorretto aziendale senza citazione o sostegno di sorta? b) Se non ti piace la mia risposta, puoi sempre dare la tua. Quando ho dato questa risposta, la risposta accettata aveva già un anno. Sei libero di aggiungere ulteriori conoscenze, se ritieni di avere qualcosa da contribuire. c) È difficile creare un monopolio quando il tuo punto d'appoggio sul mercato è traballante. Questa non è la moderna SM multinazionale.
Kyte,

2
@Kyte 3Dfx aveva API proprietarie per un motivo specifico, per bloccarti nel loro hardware. Hanno costretto gli utenti finali ad acquistare il loro hardware perché gli sviluppatori sono stati "corrotti" per scrivere giochi che funzionavano solo con 3Dfx. Microsoft voleva bloccarti nella loro API in modo che gli sviluppatori scrivessero solo giochi per Windows, questo alla fine ha ucciso 3Dfx. Decisioni aziendali chiare e semplici, non comportamenti scorretti. Questo succede ancora oggi. Nvida vuole che ti blocchi nelle loro carte con CUDA, AMD vuole usare OpenCL, 2012 stesso ragionamento alla base del comportamento. Questa è storia, all'epoca ero nel settore.

37

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 uno . Quindi la + Z si sta allontanando 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 è di funzionare in un sistema di coordinate per mancini . 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 . 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.


4
Davvero interessante. Confesso di non aver mai guardato così da vicino. Mentre la mia domanda riguarda specificamente lo spazio mondiale, la tua risposta mi dà spunti di riflessione.
Greyfade,

Ho scoperto che cambiare la gamma di profondità o il test di profondità ha reso la mano destra, ma usando entrambi annullati vicendevolmente dandomi un sistema per mancini.
hultqvist,

1
Intrigante. Guarda la trasformazione della profondità della finestra: z_wiewport = z_clip * (molto vicino) / 2 + (vicino + lontano) / 2. Ciò fa sì che lo spazio della clip -1 sia mappato sul vicino e +1 sul lontano. Quindi lo spazio di clip stesso può essere considerato a SINISTRA , anche se è comunque possibile invertire il modo in cui è mappato alla finestra in un secondo momento.
Kos,

1
@NicolBolas: Hai notato che anche Direct3D non è puramente mancino poiché lo spazio dello schermo è destrorso? X da sinistra a destra, Y dall'alto verso il basso e Z lontano dallo spettatore, ovvero da X a Y è una rotazione in senso antiorario se vista dall'opposto all'asse Z.
legends2k,

1
@bobobobo "Ho notato che la matrice di visualizzazione generata da gluLookAt può anche cambiare la mano" - No, non lo è. È così che viene calcolato il vettore in avanti, ma questa matrice è tuttavia una normale trasformazione del corpo rigido nello spazio per la mano destra (e in effetti + z è effettivamente "arretrato" nello spazio per la mano destra). La negazione del vettore in avanti non ha nulla a che fare con la modifica della mano dello spazio delle coordinate.
Chris dice di reintegrare Monica

11

È pura storia. Nei tempi antichi i primi programmatori di grafici 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 orco verde o una galassia in sovrappeso. 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.


1
Tutto molto interessante, e certamente spiega la logica alla base della GL di SGI. ... Ma come si spiega che DirectX è mancino?
Greyfade,

Diversi sistemi 2D e 3D hanno tutti derivato le loro convenzioni da una storia comune.
DarenW,

10

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 corridnate per mancini.


5
Sì, penso che molti neofiti della grafica trovino la z che aumenta con la profondità dello schermo in modo più naturale. Ma vogliono anche che x aumenti verso destra e y verso l'alto, stile "assi del grafico". Questo ottiene loro un sistema di coordinate per mancini. Solo più tardi, quando provano a fare cose più complesse, si rendono conto di essere in disaccordo con il mondo destro della scienza / matematica / ingegneria.
giorno

6
@Timday, devi insegnare ai neofiti la segreta non grafica stretta di mano 3D. Tieni la mano destra, con pollice, indice e medio distesi, tutti ad angolo retto l'uno rispetto all'altro. Il pollice è X, l'indice è Y, il dito medio è Z. Ora muovi la mano in giro, per allinearti con le coordinate che vuoi, e sai immediatamente come il movimento influenzerà le trasformazioni.
John R. Strohm,

3
@John: Ehi, indovina un po ', anche i fisici hanno la stessa stretta di mano segreta!
giorno

1
@John Anche se concordo pienamente con i vantaggi di un sistema per mancini, sai che la regola della stretta di mano (che tutti avrebbero dovuto imparare a scuola) può essere usata anche con la mano sinistra per il sistema per mancini.
Chris dice di reintegrare Monica il

@ChristianRau, quale mano usi dipende dal tipo di sistema di coordinate che stai cercando di descrivere, con la mano destra o con la mano sinistra.
John R. Strohm,

10

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 per preferenza personale . [...] è stata una scelta arbitraria .

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


È una scelta arbitraria solo se non si ha idea di cosa stia facendo il resto del mondo, che il resto del mondo ha di fatto standardizzato i sistemi di coordinate destrorsi per la grafica.
John R. Strohm,

1
@ JohnR.Strohm - hai mai letto l'articolo collegato?
Maximus Minimus,

Link-rot ha mangiato quella pagina. Ecco l'ultima istantanea di lavoro: web.archive.org/web/20161101112002/http://www.alexstjohn.com/WP/…
Max Barraclough

5

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 esempio simulando il volo, AVETE 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 DURO la conversione del codice che utilizzava DirectX per usare OpenGL, non tiene conto. Se dovessi scoprire che questo era davvero il caso, troverei necessario intraprendere una nuova e presumibilmente breve vita come assassino d'ascia a Redmond.


Non volevo venire a colpire Microsoft nella mia domanda, quindi non volevo menzionare la possibilità che fosse in incompatibilità con OpenGL.
greyfade,

3
@greyfade: OK, allora lasciami dire così. Non vi è alcun motivo tecnico di preferire le coordinate per mancini a quelle per mancini, o viceversa. Tuttavia, al giorno d'oggi ci sono ottime ragioni per preferire le coordinate per la mano destra e per scavare, sbandare e cavalcare fuori città su una ferrovia chiunque sussurri persino un suggerimento di implementare qualcosa usando le coordinate per la mano sinistra. Questo lo rende più semplice?
John R. Strohm,

Non so che potrei raccogliere una quantità di giusta indignazione su di esso. Lavoro con PostScript abbastanza regolarmente come parte del mio lavoro (in cui le coordinate iniziano con [0, 0] come angolo in basso a sinistra e si estendono al massimo in alto a destra), quindi la conversione delle coordinate è solo una sorta di fatto della vita qui intorno.
Inaimathi,

2
Allora, questa è una speculazione al 100% allora? Perché è contrassegnato come risposta?
Factor Mystic,

3
Mi picchia, è solo una sfuriata inutile e, ironia della sorte, come il sistema di coordinate per mancini, molte persone lo hanno seguito per qualche motivo.
Rapido Joe Smith il

5

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 XYZ vettori di base u, ve 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 Me 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 proprio sistema grafico sia destrorso o che sarà necessario ricordare di aggirare i segni negativi in tutta la tua matematica.


L'elettromagnetismo non è l'unico posto in cui si presenta il prodotto incrociato. Si presenta anche in aerodinamica e meccanica orbitale. La simulazione del volo deve occuparsene, ed è qui che si scontrano i sistemi di coordinate fisiche e i sistemi di coordinate grafiche. Vedi Minkler e Minkler, citati nella mia risposta sopra.
John R. Strohm,

@ Tom: non sono sicuro che sia vero; prendi 3 vettori dire (1, 0, 0), (0, 1, 0) e (0, 0, 1), eseguendo ixj dà k poiché la formula per prodotto incrociato è ben definita e i numeri non ne hanno chiralità / manualità; è solo l'essere umano che interpreta i tre vettori in una certa mano, anche allora potremmo scegliere di interpretarlo in entrambe le mani e sarà comunque coerente, cioè in un ixj = k mancino sarà via mentre nel braccio destro ixj = k sarà verso. Intendiamoci, anch'io sono un braccio destro, ma questo è ancora il fatto.
legends2k,

@ legends2k: Sì, immagino sia vero, purché tu non voglia che i tuoi numeri significhino nulla. Non appena vuoi che i tuoi numeri rappresentino un'interazione fisica, o le coordinate in un sistema di visualizzazione, o in realtà qualsiasi cosa, allora conta molto.
Tom,

@Tom Hai ragione sul fatto che dobbiamo dare un significato al numero. Questo conta davvero. Ma questo non è ancora il motivo per dire che la mano sinistra è sulla mano destra. Potrei dare un significato a 0,0,1come andare avanti e che è mancino quindi 1,0,0 X 0,1,0make 0,0,1è mano sinistra
Thaina,

@Tom In realtà quando si fa la fisica in un sistema di coordinate per mancini la formula è ferma M X vma il campo magnetico Mè considerato puntare nella direzione opposta perché è uno pseudovettore. Puoi usare le stesse equazioni in entrambi i sistemi: l'unica cosa che cambia è la tua interpretazione del modo in cui gli pseudovettori "puntano". Vettori adeguati come l'accelerazione funzioneranno sempre allo stesso modo in entrambi i sistemi di coordinate. it.wikipedia.org/wiki/Pseudovector#The_right-hand_rule
Oscar Benjamin

5

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.


Sono d'accordo con un commento qui che suona come una leggenda urbana, ma è bello avere la tua prospettiva personale.
Josiah Yoder,

3

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, puntando verso 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 gli schermi 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 : c'è 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

Fatto interessante.

Direct3D (non DirectX - DirectX copre anche input, audio, ecc.) In realtà non ha un sistema di coordinate per mancini.

È perfettamente in grado di supportare entrambi i sistemi RH e LH. Se guardi nella documentazione dell'SDK vedrai funzioni come D3DXMatrixPerspectiveFovLH e D3DXMatrixPerspectiveFovRH. Entrambi funzionano ed entrambi producono una matrice di proiezione che può essere utilizzata con successo con il proprio sistema di coordinate di scelta. Diavolo, puoi anche usare il maggiore colonna in Direct3D se lo desideri; è solo una libreria di matrici software e non è necessario utilizzarla. 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 si desidera utilizzare un sistema LH, utilizzare la versione -LH. A Direct3D non importa. Allo stesso modo, se si desidera utilizzare un sistema LH in OpenGL, basta glLoadMatrix una matrice di proiezione LH. Nessuna di queste cose è importante ed è in nessun posto vicino all'enorme problema che a volte vedi che è stato scoperto.


0

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é non c'è nemmeno una convenzione "preferita" schiacciante in pratica: 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

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?


1
perché l'hai pubblicato in una risposta separata? Voglio dire, potresti modificare la tua risposta precedente per aggiungere questo, no?
moscerino

-1

Odio dirtelo, ma la "mano" di un insieme di coordinate è in realtà soggettiva - dipende dal modo in cui immagini di guardare le cose. Un esempio, dalle specifiche della mappa del cubo OpenGL: se immagini di essere all'interno del cubo guardando fuori, il sistema di coordinate è mancino, se pensi di guardare dall'esterno è destrorso. Questo semplice fatto provoca un dolore senza fine, perché per ottenere una risposta numericamente corretta tutte le tue assunzioni devono essere coerenti, anche se a livello locale non importa quale ipotesi tu faccia.

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

Il prodotto incrociato è nostro amico, perché ti 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 chiamate "X".


3
Il prodotto incrociato è anticommutativo. A x B == - B x A. In quanto tale, un prodotto incrociato è definito per prendere un primo vettore non collineare e un secondo vettore, scritti in quell'ordine e produrre un terzo vettore, normale al piano contenente il primo e il secondo vettore e di una direzione appropriata per creare un sistema di coordinate destrorso quando i vettori sono elencati nell'ordine (primo, secondo, risultato). Se scegli di pervertirlo, sentiti libero, MA AVVISO: se lo fai intorno a me, faresti meglio a goderti catrame, piume e schegge nel culo dal tuo viaggio in treno fuori città.
John R. Strohm,

Abbastanza bene, John; ma devi ancora affrontare il fatto che tale perversione è possibile, il che significa che non esiste una cosa come "assoluta mano destra", il che significa che spetta ancora a te e me ottenere i segni giusti.
Thomas Sharpless,

-3

Potrei dire che lo standard del settore è sbagliato sin dall'inizio

Lo standard industriale delle coordinate proviene effettivamente dalle coordinate della scrivania, quando le persone disegnano tutto sulla scrivania, che è un piano orizzontale. X è sinistra / destra e Y è anteriore / posteriore, quindi fa semplicemente Z essere verso l'alto e nasce il sistema di coordinate per destrimani

Ma sai che ora stiamo usando con lo schermo monitor È piano verticale. X è ancora sinistra / destra ma Y è invece su e giù

Quindi quale sistema di coordinate destrorso provocherebbe? Fa + Z essere indietro e -Z essere avanti Che diavolo è questo? Su è + e Giù è - Destra è + e Sinistra è - MA avanti è - e Indietro è + ??? È così stupido se stiamo realizzando quel personaggio in esecuzione nel mondo 3D, ma abbiamo bisogno di meno z per andare avanti. Ecco perché il programmatore di giochi apprezza molto DirectX

Afferrare uno standard proveniente dalla scrivania e usarlo sul monitor è così sbagliato in molti livelli dal primo posto. E ora dovremmo ammettere che loro, OpenGL e Industry, hanno torto. Usano solo ciò che pensano che li metterebbe a proprio agio, ma hanno torto e il sistema di coordinate destrorso è solo un'eredità spazzatura che dovrebbe essere gettata via il più velocemente possibile


2
-1 per ignoranza. La convenzione della mano destra proviene dalla fisica e dalla matematica, in particolare dall'operazione tra prodotti vettoriali, che è fondamentale per la teoria dei campi elettromagnetici e per la meccanica. L'informatica lo adottò perché l'uso originale dei computer era di sgretolare i numeri.
John R. Strohm,

Dovrebbe invece -1 per la tua ignoranza. Come ho detto "fisica coordinata" fisica e matematica ai vecchi tempi lavorano sempre sulla scrivania, non sul monitor, quindi l'ho chiamata "coordinata sulla scrivania" perché calcoli la fisica e la matematica sulla scrivania orizzontale
Thaina
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.