2014-12-12 14 views
5

Ho il seguente frammento di codice che genera un cubo 3D:LibGDX - Mappatura individuali texture per ogni faccia di una scatola con Modelbuilder.createBox

ModelBuilder modelBuilder = new ModelBuilder(); 

box = modelBuilder.createBox(2f, 2f, 2f, 
       new Material(TextureAttribute.createDiffuse(AssetLoader.tr[0])), 
       VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal | VertexAttributes.Usage.TextureCoordinates 
     ); 

Fin qui tutto bene. Il problema è che tutte le facce del cubo usano la stessa trama, mentre quello che voglio è Assetloader.tr [], che è una matrice con 6 trame individuali che appaiono rispettivamente su ciascuna faccia.

ho cercato

box.nodes.get(0).parts.get(0).material.set(new Material(TextureAttribute.createDiffuse(AssetLoader.tr[0]))); 
box.nodes.get(0).parts.get(1).material.set(new Material(TextureAttribute.createDiffuse(AssetLoader.tr[1]))); 
... 

ma in qualche modo la documentazione non mi dà alcun suggerimento su come farlo correttamente. Sono un po 'bloccato qui.

risposta

10

Ci sono diverse considerazioni da tenere a mente. Prima di tutto assicurati di leggere attentamente: https://github.com/libgdx/libgdx/wiki/ModelBuilder%2C-MeshBuilder-and-MeshPartBuilder.

In secondo luogo, cercare di evitare i metodi ModelBuilder#createXXX. Sono solo una scorciatoia per scopi di debug e test. Se si guarda al code dietro di esso, vedrete che è molto semplice:

modelBuilder.begin(); 
modelBuilder.part("box", GL20.GL_TRIANGLES, 
     VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal | VertexAttributes.Usage.TextureCoordinates, 
     new Material(TextureAttribute.createDiffuse(AssetLoader.tr[0]))) 
    .box(2f, 2f, 2f); 
box = modelBuilder.end(); 

Come si può vedere questo crea una sola parte per l'intera scatola, in modo da cercare di accedere a una seconda parte (come si fa in il tuo esempio) non funzionerà. Ma poiché vuoi usare un materiale diverso per ogni faccia, dovrai creare una parte per ogni faccia.

int attr = VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal | VertexAttributes.Usage.TextureCoordinates; 
modelBuilder.begin(); 
modelBuilder.part("front", GL20.GL_TRIANGLES, attr, new Material(TextureAttribute.createDiffuse(AssetLoader.tr[0]))) 
    .rect(-2f,-2f,-2f, -2f,2f,-2f, 2f,2f,-2, 2f,-2f,-2f, 0,0,-1); 
modelBuilder.part("back", GL20.GL_TRIANGLES, attr, new Material(TextureAttribute.createDiffuse(AssetLoader.tr[1]))) 
    .rect(-2f,2f,2f, -2f,-2f,2f, 2f,-2f,2f, 2f,2f,2f, 0,0,1); 
modelBuilder.part("bottom", GL20.GL_TRIANGLES, attr, new Material(TextureAttribute.createDiffuse(AssetLoader.tr[2]))) 
    .rect(-2f,-2f,2f, -2f,-2f,-2f, 2f,-2f,-2f, 2f,-2f,2f, 0,-1,0); 
modelBuilder.part("top", GL20.GL_TRIANGLES, attr, new Material(TextureAttribute.createDiffuse(AssetLoader.tr[3]))) 
    .rect(-2f,2f,-2f, -2f,2f,2f, 2f,2f,2f, 2f,2f,-2f, 0,1,0); 
modelBuilder.part("left", GL20.GL_TRIANGLES, attr, new Material(TextureAttribute.createDiffuse(AssetLoader.tr[4]))) 
    .rect(-2f,-2f,2f, -2f,2f,2f, -2f,2f,-2f, -2f,-2f,-2f, -1,0,0); 
modelBuilder.part("right", GL20.GL_TRIANGLES, attr, new Material(TextureAttribute.createDiffuse(AssetLoader.tr[5]))) 
    .rect(2f,-2f,-2f, 2f,2f,-2f, 2f,2f,2f, 2f,-2f,2f, 1,0,0); 
