2011-02-03 22 views
6

Sto programmando vari strumenti di simulazione in C# /. NETLibreria grafica di alto livello

Quello che sto cercando è una libreria di visualizzazione di alto livello; creare una scena, con una macchina fotografica con alcuni controlli standard, e renderne alcune centinaia di migliaia di sfere, o alcuni wireframe. Quel genere di cose. Se impiega più di una riga per inizializzare un contesto, devia dal mio ideale.

Ive ha guardato slimDX, ma il suo livello è più basso di quello che sto cercando (almeno le parti documentate, ma non mi interessa davvero per nessun'altra). La prospettiva WPF sembrava interessante, ma sembra mirata alle scene definite XAML statiche, e anche questo non mi va bene.

Fondamentalmente, sto cercando il tipo di caratteristiche linguistiche come il blitzbasic utilizzato per fornire. Esiste affatto?

+0

Aggiornamento: ho appena notato che è stato rilasciato un wrapper opensource .NET per VTK, chiamato ActiViz. Sembra abbastanza buono, ma non sono convinto al 100%. Sto cercando qualcosa di molto più leggero. –

risposta

3

Forse lo XNA Game studio è quello che stai cercando.

Anche dare un'occhiata a DirectX.

+0

Nessuno di questi è di alto livello nel senso che l'OP sta chiedendo. Ci vuole un sacco di lavoro per rendere anche una sfera in XNA. –

4

WPF prospettiva sembrava fresco, ma sembra mirato a scene XAML definito statiche nuovo

sguardo, WPF può essere dinamico come avrete mai bisogno.

È possibile scrivere qualsiasi programma WPF, incluso 3D, totalmente senza XAML.

+0

Grazie; L'ho capito anche io. In questo senso sembra buono, ma non così buono in quanto vedo un sacco di articoli sulle schede grafiche di fascia alta messe in ginocchio da una manciata di triangoli. Non sono alla ricerca di una grafica di alto livello liscia come la seta. Solo uno strato sottile veloce e sporco su directx. –

+0

Intendo; non di alto livello nel senso di GDI + e WPF3d, come nel fornire tonnellate di parametri per l'arrotondamento dei bordi e tutti i tipi di eyecandy. Solo qualcosa di semplice da tenere d'occhio sui concerti di dati che si evolvono nella mia memoria. –

+1

Non chiamerei GDI + livello alto, non accanto a WPF. –

3

Sono anche interessato a questo (come sto anche sviluppando strumenti di simulazione) e ho finito per hackerare insieme alcune cose in XNA. Tuttavia, è decisamente molto più lavoro di quello che hai descritto. Nota che tutto ciò che puoi fare in WPF tramite XAML può essere fatto anche tramite codice, poiché XAML è semplicemente una rappresentazione di una gerarchia di oggetti e delle sue relazioni. Penso che potrebbe essere la soluzione migliore, anche se non ho alcuna metrica sul tipo di prestazioni che potreste aspettarvi con poche centinaia di migliaia di sfere (in questo caso avrete assolutamente bisogno di alcuni abbattimenti e l'abbattimento stesso potrebbe essere costoso se non si utilizza ottimizzazioni come griglia di partizionamento)


EDIT:. Se si ha realmente bisogno per sostenere 100K entità e tutti possono essere resi come sfere, io vi consiglio di bypassare il motore 3D completamente e usa solo XNA per la matematica. Immagino un approccio simile al seguente:

  • Usa XNA per impostare Camera (View) e matrici di prospettiva. Ha alcune pratiche funzioni statiche di Matrix che lo rendono facile.

  • Calcola la matrice di Proiezione e proietta tutti i punti di origine della tua sfera al punto di vista. Questo ti darà le coordinate dello schermo X, Y e la profondità Z nel frustrum. Puoi esprimere questo come moltiplicazione o moltiplicazione della matrice singola di 100K della matrice di Proiezione con una singola matrice di elementi da 3 x 100 K. Nel primo caso, questo è un ottimo candidato per il parallelismo che utilizza la nuova funzionalità .NET 4 Parallel.

  • Se si scopre che i 100K multplications matrice sono un problema, è possibile ridurre in modo significativo questo eseguendo abbattimento dei punti prima trasformazione se si sa che solo un piccolo sottoinsieme di essi sarà visibile in un dato momento. Ad esempio, puoi invertire la matrice di Proiezione per trovare i limiti del tuo frustrum nello spazio originale e creare un riquadro di delimitazione allineato all'asse per il frustrum. È quindi possibile escludere tutti i punti al di fuori di questa casella (test di confronto semplici in X, Y e Z.) Devi solo ricalcolare questo riquadro di delimitazione quando la matrice Projection cambia, quindi se cambia raramente, questa può essere una ragionevole ottimizzazione.

  • Una volta che avete i vostri punti trasformati, tagliare tutto al di fuori del tronco di cono (Z < 0, Z> maxDist, X < 0, Y < 0, X> larghezza, Y> altezza). È ora possibile eseguire il rendering di ciascun punto disegnando un cerchio pieno, con il suo raggio proporzionale a Z (Z = 0 avrebbe il raggio più grande e Z = maxDist probabilmente si attenuerebbe in un singolo punto.) Se si desidera fornire un senso di ombreggiatura/profondità , puoi eseguire il rendering con un pennello ombreggiato per emulare molto liberamente l'illuminazione delle sfere. Funziona perché tutto nella tua scena è una sfera e probabilmente non ti preoccupi di cose come le ombre. Tutto ciò sarebbe abbastanza facile da fare in WPF (incluso il pennello ombreggiato), ma assicuratevi di usare le classi DrawingVisual e non gli elementi del framework. Inoltre, dovrai assicurarti di tracciare l'ordine Z corretto, quindi è utile se memorizzi i punti trasformati in una struttura dati che ordina mentre aggiungi.

  • Se si verificano ancora problemi di prestazioni, ci sono ulteriori ottimizzazioni che è possibile perseguire. Ad esempio, se sai che solo un sottoinsieme dei tuoi punti si sta muovendo, puoi memorizzare nella cache le posizioni trasformate per i punti immobili. Dipende davvero dalla natura del tuo set di dati e da come si evolve.

  • Poiché il set di dati è così grande, si potrebbe prendere in considerazione la possibilità di cambiare il modo di visualizzarlo. Invece di rendere 100K punti, partizionare lo spazio di lavoro in una griglia volumetrica e registrare il numero (densità) di punti all'interno di ogni griglia. Puoi proiettare solo il centro della griglia e renderlo come una "sfera" con qualche feedback aggiuntivo (come colore, opacità o texture del pennello) per indicare la densità del punto. È possibile combinare questa tecnica con l'approccio tradizionale di rendering, rendendo i punti vicini come "sfere" e punti lontani come oggetti "cluster" con alcuni pattern di pennello per adattarli alla densità. Un semplice algoritmo consiste nel considerare una sfera di delimitazione attorno alla telecamera; tutti i punti all'interno della sfera saranno trasformati normalmente; oltre la sfera, renderete solo l'uso della griglia di densità.

+0

Vedi sopra; Mi sono anche accorto che "puoi" farlo in WPF, ma le prestazioni sembrano davvero preoccupanti. Detto questo, le sfere di 100k che eseguono SPH non si aggiorneranno molto agevolmente. Ma non è accettabile per una chiamata di rendering rapida e sporca per aggiungere in modo significativo al mio tempo di simulazione totale. Ho usato per hackerare questo genere di cose insieme in openGL anni fa, ma avevo sperato che fosse una cosa del passato. Qualche possibilità che tu sia disposto a condividere la tua abilità? Sono molto obbligato. –

+0

Eseguo il rendering in modo asincrono rispetto alla simulazione attuale. Questo ha l'effetto collaterale che rende le scene "fuori sincrono" quando molte cose si muovono o se sto simulando più velocemente del tempo reale (ad es.occasionalmente un oggetto resterà indietro rispetto all'effettore finale che lo trasporta), ma la simulazione in PhysX rimane accurata. Dovrò controllare cosa sono libero di condividere, dati i dubbi dell'IP con la mia azienda. Non sono particolarmente soddisfatto della mia attuale soluzione XNA (difficile ottenere anche cose semplici come l'illuminazione di base) e posso sperimentare con il Viewport WPF. –

+0

Grazie per l'input Dan; Ho scritto i miei rasterizzatori e raytracers, quindi potrei rifarlo, ma il fatto è che non è quello che sto pagando adesso. Quello che voglio, per quanto riguarda le prestazioni, è un singolo buffer di coordinate nella RAM GPU che viene renderizzata, che aggiorno a mio piacimento. Se sto manipolando me stesso delle matrici sulla CPU, questo si discosta da ciò che voglio sia in termini di livello di astrazione che di prestazioni. –

0

È necessario utilizzare C# /. Net o MonoDevelop essere abbastanza buono? Posso raccomandare lo http://unity3d.com/ se vuoi un potente motore 3D.

+0

Hmm, sembra interessante, ma vuol dire che devo lasciare Visual Studio? –

+0

Continuerai a programmare in Visual Studio e ad utilizzare C# ma non sono completamente sicuro di quale versione di .NET MonoDevelop utilizzata da Unity supporti al momento. Ma ottieni il bonus extra che il tuo prodotto diventa multipiattaforma :) – Bakery

+0

Trovato questo link al forum: http://forum.unity3d.com/threads/20807-Which-Version(s)-of-.Net-does- unità-Support – Bakery

Problemi correlati