Quali sono le librerie matematiche / algebra lineare / vettoriale C ++ più utilizzate e i loro compromessi in termini di costi e benefici? [chiuso]


243

Sembra che molti progetti lentamente prendano la necessità di fare matematica a matrice, e cadono nella trappola della prima costruzione di alcune classi vettoriali e aggiungendo lentamente funzionalità fino a quando non vengono catturati mentre costruiscono una libreria di algebra lineare personalizzata a metà culo, e a seconda di essa.

Mi piacerebbe evitarlo, pur non basandomi su una libreria tangenzialmente correlata (ad esempio OpenCV, OpenSceneGraph).

Quali sono le librerie matematiche / algebriche lineari comunemente usate là fuori, e perché dovrebbero decidere di usarle una sopra l'altra? Ci sono alcuni che potrebbero essere sconsigliati di utilizzare per qualche motivo? Sto specificatamente usando questo in un contesto geometrico / temporale * (2,3,4 Dim) *, ma in futuro potrei usare dati di dimensione superiore.

Sto cercando differenze rispetto a uno qualsiasi di: API, velocità, uso della memoria, ampiezza / completezza, ristrettezza / specificità, estensibilità e / o maturità / stabilità.

Aggiornare

Ho finito per usare Eigen3 di cui sono estremamente soddisfatto.


2
Dato che hai menzionato OSG e OpenCV, suppongo che tu abbia bisogno solo del tipo di grafica 3D vettoriale / matrici, cioè: matrici 3x3 e 4x4. Ho basato la mia risposta su questo, ma potresti voler specificare esattamente come lo stai usando: hai bisogno di una matrice di risoluzione? Matematica a matrice dimensionale superiore? ecc.
Reed Copsey,

In questo momento sto solo facendo cose basate sulla geometria 2D, ma ipoteticamente a volte hai bisogno di operazioni 3x3 su dati 2D, e non è chiaro se potrebbero essere necessari dati 3D e quindi operazioni 4x4. Vorremmo utilizzare una biblioteca comune in tutta l'azienda. Non ho un buon senso per quello che sarebbe il compromesso. Più generale sarebbe meglio, ma a quale costo è la domanda.
Catskul,

1
Se stai solo facendo trasformazioni geometriche, consiglierei davvero di guardare GGT, come ho già detto nella mia risposta. È molto completo, ma in realtà non fa nulla MA, quindi è un'opzione molto pulita e facile. BLAS e LAPACK sono più per soluzioni a matrice complessa doign (es. Matrici 50x50, matrici sparse, ecc.) Per la scienza e la matematica, non trasformazioni geometriche.
Reed Copsey,

Risposte:


114

Ci sono alcuni progetti che hanno optato per il Generic Graphics Toolkit per questo. Il GMTL è bello - è abbastanza piccolo, molto funzionale ed è stato usato abbastanza ampiamente per essere molto affidabile. OpenSG, VRJuggler e altri progetti sono passati a utilizzare questo invece del proprio matematico a matrice / verificatore a rotazione manuale.

L'ho trovato abbastanza bello: fa tutto tramite i modelli, quindi è molto flessibile e molto veloce.


Modificare:

Dopo la discussione dei commenti e le modifiche, ho pensato di aggiungere alcune informazioni in più sui vantaggi e gli svantaggi di implementazioni specifiche e sul motivo per cui potresti scegliere l'una rispetto all'altra, data la tua situazione.

GMTL -

Vantaggi: API semplice, progettata appositamente per i motori grafici. Include molti tipi primitivi orientati al rendering (come piani, AABB, quatenrioni con interpolazione multipla, ecc.) Che non sono presenti in nessun altro pacchetto. Overhead di memoria molto basso, abbastanza veloce, facile da usare.

Lati negativi: l'API si concentra in particolare sul rendering e sulla grafica. Non include matrici per scopi generici (NxM), decomposizione e risoluzione di matrici, ecc., Poiché sono al di fuori del regno delle tradizionali applicazioni grafiche / geometriche.

Eigen -

Vantaggi: API pulite , abbastanza facili da usare. Include un modulo Geometry con quaternioni e trasformazioni geometriche. Overhead di memoria insufficiente. Soluzione completa e altamente performante di matrici NxN di grandi dimensioni e altre routine matematiche di uso generale.

