2014-12-12 12 views
5

का उपयोग कर एक बॉक्स में से प्रत्येक के चेहरे पर बनावट मैं निम्नलिखित कोड का टुकड़ा है कि एक 3 डी घन उत्पन्न करता है:LibGDX - मानचित्रण व्यक्तिगत 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 
     ); 

अब तक तो अच्छा। समस्या यह है कि घन के सभी चेहरे एक ही बनावट का उपयोग करते हैं, जबकि मैं जो चाहता हूं वह Assetloader.tr [] है, जो प्रत्येक चेहरे पर क्रमशः 6 व्यक्तिगत बनावट के साथ एक सरणी है।

मैं

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]))); 
... 

की कोशिश की है, लेकिन किसी भी तरह प्रलेखन मुझे कैसे ठीक ऐसा करने के लिए किसी भी संकेत नहीं देता है। मैं यहाँ थोड़ा फंस गया हूँ।

उत्तर

10

ध्यान में रखने के लिए कई विचार हैं। सबसे पहले ध्यान से पढ़ना सुनिश्चित करें: https://github.com/libgdx/libgdx/wiki/ModelBuilder%2C-MeshBuilder-and-MeshPartBuilder

दूसरा, ModelBuilder#createXXX विधियों से बचने का प्रयास करें। वे डीबगिंग और परीक्षण उद्देश्यों के लिए सिर्फ एक शॉर्टकट हैं। आप इसके पीछे code को देखें, तो आपको लगता है कि बहुत सीधा है देखेंगे:

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(); 

आप इस पूरे बॉक्स के लिए एक एकल हिस्सा बनाता है देख सकते हैं, तो एक दूसरे भाग तक पहुँचने के लिए (के रूप में आप में क्या कोशिश कर रहा आपका उदाहरण) काम नहीं करेगा। लेकिन क्योंकि आप प्रत्येक चेहरे के लिए एक अलग सामग्री का उपयोग करना चाहते हैं, तो आपको प्रत्येक चेहरे के लिए एक हिस्सा बनाना होगा।

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(); 

हालांकि, प्रत्येक चेहरे के लिए एक हिस्सा होने से प्रत्येक चेहरे के लिए रेंडर कॉल होता है।

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(); 

इस जबकि मदद कर सकता है आप आप चाहते हैं, क्या तुम सच में अपने दृष्टिकोण पर पुनर्विचार करना चाहिए: यह सुनिश्चित करें कि सभी TextureRegion रों शेयर एक ही बनावट इसके बजाय उसका उपयोग करने के लिए अधिक performant है। जैसा कि आप देख सकते हैं, कोड द्वारा मॉडल बनाना वास्तव में गन्दा हो सकता है। और, इसके अलावा, बॉक्स के लिए एक मॉडल बनाना अधिकांश मामलों में इष्टतम से दूर है जब तक कि आपका लक्ष्य केवल एक बॉक्स को प्रस्तुत न करें और बॉक्स से अधिक कुछ न हो। इसके बजाय अपने मॉडल बनाने के लिए मॉडलिंग एप्लिकेशन का उपयोग करें। अधिक जानकारी के लिए http://blog.xoppa.com/ पर मेरे ब्लॉग पर एक नज़र डालें। यदि आप वास्तव में अपने आप भागों को संशोधित करना चाहते हैं, तो कम से कम "दृश्यों के पीछे" ट्यूटोरियल को पढ़ने और सुनिश्चित करना सुनिश्चित करें।

+0

धन्यवाद - यह काम करता है! हां, मैंने कोड पर एक नज़र डाली और सोचा कि वहां कुछ आसान और बेहतर तरीका होना चाहिए जिसे मैं समझ नहीं पाया। वैसे भी, ऐसा लगता है कि अलग-अलग पक्षों को विभिन्न सामग्रियों को संलग्न करने में सक्षम होने की इस विशेषता को मॉडलबिल्डर के इन सरल जेनरेट किए गए प्राइमेटिव में शामिल किया जाना चाहिए। मैं इस बात से सहमत नहीं हूं कि यह केवल परीक्षण और डिबगिंग के लिए होना चाहिए। इनके साथ कई सरल लेकिन भयानक चीजें बनाई जा सकती हैं :) धन्यवाद फिर से! – Scalarr

+0

क्या होगा यदि आप ऐसे कई बॉक्स रखने की योजना बना रहे थे जिनके साथ आप उन वस्तुओं के रूप में व्यवहार करना चाहते थे जिनके साथ आप बातचीत कर सकते हैं? उदाहरण के लिए एक बॉक्स जिसमें गुण होते हैं जो किसी चरित्र के लड़ने वाले गुणों को प्रभावित कर सकता है। पीएस ब्लॉग के लिए धन्यवाद – Ishmael

+0

हैलो @ एक्सओपीपीए, मैं मॉडल का उपयोग करके 2 डी स्प्राइट्स बना रहा हूं (प्रत्येक के लिए एक मॉडल) और इसमें खराब प्रदर्शन है, क्या मैं प्रत्येक स्प्राइट के लिए मेशपार्टबुइडर का उपयोग कर सकता हूं? ModelCache का उपयोग कर भी मदद नहीं कर रहा है क्योंकि TextureRigions को अलग माना जाता है। कृपया 3 डी में 2 डी स्प्राइट्स को आकर्षित करने का सबसे अच्छा तरीका सुझाएं, मैं आपके सुझाव के आधार पर ढांचा तैयार करूंगा (क्या मुझे decals, createRect, ModelCache, कई हिस्सों के साथ एकल मॉडल, रेक्ट या कुछ और के साथ एकल मॉडल मेषपार्ट का उपयोग करना चाहिए), मुझे decalBatch चाहिए आकार को 4 अक्षरों के आकार के निर्माण के लिए संशोधित करें? अग्रिम धन्यवाद – Diljeet

 संबंधित मुद्दे