2016-12-07 7 views
13

मैं अपने Android आवेदन में एक .obj फ़ाइल लोड और ओपन 2.लोड और साथ एंड्रॉयड में फ़ाइल .obj प्रदर्शित करने के लिए कैसे ओपन-ES 2

का उपयोग कर इसे प्रदर्शित करने के लिए आप फ़ाइल यहां पा सकते हैं कोशिश कर रहा हूँ: संपादित करें: मैंने फ़ाइल हटा दी है, आप किसी भी .obj फ़ाइल का उपयोग कर सकते हैं जिसमें परीक्षण के लिए नीचे दिए गए मान शामिल हैं।

स्टैक ओवरफ्लो पर बहुत सारे प्रश्न हैं लेकिन मुझे एक साधारण समाधान नहीं मिला जिसके लिए कुछ बड़ी लाइब्रेरी की आवश्यकता नहीं है।

फ़ाइल केवल निम्न मूल्य प्रकार होते हैं:

  • जी
  • वी
  • vt
  • vn

मैं libgdx की कोशिश की है, जो ठीक काम किया, लेकिन मुझे जो चाहिए वह थोड़ा अधिक है।

मैंने LWJGL के बिना oObjLoader https://github.com/seanrowens/oObjLoader को आजमाया। पार्सिंग काम करने लगती है, लेकिन मैं एक साधारण दृश्य में मूल्य कैसे प्रदर्शित कर सकता हूं?

अगला चरण किसी छवि को ऑब्जेक्ट में बनावट के रूप में संलग्न करना है। लेकिन अभी के लिए मुझे फ़ाइल को प्रदर्शित करने में खुशी होगी।

मैं फ़ाइल को पूर्व-परिवर्तित करने जैसे विभिन्न समाधानों के लिए खुला हूं, क्योंकि यह केवल एप्लिकेशन के भीतर ही होगा।

धन्यवाद!

स्थिति अद्यतन मूल लोडिंग और प्रदर्शित करना अब मेरे स्वयं के उत्तर में दिखाया गया है।

+3

जब से तुम एंड्रॉयड उपयोग कर रहे हैं , यह अत्यधिक संभावना है कि आपका प्रश्न ओपनजीएल-ईएस 2 को लक्षित करता है और ओपनजीएल 2 नहीं। यदि ऐसा है, तो मैं प्रश्न को अद्यतन करने और तदनुसार इसे व्यवस्थित करने की सलाह देता हूं। – BDL

उत्तर

4

मैं एक नया पार्सर लेखन समाप्त हो गया, यह आपके रेंडरर में उपयोग करने के लिए FloatBuffers निर्माण करने के लिए इस तरह इस्तेमाल किया जा सकता:

ObjLoader objLoader = new ObjLoader(context, "Mug.obj"); 

numFaces = objLoader.numFaces; 

// Initialize the buffers. 
positions = ByteBuffer.allocateDirect(objLoader.positions.length * mBytesPerFloat) 
     .order(ByteOrder.nativeOrder()).asFloatBuffer(); 
positions.put(objLoader.positions).position(0); 

normals = ByteBuffer.allocateDirect(objLoader.normals.length * mBytesPerFloat) 
     .order(ByteOrder.nativeOrder()).asFloatBuffer(); 
normals.put(objLoader.normals).position(0); 

textureCoordinates = ByteBuffer.allocateDirect(objLoader.textureCoordinates.length * mBytesPerFloat) 
     .order(ByteOrder.nativeOrder()).asFloatBuffer(); 
textureCoordinates.put(objLoader.textureCoordinates).position(0); 

और यहाँ पार्सर है:

public final class ObjLoader { 

    public final int numFaces; 

    public final float[] normals; 
    public final float[] textureCoordinates; 
    public final float[] positions; 