Lati negativi: potrebbe essere un ambito un po 'più ampio di quello che desideri (?). Meno routine geometriche / di rendering specifiche rispetto a GMTL (ovvero: definizioni dell'angolo di Eulero, ecc.).

IMSL -

Vantaggi: libreria numerica molto completa. Molto, molto veloce (presumibilmente il risolutore più veloce). L'API matematica di gran lunga più ampia e completa. Supportato commercialmente, maturo e stabile.

Lati negativi: costo - non economico. Pochissimi metodi specifici di geometria / rendering, quindi dovrai implementare il tuo sopra le loro classi di algebra lineare.

NT2 -

Vantaggi: fornisce una sintassi più familiare se si è abituati a MATLAB. Fornisce decomposizione e risoluzione complete per matrici di grandi dimensioni, ecc.

Lati negativi: matematica, non focalizzata sul rendering. Probabilmente non è così performante come Eigen.

LAPACK -

Vantaggi: algoritmi molto stabili e comprovati. Sono in giro da molto tempo. Risoluzione matrice completa, ecc. Molte opzioni per la matematica oscura.

Lati negativi: in alcuni casi non altrettanto performanti. Portato da Fortran, con API dispari per l'uso.

Personalmente, per me, si tratta di una singola domanda: come pensi di usarlo. Se ti concentri solo sul rendering e sulla grafica, mi piace Generic Graphics Toolkit , poiché funziona bene e supporta molte utili operazioni di rendering pronte all'uso senza dover implementare le tue. Se hai bisogno di una risoluzione matrice generale (es: decomposizione SVD o LU di matrici di grandi dimensioni), andrei con Eigen , dal momento che gestisce ciò, fornisce alcune operazioni geometriche ed è molto performante con soluzioni a matrice di grandi dimensioni. Potrebbe essere necessario scrivere più operazioni grafiche / geometriche (in cima alle loro matrici / vettori), ma non è orribile.


Hai valutato altre biblioteche prima di decidere su GMTL? Il confronto superficiale mi porta a credere che Eigen sia stato meglio supportato, ma questo è sulla base della revisione dei rispettivi siti Web. Sei a conoscenza di vantaggi specifici dell'uno rispetto all'altro?
Catskul,

Anche Eigen funziona bene. Non era così maturo al momento in cui ho fatto le mie indagini, ma credo che sarebbe una buona opzione a questo punto. GMTL è stato usato abbastanza ampiamente ed era molto maturo e solido quando ho deciso di usarlo.
Reed Copsey,

Immagino di limitare la mia domanda al vero nocciolo: hai fatto la tua scelta soggettivamente come "Questo sembra migliore" o dove ci sono caratteristiche specifiche (api, velocità, uso della memoria, ampiezza, ristrettezza, estensibilità) che hanno fatto la differenza. Suppongo che la maturità rientri in questi criteri, ma se la maturità fosse l'unica metrica, immagino che avresti selezionato un'opzione basata su BLAS o LAPACK.
Catskul,

Ho scelto questo dopo aver provato più opzioni e basato su: prestazioni, usabilità e sovraccarico di runtime / tempo di compilazione basso. Eigen ora sembra molto meglio di quanto non abbia fatto a quel punto, quindi non posso giudicare tra di loro. Tuttavia, sono stato molto contento di GMTL per i nostri usi.
Reed Copsey,

Questo è parte del motivo per cui mi piace GMTL e l'ho usato. Sembrava molto naturale da usare ed era molto, molto facile da lavorare. Supportava anche tutto ciò di cui avevo bisogno, in questo caso, poiché ero solo preoccupato di gestire direttamente la trasformazione geometrica e le rotazioni del quaternione.
Reed Copsey,

38

Quindi sono una persona piuttosto critica e immagino che se ho intenzione di investire in una biblioteca, è meglio sapere in cosa mi sto cacciando. Immagino sia meglio approfondire le critiche e fare luce sull'adulazione quando scrutiamo; ciò che è sbagliato ha molte più implicazioni per il futuro di ciò che è giusto. Quindi esagererò un po 'per fornire il tipo di risposta che mi avrebbe aiutato e spero che possa aiutare gli altri che potrebbero percorrere questa strada. Tieni presente che questo si basa su quel piccolo esame / test che ho fatto con queste librerie. Oh e ho rubato parte della descrizione positiva di Reed.

