كيفية إعداد/حساب texturebuffer في gltexcoordpointer عند الاستيراد من ملف OBJ

StackOverflow https://stackoverflow.com/questions/4233152

  •  26-09-2019
  •  | 
  •  

سؤال

أقوم بتحليل ملف 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 قد تم قلبها ؛ إذا كان لديك شيء مثل مكعب مع نفس الملمس المتكرر بالكامل على كل وجه ، فربما ترى أنه يتم قلبه على طول العمودي.

هل يغطي ذلك مصدر الارتباك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top