Non riesco a capire queste coordinate della trama UV (l'intervallo NON è compreso tra 0,0 e 1,0)


9

Sto cercando di disegnare un semplice oggetto 3D generato da Google SketchUp 8 Pro sulla mia app WebGL, il modello è un semplice cilindro.

Ho aperto il file esportato e copiato le posizioni dei vertici, gli indici, le normali e le coordinate delle trame in un file .json per poterlo utilizzare su javascript. Tutto sembra funzionare bene, ad eccezione delle coordinate della trama che hanno alcuni valori piuttosto grandi, come 46.331676 e anche valori negativi. Ora non so se sbaglio, ma le coordinate della trama 2D non dovrebbero essere comprese tra 0,0 e 1,0?

Bene, disegnare il modello usando queste coordinate della trama mi dà un aspetto totalmente strano, e riesco a vedere la trama correttamente solo quando sono molto vicino (non proprio io, la camma) al modello, come se la trama fosse stata follemente ridotto nelle sue dimensioni e ripetuto all'infinito sulle facce del modello. (sì, sto usando GL_REPEAT su quella cosa dell'involucro della trama)

Quello che ho notato è che se ottengo tutte queste coordinate e le divido per 10 o 100 ottengo un aspetto molto "normale", ma non ancora nell'intervallo da 0,0 a 1,0.

Ecco il mio file json: http://pastebin.com/Aa4wvGvv

Ecco i miei shader GLSL: http://pastebin.com/DR4K37T9

Ed ecco il file .X esportato da SketchUp: http://pastebin.com/hmYAJZWE

Ho anche provato a disegnare questo modello usando XNA, ma ancora non funziona. Utilizzando questo shader HLSL: http://pastebin.com/RBgVFq08

Ho provato a esportare lo stesso modello in diversi formati, collada, fbx e x. Tutto ciò produce la stessa cosa.

Risposte:


8

Hai ragione, i raggi UV in genere vanno da 0 a 1 anche se, come ha detto David X, questo non è un requisito. Nel tuo caso il problema è la frequenza delle coordinate UV generate da SketchUp. Ad esempio, se l'asse Y (coordinata V) va da 0 a 46, quella trama, se il wrapping è abilitato, si ripeterà 46 volte nella direzione V. La confezione inoltre la rende più piccola perché è necessario duplicare l'immagine più volte sulla stessa superficie. Riesportare come FBX o Collada non fa nulla per risolvere il problema perché è lo stesso UV in entrambi i casi. Per risolvere questo problema, devi tornare a SketchUp e modificare la modalità di generazione degli UV per il cilindro. Forse puoi specificare tu stesso la gamma UV o forse devi cambiare il modo in cui la geometria è parametrizzata. Non ho mai usato SketchUp, quindi non

Infine, sembra che l'avvolgimento del vertice del cilindro possa essere l'opposto dei tuoi cubi. Le API grafiche come OpenGL e DirectX usano l'avvolgimento del vertice del triangolo per determinare la direzione verso cui è rivolto il triangolo. Questo è il modo in cui eseguono l'abbattimento del backface - non il rendering dei triangoli di fronte alla telecamera come ottimizzazione. Nel caso del tuo cilindro sembra che la vista stia guardando nel cilindro perché i triangoli più vicini alla telecamera sono rivolti nella direzione sbagliata. Ancora una volta questo è un problema che dovrebbe essere risolto in SketchUp e può essere verificato osservando la direzione della faccia normale per ogni triangolo (dovrebbe essere rivolta verso l'esterno, non verso l'interno).


1

(Le coordinate delle trame possono sicuramente essere al di fuori di 0-1.) Penso che OpenGL sia strano. IIRC, Spheres usa coordinate di trama che mettono il quadrato 0-1 su ~ 1/16 della superficie e non sarei sorpreso se i Cilindri fanno qualcosa di simile. Per quanto riguarda la correzione, potresti dover scrivere il tuo codice cilindro, emettendo le coordinate di trama appropriate.


1

Se vuoi che le tue coordinate uv siano esattamente tra 0 e 1, puoi usare una matrice di scala per il tuo modello.

Quindi, caricando il modello, è possibile verificare le coordinate max u e v e creare una matrice di ridimensionamento che lo renderà più "normale". In questo modo sostituirai il tuo ridimensionamento manuale di 10 o 100. Quindi, per adattarlo, dovrai ridimensionare le coordinate uv fino a [0,1].

|1/uMax|0     |
|0     |1/vMax|

Naturalmente questa è solo una soluzione alternativa e potresti trovare un modo per impostare Sketchup nelle impostazioni giuste (penso che il tuo esportatore o Sketchup stesso vada storto qui). Ma se per te non funziona, crea il tuo processore post-caricamento e salva una matrice di ridimensionamento delle trame.


@Marmix Questa è una soluzione molto semplice, efficace ed elegante !!!
3d-indiana-jones,

0

Sembra che SketchUp non stia normalizzando le coordinate della trama o non stia utilizzando una propria metrica. Avere texcoords <0 o> 1 e GL_REPEAT come involucro della trama significa che la trama verrà ridimensionata per adattarsi alla geometria e ripetuta in senso orizzontale e verticale.

Prova a importare la mesh in un altro pacchetto di modellazione (MilkShape, Blender) e a fissare la mappa uv da lì.


4
Avere texcoords <0 o> 1 e GL_REPEAT come involucro della trama significa che la trama sarà [ rimossa un'istruzione errata ] ripetuta in senso orizzontale e verticale.
Kromster,
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.