Dico in alto che sono andato con GMTL nonostante sia idiosincrasie perché l'insicurezza di Eigen2 era troppo grande di un aspetto negativo. Ma recentemente ho imparato che la prossima versione di Eigen2 conterrà delle definizioni che spegneranno il codice di allineamento e lo renderanno sicuro. Quindi potrei cambiare.

Aggiornamento : sono passato a Eigen3. Nonostante siano idiosincrasie, la sua portata ed eleganza sono troppo difficili da ignorare e le ottimizzazioni che la rendono pericolosa possono essere disattivate con una definizione.

Eigen2 / Eigen3

Vantaggi: LGPL MPL2, API pulita, ben progettata, abbastanza facile da usare. Sembra essere ben mantenuto con una vivace comunità. Overhead di memoria insufficiente. Alte prestazioni. Creato per l'algebra lineare generale, ma è disponibile anche una buona funzionalità geometrica. Tutti i lib di intestazione, nessun collegamento richiesto.

Idiocincrazie / lati negativi: (Alcuni / tutti questi possono essere evitati da alcuni definiti che sono disponibili nell'attuale ramo di sviluppo Eigen3)

  • Ottimizzazioni delle prestazioni non sicure comportano la necessità di seguire attentamente le regole. La mancata osservanza delle regole provoca arresti anomali.
    • semplicemente non puoi passare in sicurezza il valore per valore
    • l'uso di tipi Eigen come membri richiede una personalizzazione dell'allocatore speciale (o si verifica un arresto anomalo)
    • utilizzare con i tipi di contenitore stl e possibilmente altri modelli richiesti personalizzazione dell'allocazione speciale (o si arresta in modo anomalo)
    • alcuni compilatori necessitano di cure speciali per prevenire arresti anomali durante le chiamate di funzione (finestre GCC)

GMTL

Vantaggi: LGPL, API abbastanza semplice, appositamente progettato per i motori grafici. Include molti tipi primitivi orientati al rendering (come piani, AABB, quatenrioni con interpolazione multipla, ecc.) Che non sono presenti in nessun altro pacchetto. Overhead di memoria molto basso, abbastanza veloce, facile da usare. Tutti basati su intestazione, nessun collegamento necessario.

Idiocyncracies / lati negativi:

  • L'API è bizzarra
    • quello che potrebbe essere myVec.x () in un'altra libreria è disponibile solo tramite myVec [0] (problema di leggibilità)
      • un array o stl :: vector of points può farti fare qualcosa come pointsList [0] [0] per accedere al componente x del primo punto
    • in un ingenuo tentativo di ottimizzazione, rimosso cross (vec, vec) e sostituito con makeCross (vec, vec, vec) quando il compilatore elimina comunque le temp inutili
    • le normali operazioni matematiche non restituiscono tipi normali a meno che non vengano disattivate alcune funzionalità di ottimizzazione, ad esempio: vec1 - vec2non restituisce un vettore normale, quindi length( vecA - vecB )non riesce anche se vecC = vecA - vecBfunziona. Devi avvolgere come:length( Vec( vecA - vecB ) )
    • le operazioni sui vettori sono fornite da funzioni esterne anziché da membri. Ciò potrebbe richiedere l'utilizzo della risoluzione dell'ambito ovunque poiché i nomi di simboli comuni potrebbero scontrarsi
    • devi fare
        length( makeCross( vecA, vecB ) )
      o
        gmtl::length( gmtl::makeCross( vecA, vecB ) )
      dove altrimenti potresti provare
        vecA.cross( vecB ).length()
  • non ben mantenuto
    • ancora rivendicato come "beta"
    • documentazione mancante di informazioni di base come quali intestazioni sono necessarie per utilizzare la normale funzionalità
      • Vec.h non contiene operazioni per i vettori, VecOps.h ne contiene alcuni, altri sono in Generate.h per esempio. cross (vec &, vec &, vec &) in VecOps.h, [make] cross (vec &, vec &) in Generate.h
  • API immature / instabili; ancora cambiando.
    • Ad esempio, "cross" è passato da "VecOps.h" a "Generate.h", quindi il nome è stato cambiato in "makeCross". Gli esempi di documentazione falliscono perché fanno ancora riferimento a vecchie versioni di funzioni che non esistono più.

NT2

Non posso dirlo perché sembrano essere più interessati all'intestazione dell'immagine frattale della loro pagina web rispetto al contenuto. Sembra più un progetto accademico che un serio progetto software.

Ultima versione oltre 2 anni fa.

Apparentemente nessuna documentazione in inglese anche se presumibilmente c'è qualcosa in francese da qualche parte.

Non riesco a trovare la traccia di una comunità attorno al progetto.

LAPACK E BLAS

Vantaggi: vecchio e maturo.

Svantaggi:

  • vecchi come i dinosauri con API davvero scadenti

1
Per quanto riguarda le affermazioni allineate di Eigen: per ottenere prestazioni elevate dalle operazioni SSE (1,2,3 o 4) per piccoli insiemi di dati, sono assolutamente necessari dati allineati. Le operazioni di caricamento / archiviazione non allineate sono molto più lente. Anche la decisione tra carico / magazzino allineati o non allineati richiede tempo. Qualsiasi implementazione di "scopo generale" avrebbe un momento davvero difficile fare la cosa giusta per tutti, a meno che non separassero l'interfaccia in operazioni "allineate" e "non allineate" - e quindi semplicemente non è uno scopo molto generale.
Joris Timmermans,

@Catskul Vorrei usare Eigen3. Potresti espandere "le ottimizzazioni che la rendono pericolosa possono essere disattivate con una definizione"? Gli altri problemi elencati in Eigen2 sono dettagliati nel documento in Argomenti correlati a problemi di allineamento . Posso convivere con questi problemi.
Ali,

I problemi con la sicurezza mi riferisco a tutti gli allineamenti relativi e sono gli stessi dell'Eigen2. Se stai bene con Eigen2, starai bene con Eigen3.
Catskul,

2
BLAS e LAPACK non sono in realtà librerie ma specifiche / API. avresti potuto citare le loro implementazioni iniziali da netlib o altre implementazioni come ATLAS e OpenBLAS.
Foad,

12

Per quello che vale, ho provato sia Eigen che Armadillo. Di seguito una breve valutazione.

Vantaggi di Eigen: 1. Completamente autonomo - nessuna dipendenza da BLAS o LAPACK esterni. 2. Documentazione decente. 3. Presumibilmente veloce, anche se non l'ho messo alla prova.

Svantaggio: l'algoritmo QR restituisce solo una matrice, con la matrice R incorporata nel triangolo superiore. Nessuna idea da dove provenga il resto della matrice e nessuna matrice Q è accessibile.

Vantaggi di Armadillo: 1. Ampia gamma di decomposizioni e altre funzioni (incluso QR). 2. Abbastanza veloce (usa i modelli di espressione), ma ancora una volta non l'ho spinto fino a dimensioni elevate.

Svantaggi: 1. Dipende da BLAS esterni e / o LAPACK per decomposizioni di matrici. 2. La documentazione manca di IMHO (compresi i dettagli relativi a LAPACK, oltre alla modifica di un'istruzione #define).

Sarebbe bello se fosse disponibile una libreria open source indipendente e semplice da usare. Ho incontrato questo stesso problema per 10 anni, e diventa frustrante. A un certo punto, ho usato GSL per C e ci ho scritto dei wrapper C ++, ma con il C ++ moderno - specialmente usando i vantaggi dei modelli di espressione - non dovremmo fare confusione con C nel 21 ° secolo. Solo il mio tuppencehapenny.


2
Armadillo ha una sintassi deliberata simile a Matlab, quindi è facile da usare. Non sono sicuro di cosa intendi per "manca la documentazione ... specifiche di LAPACK". La documentazione documenta chiaramente tutte le funzioni disponibili per l'utente, insieme ad esempi su come usarle. L'intero punto di una libreria wrapper C ++ è di sottrarre la complessità e la verbosità di LAPACK. Puoi sempre sfogliare la fonte se vuoi vedere come Armadillo chiama LAPACK.
Mt

A proposito della decomposizione QR in Eigen, intendi Eigen2 o Eigen3?
Qed

11

Se stai cercando matrice ad alte prestazioni / algebra lineare / ottimizzazione sui processori Intel, darei un'occhiata alla libreria MKL di Intel.

MKL è accuratamente ottimizzato per prestazioni di runtime veloci, in gran parte basate sugli standard fortran BLAS / LAPACK molto maturi. E le sue prestazioni si adattano al numero di core disponibili. La scalabilità a mani libere con core disponibili è il futuro dell'informatica e non utilizzerei alcuna libreria matematica per un nuovo progetto che non supporta processori multi-core.

Molto brevemente include:

  1. Operazioni base vettore-vettore, matrice-vettore e matrice-matrice
  2. Fattorizzazione a matrice (LU decomp, hermitian, sparse)
  3. Problemi di adattamento ai minimi quadrati e autovalori
  4. Solutori di sistema lineari sparsi
  5. Risolutore dei minimi quadrati non lineari (aree di trust)
  6. Più routine di elaborazione del segnale come FFT e convoluzione
  7. Generatori di numeri casuali molto veloci (mersenne twist)
  8. Molto di più .... vedi: link del testo

Un aspetto negativo è che l'API MKL può essere piuttosto complessa a seconda delle routine di cui hai bisogno. Puoi anche dare un'occhiata alla loro libreria IPP (Integrated Performance Primitives) che è orientata verso operazioni di elaborazione delle immagini ad alte prestazioni, ma è comunque abbastanza ampia.

Paolo

Software CenterSpace, librerie .NET per la matematica, centrespace.net


8

Ho sentito cose positive su Eigen e NT2 , ma non l'ho nemmeno usato personalmente. C'è anche Boost.UBLAS , che credo stia diventando un po 'lungo nel dente. Gli sviluppatori di NT2 stanno costruendo la prossima versione con l'intenzione di inserirla in Boost, quindi potrebbe contare qualcosa.

Mia lin. ALG. le esigenze non si esauriscono oltre il caso della matrice 4x4, quindi non posso commentare funzionalità avanzate; Sto solo sottolineando alcune opzioni.


Nella mia esperienza (matrici più grandi), Boost.UBLAS viene utilizzato di più. Tuttavia, quando l'ho esaminato, non mi è piaciuto (principalmente a causa della documentazione), quindi mi sono concentrato su Eigen. Eigen ha un modulo di geometria , ma non l'ho usato da solo.
Jitse Niesen,

Apparentemente Eigen è usato da ROS (garage del salice), Celestia, Koffice e libmv. Vedo delle chiacchiere su UBLAS, ma è stato difficile imbattersi in progetti che pubblicizzano utilizzandolo. Idem per NT2. Puoi approfondire quali cose buone hai sentito?
Catskul,

Durante una discussione sulla mailing list di Boost sull'aggiunta di una moderna libreria LinAlg a Boost - Eigen e NT2 sono stati entrambi citati come possibili candidati, ma solo gli sviluppatori di NT2 hanno espresso interesse nel perseguirla. Entrambe le biblioteche sembravano decenti; come hai detto, Eigen è un po 'più popolare, e anche più C ++; NT2 è progettato per imitare MATLAB il più possibile.
Jeff Hardy,

8

Sono nuovo su questo argomento, quindi non posso dire molto, ma BLAS è praticamente lo standard nell'informatica scientifica. BLAS è in realtà uno standard API, che ha molte implementazioni. Onestamente non sono sicuro di quali implementazioni siano più popolari o perché.

Se vuoi anche essere in grado di eseguire le comuni operazioni di algebra lineare (risoluzione di sistemi, regressione dei minimi quadrati, decomposizione, ecc.), Cerca in LAPACK .


7

Che dire di GLM ?

È basato sulla specifica OpenGL Shading Language (GLSL) e rilasciato sotto licenza MIT. Chiaramente rivolto ai programmatori grafici


bene, fornisce vettore di programmazione grafica e matrici. introduce una buona quantità di overhead per mantenere la conformità su GLSL (se puoi farlo in GLSL, la maggior parte delle volte farlo in GLSL è meglio specialmente con GL 4.x) e manca molti primitivi di programmazione grafica (frustum, AABB, BB, ellissoide ). La sua interfaccia swizzle è obesa. Un'alternativa molto migliore sarebbe se avesse funzioni ".xyzz ()" generate con una certa generazione di codice. È perfetto quando devi prototipare applicazioni opengl e inizia a mostrare i suoi lati negativi su progetti più grandi. mai codificare una libreria matematica.
CoffeDeveloper

5

Aggiungerò il voto per Eigen: ho portato un sacco di codice (geometria 3D, algebra lineare ed equazioni differenziali) da librerie diverse a questa - migliorando sia la prestazione che la leggibilità del codice in quasi tutti i casi.

Un vantaggio che non è stato menzionato: è molto facile usare SSE con Eigen, che migliora significativamente le prestazioni delle operazioni 2D-3D (dove tutto può essere riempito a 128 bit).


1
L'intera cosa "se lo fai, assicurati di ...", mi sembra una bandiera rossa. Finora ho incontrato due volte questi problemi e ho appena iniziato a usarlo. Speravo davvero di non gravare sui futuri sviluppatori per conoscere tutti i tipi di idiosincrasie di ogni libreria inclusa: in particolare i problemi di allineamento in cui si blocca se non si utilizzano determinate macro ogni volta che si hanno membri e il fatto che hanno diffuso funzionalità per singoli classi su più intestazioni. Da solo potrebbe non impedirmi di sceglierlo, ma viene inviato un po 'di una bandiera rossa.
Catskul,

1
L'allineamento e quella macro sono importanti solo se si utilizza SSE, il che non è assolutamente necessario. E se usi SIMD, questi problemi sorgeranno qualunque libreria tu usi. Almeno Eigen non solo si arresta in modo anomalo, ma fornisce messaggi di errore significativi che indicano direttamente il problema.
ima,

E c'è un modo semplice per evitare la macro di allineamento: utilizzare puntatori o riferimenti come membri.
ima,

1
Non penso sia vero. Non ho usato opzioni SSE speciali e ho avuto diversi arresti anomali dopo averlo usato con i contenitori stl. Sì, lo so che ti dà messaggi utili, e sì, so che ci sono istruzioni speciali, ma questo è il mio punto. Non voglio caricare altri sviluppatori con istruzioni speciali per ogni libreria inclusa. La cosa non passare in base al valore, ad esempio, è semplicemente troppo.
Catskul,

Ho appena scoperto che l'ultimo ramo di sviluppo ha alcune definizioni che è possibile utilizzare per disattivare l'allineamento ed evitare i problemi correlati.
Catskul,

4

Ok, penso di sapere cosa stai cercando. Sembra che GGT sia una soluzione abbastanza buona, come suggerito da Reed Copsey.

Personalmente, abbiamo creato la nostra piccola biblioteca, perché abbiamo a che fare con molti punti razionali: molti NURBS e Beziers razionali.

Si scopre che la maggior parte delle librerie di grafica 3D esegue calcoli con punti proiettivi che non hanno basi nella matematica proiettiva, perché è questo che ti dà la risposta che desideri. Abbiamo finito per usare i punti Grassmann, che hanno una solida base teorica e hanno ridotto il numero di tipi di punti. I punti di Grassmann sono fondamentalmente gli stessi calcoli che le persone usano ora, con il vantaggio di una solida teoria. Ancora più importante, rende le cose più chiare nelle nostre menti, quindi abbiamo meno bug. Ron Goldman ha scritto un articolo sui punti di Grassmann in computer grafica chiamato "Sulle basi algebriche e geometriche della computer grafica" .

Non direttamente correlato alla tua domanda, ma una lettura interessante.


È intenzionalmente aperto nel senso che non sono consapevole di quali siano i compromessi. Probabilmente è giusto affermare che la geometria è la nostra principale preoccupazione, la dimensionalità della geometria non è chiara. Attualmente è 2/3 (2 + tempo) e potrebbe essere ipoteticamente piuttosto elevato (3dims + time + multi-dim-cost-map).
Catskul,

Sono d'accordo con la domanda. Ad esempio, molte applicazioni di questo tipo richiedono prestazioni in tempo reale (comportamento a tempo costante), mentre molte altre rinunciano a coerenza e / o velocità per la precisione.
TED

Quindi stai dicendo che delle biblioteche che hai studiato, nessuna si è occupata di NURBS e Beziers? Qualche motivo particolare per non prendere una delle biblioteche esistenti e costruire il supporto NURBS e Bezier al suo fianco?
Catskul,

Quello che stavo cercando di dire è che NURBS e Beziers razionali usano punti di controllo razionali molto più della maggior parte delle applicazioni 3d, quindi abbiamo fatto più errori. In genere la maggior parte delle app 3d ha solo punti e vettori 3d alla vaniglia fino a quando non si passa alla trasformazione della prospettiva. Molti dei nostri algoritmi devono essere in grado di gestire correttamente i punti ponderati / razionali / proiettivi e cartesiani, andando avanti e indietro, ecc.
tfinniga,


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.