كيفية إعداد/حساب texturebuffer في gltexcoordpointer عند الاستيراد من ملف OBJ
سؤال
أقوم بتحليل ملف OBJ في Android وهدفي هو تقديم وعرض الكائن. كل شيء يعمل بشكل جيد باستثناء تعيين النسيج الصحيح (استيراد المورد/الصورة إلى OpenGL وما إلى ذلك يعمل بشكل جيد).
لا أعرف كيفية ملء البيانات المتعلقة بالملمس من ملف OBJ إلى كائن الملمس.
في ملف OBJ I VT Lines:
vt 0.495011 0.389417
vt 0.500686 0.561346
وخطوط الوجه:
f 127/73/62 98/72/62 125/75/62
يبدو روتين السحب الخاص بي (الأجزاء ذات الصلة فقط):
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glNormalPointer(GL10.GL_FLOAT, 0, normalsBuffer);
gl.glTexCoordPointer(2, GL10.GL_SHORT, 0, t.getvtBuffer());
gl.glDrawElements(GL10.GL_TRIANGLES, t.getFacesCount(), GL10.GL_UNSIGNED_SHORT, t.getFaceBuffer());
إخراج تهم ملف OBJ:
Vertex-count: 1023
Vns-count: 1752
Vts-count: 524
/////////////////////////
Part 0
Material name:default
Number of faces:2037
Number of vnPointers:2037
Number of vtPointers:2037
أي نصيحة مرحب بها.
المحلول
آسف ، لست متأكدًا إلى أي مدى يرعى هذا ، ولكن من الأعلى:
f 127/73/62 98/72/62 125/75/62
يعني المثلث بين قمة الرأس مع الموضع 127 الوارد في الملف ، وموضع الملمس 73 في الملف والثاني 62 العادي والرنين الأخريين المحددة بطريقة مماثلة.
في OpenGL ، تحدد فهرسًا واحدًا فقط لكل قمة (حيث يمر الأمر برمته من خلال التحويل كوحدة واحدة) ، لذلك تحتاج إلى معرفة جميع المجموعات المختلفة من الموضع وإحداثيات الملمس والطبيعية وترتيب المخازن المؤقتة التي تمر بها glVertexPointer
, glNormalPointer
و glTexCoordPointer
وفقاً لذلك. وض في المخزن المؤقت لإحداثيات الملمس الداخلي ، قمت بنسخ المعتاد 62 إلى الأول في القائمة العادية الداخلية.
من المحتمل تمامًا أنك تريد أن تأخذ HashMap إحداثيات قمة القمة/الملمس/الطبيعية المزيفة/العادية ورسم الخرائط إلى وضع في المصفوفات الداخلية. عندما تصادف كل وجه في OBJ الواردة ، يمكنك التحقق مما إذا كنت قد حصلت بالفعل على هذا المجموعة المخصصة لموقع في المخازن المؤقتة الداخلية الخاصة بك ومنحه التالي المتاح إذا لم يكن كذلك.
VT هو منسق نسيج ، على سبيل المثال إحداثي الملمس:
vt 0.495011 0.389417
يعني أنه ، داخل مساحة الملمس ، x = 0.495011 ، y = 0.389417. من الذاكرة ، فإن تنسيق ملف OBJ و OpenGL لهما محاور Y في اتجاهين متعاكسين. لذلك بشروط OpenGL تريد s = 0.495011 ، t = 1 - 0.389417 = 0.610583.
إذا كان كائنك يستخدم أطلس نسيج معقد بشكل مناسب أو دبل ، أتصور أنه سيكون من الواضح أن إحداثيات Y قد تم قلبها ؛ إذا كان لديك شيء مثل مكعب مع نفس الملمس المتكرر بالكامل على كل وجه ، فربما ترى أنه يتم قلبه على طول العمودي.
هل يغطي ذلك مصدر الارتباك؟