    public ObjLoader(Context context, String file) { 

     Vector<Float> vertices = new Vector<>(); 
     Vector<Float> normals = new Vector<>(); 
     Vector<Float> textures = new Vector<>(); 
     Vector<String> faces = new Vector<>(); 

     BufferedReader reader = null; 
     try { 
      InputStreamReader in = new InputStreamReader(context.getAssets().open(file)); 
      reader = new BufferedReader(in); 

      // read file until EOF 
      String line; 
      while ((line = reader.readLine()) != null) { 
       String[] parts = line.split(" "); 
       switch (parts[0]) { 
        case "v": 
         // vertices 
         vertices.add(Float.valueOf(parts[1])); 
         vertices.add(Float.valueOf(parts[2])); 
         vertices.add(Float.valueOf(parts[3])); 
         break; 
        case "vt": 
         // textures 
         textures.add(Float.valueOf(parts[1])); 
         textures.add(Float.valueOf(parts[2])); 
         break; 
        case "vn": 
         // normals 
         normals.add(Float.valueOf(parts[1])); 
         normals.add(Float.valueOf(parts[2])); 
         normals.add(Float.valueOf(parts[3])); 
         break; 
        case "f": 
         // faces: vertex/texture/normal 
         faces.add(parts[1]); 
         faces.add(parts[2]); 
         faces.add(parts[3]); 
         break; 
       } 
      } 
     } catch (IOException e) { 
      // cannot load or read file 
     } finally { 
      if (reader != null) { 
       try { 
        reader.close(); 
       } catch (IOException e) { 
        //log the exception 
       } 
      } 
     } 

     numFaces = faces.size(); 
     this.normals = new float[numFaces * 3]; 
     textureCoordinates = new float[numFaces * 2]; 
     positions = new float[numFaces * 3]; 
     int positionIndex = 0; 
     int normalIndex = 0; 
     int textureIndex = 0; 
     for (String face : faces) { 
      String[] parts = face.split("/"); 

      int index = 3 * (Short.valueOf(parts[0]) - 1); 
      positions[positionIndex++] = vertices.get(index++); 
      positions[positionIndex++] = vertices.get(index++); 
      positions[positionIndex++] = vertices.get(index); 

      index = 2 * (Short.valueOf(parts[1]) - 1); 
      textureCoordinates[normalIndex++] = textures.get(index++); 
      // NOTE: Bitmap gets y-inverted 
      textureCoordinates[normalIndex++] = 1 - textures.get(index); 

      index = 3 * (Short.valueOf(parts[2]) - 1); 
      this.normals[textureIndex++] = normals.get(index++); 
      this.normals[textureIndex++] = normals.get(index++); 
      this.normals[textureIndex++] = normals.get(index); 
     } 
    } 
} 
+0

HI क्या मुझे आपकी पूरी ObjLoader फ़ाइल मिल सकती है? मुझे इसके साथ कुछ समस्याएं हैं। वास्तव में बहुत सराहना करेंगे –

+0

नमस्ते मैं खुले के लिए बेहद नया हूं, कृपया मुझे बफर प्रस्तुत करने के लिए मार्गदर्शन कर सकते हैं, मैं आपके कोड के लिए बफर धन्यवाद बनाने में सक्षम था, लेकिन इसे फिर से चलाने में विफल रहा। –

0

जैसा कि आप obj फ़ाइलों को पार्स कर सकते हैं, यह post आपको बहुत मदद कर सकता है।

एक और आसान तरीका है, तीन.जेएस objloader का उपयोग करें। आपके एंड्रॉइड ऐप में वेबपृष्ठ जोड़ने के लिए XWalkView का उपयोग करें। XWalkView वेबव्यू की तरह कुछ है, यहां वर्कव्यू जटिल दृश्य प्रस्तुत करने के लिए काम नहीं कर सकता है, जबकि XWalkView है। यदि आप वेबपृष्ठ रिमोट नहीं बनाते हैं, तो आप इसे स्थानीय बना सकते हैं।

+0

आपके उत्तर के लिए धन्यवाद लेकिन मुझे ओपनजीएल-ईएस समाधान चाहिए। –

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