box = modelBuilder.end(); 

Tuttavia, avere una parte per ogni faccia implica una chiamata di rendering per ogni faccia. E 'più performante per assicurarsi che tutti TextureRegion s condividono la stessa consistenza e l'uso che, invece:

int attr = VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal | VertexAttributes.Usage.TextureCoordinates; 
modelBuilder.begin(); 
MeshPartBuilder mpb = modelBuilder.part("box", GL20.GL_TRIANGLES, attr, new Material(TextureAttribute.createDiffuse(AssetLoader.tr[0].getTexture()))); 
mpb.setUVRange(AssetLoader.tr[0]); 
mpb.rect(-2f,-2f,-2f, -2f,2f,-2f, 2f,2f,-2, 2f,-2f,-2f, 0,0,-1); 
mpb.setUVRange(AssetLoader.tr[1]); 
mpb.rect(-2f,2f,2f, -2f,-2f,2f, 2f,-2f,2f, 2f,2f,2f, 0,0,1); 
mpb.setUVRange(AssetLoader.tr[2]); 
mpb.rect(-2f,-2f,2f, -2f,-2f,-2f, 2f,-2f,-2f, 2f,-2f,2f, 0,-1,0); 
mpb.setUVRange(AssetLoader.tr[3]); 
mpb.rect(-2f,2f,-2f, -2f,2f,2f, 2f,2f,2f, 2f,2f,-2f, 0,1,0); 
mpb.setUVRange(AssetLoader.tr[4]); 
mpb.rect(-2f,-2f,2f, -2f,2f,2f, -2f,2f,-2f, -2f,-2f,-2f, -1,0,0); 
mpb.setUVRange(AssetLoader.tr[5]); 
mpb.rect(2f,-2f,-2f, 2f,2f,-2f, 2f,2f,2f, 2f,-2f,2f, 1,0,0); 
box = modelBuilder.end(); 

Anche se questo potrebbe aiutare vuoi, si dovrebbe davvero riconsiderare il vostro approccio. Come puoi vedere, la creazione di un modello tramite codice può diventare molto complicata. E, inoltre, la creazione di un singolo modello per una scatola è nella maggior parte dei casi lontana dall'ottimale, a meno che il tuo obiettivo sia solo il rendering di una singola scatola e nient'altro che una scatola. Usa invece un'applicazione di modellazione per creare i tuoi modelli. Dai un'occhiata al mio blog allo http://blog.xoppa.com/ per maggiori informazioni. Se vuoi davvero modificare le parti da solo, assicurati di leggere almeno fino alle esercitazioni "dietro le quinte".

+0

Grazie - Funziona! Sì, ho dato un'occhiata al codice e ho pensato che doveva esserci un modo più semplice e migliore che non riuscivo a capire. Ad ogni modo, sembra che questa caratteristica di poter collegare materiali diversi a lati diversi dovrebbe in qualche modo essere inclusa in questi semplici primitivi generati da modelBuilder. Non sono d'accordo che dovrebbe essere solo per test e debugging. Molte cose semplici ma meravigliose possono essere fatte con queste :) Grazie ancora! – Scalarr

+0

Cosa succederebbe se avessi intenzione di avere diverse scatole da trattare come oggetti con cui puoi interagire? Ad esempio una scatola che ha proprietà che potrebbero influenzare gli attributi di combattimento di un personaggio. P.S. Grazie per il tuo blog. – Ishmael

+0

Ciao @Xoppa, sto creando folletti 2d usando i modelli (un modello per ciascuno) e ha scarse prestazioni, posso usare il MeshPartBuider per ogni sprite? l'uso di ModelCache non aiuta anche perché TextureRigions è considerato diverso. Si prega di suggerire il modo migliore per disegnare 2d Sprites in 3D creerò il framework basato sul tuo suggerimento (dovrei usare decalcomanie, createRect, ModelCache, modello singolo con molte parti, modello singolo meshpart con rect o qualcos'altro), mi piace decalbum dovrei modificarlo per costruire la forma più di 4 vertici? Grazie in anticipo – Diljeet

Problemi correlati