In che modo Unity3D riduce un conteggio dei vertici .obj importato?


8

Ho una domanda su come Unity3D gestisce l'importazione di file .obj. Sto importando questa teiera: http://groups.csail.mit.edu/graphics/classes/6.837/F03/models/teapot.obj

Il numero di vertici di questa teiera è 3644. So che la classe Mesh di Unity deve replicare questi vertici per ogni faccia condivisa dallo stesso vertice. Ho provato questo con un cubo importato da un .obj e usando Debug.Log () per stampare il numero di vertici ho scoperto che c'erano 24 vertici nell'array di vertici della mesh.

Tuttavia, con la teiera il file originale aveva 3644 vertici, quindi in Unity il conteggio dei vertici dovrebbe essere 18960. Invece, quando stampo la lunghezza dell'array di vertici della mesh, stampa 3260 (anche meno del file originale).

L'obiettivo finale di questo è che sto cercando di modificare uno script importatore OBJ dal Wiki di Unity, in modo che il numero di vertici risultanti da questo script siano gli stessi dell'importatore nativo di Unity. Riferimento: http://wiki.unity3d.com/index.php?title=ObjImporter Nota: ho stampato il conteggio dei vertici usando questo importatore e il risultato è stato 18960.

Qualcuno ha un'idea di come si potrebbe ottenere questa riduzione del vertice?


Algoritmi complessi, non sono sicuro di quale unità utilizzi, ma puoi trovarli online.
MickLH,

Risposte:


5

Esistono diversi fattori che contribuiscono al modo in cui la geometria viene salvata ed elaborata in diversi supporti (programmi, formati di file, API). Ho implementato diversi programmi di analisi della geometria commerciale, quindi ho una certa esperienza con esso.

Innanzitutto sono sicuro che questo non ha nulla a che fare con Unity che semplifica qualcosa. Ma nel caso ci fossero diversi algoritmi di decimazione che possono essere implementati, ma sono sicuro che non è così, dal momento che un motore di gioco non dovrebbe cambiare la forma (proprietà geometriche di una mesh) ma di solito può modificare la sua connettività per abbinare la sua struttura ottimale.

Alcuni di questi fattori sono:

Cosa rende unico un vertice?

Questo può variare notevolmente a seconda del modo in cui il programma, l'API o il formato file gestiscono un vertice. Un vertice può essere unico se ha una posizione unica, ma in altri casi è unico se ha un attributo univoco. Ad esempio, se due vertici condividono la stessa posizione, ma hanno normali diverse, dovrebbero essere "duplicati" nel caso di OpenGL, questo è particolarmente evidente nel caso del cubo che hai citato.

inserisci qui la descrizione dell'immagine Bordi duri vs lisci.

Le normali possono dettare se un bordo è considerato duro o liscio, se un vertice contribuisce al bordo duro, allora deve essere duplicato in modo che le API di rendering correnti possano capire come renderizzare (sfumare) correttamente questa faccia.

inserisci qui la descrizione dell'immagine

Indici

Molti formati di file consentono a un vertice facciale di avere diversi indici per la posizione del vertice / texCoords / normali, questo non è il caso delle API di rendering correnti. Un ottimo esempio di questo è il file Obj, questo costringerà Unity a ricostruire gli indici e spesso duplicherà molti attributi per abbinare gli indici dei vertici.

Connettività

Molti vertici che sono effettivamente connessi e unici sono salvati più volte, questo ha a che fare con il modo in cui il writer di file originale ha elaborato e salvato la mesh. Unity ridurrà il numero di vertici duplicati (ricorda se ha attributi diversi, quindi non è univoco) in modo da renderlo più efficiente per l'archiviazione e l'elaborazione senza sacrificare la qualità.

Questo ha anche a che fare con il numero di lati poligonali consentiti dal file originale, ad esempio Obj consente poligoni lato N, cosa che qualsiasi motore di gioco sano non vuole, quindi finisce per triangolare la mesh e ricalcolare molti dei suoi attributi che spesso cambia il numero di vertici.


Oh ho capito adesso! Nell'importatore .obj che ho usato, i vertici sono sempre duplicati per ogni faccia in cui sono usati, ed è per questo che ottengo sempre bordi duri sulla mia teiera (non l'ho mai menzionato prima perché pensavo che fosse un problema diverso). Bella risposta!
VitorOliveira,

2

I formati Obj sono strani in particolare perché le posizioni, le normali e le coordinate delle trame sono separate e ogni faccia può scegliere qualunque indice da ogni flusso. Quando ti riferisci al conteggio dei vertici, pensi che le posizioni dei vertici e il conteggio delle normali non siano uguali e non puoi davvero fare riferimento all'intero conteggio.

Durante il caricamento di tutti e tre questi attributi devono essere uniti così una posizione del vertice possa finire duplicata perché la faccia associata a quella posizione del vertice è associata a due normali . Questo può accadere anche al contrario, quindi la maggior parte dei caricatori ha un passo per ottimizzare l'obj, ma nel caso del cubo l'ottimizzazione non funzionerà poiché il cubo ha bordi duri e ogni vertice ha una normale (o coordinata trama) diversa. Questo è il motivo per cui hai contato 6 posizioni di vertice ma l'unità ha duplicato quelle posizioni risultando in 24 vertici.

Per caricare una mesh è possibile duplicare posizioni / normali o coordinate di trama in modo da ottimizzare questo non è qualcosa di semplice. Si riduce a scegliere il numero minimo di duplicati da quei tre flussi.


Questa risposta è stata un ottimo complemento di ciò che ha detto concept3d e mi ha aiutato a capire questo problema. Quindi suppongo che per ora il mio importatore .obj avrà sempre bordi netti, ma se voglio migliorarlo dovrei cercare algoritmi per aiutarmi a sapere quali vertici dovrebbero essere duplicati o meno, al fine di avere un modello a spigolo uniforme con il minimo ( o almeno ottimizzato) conteggio dei vertici.
VitorOliveira,
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.