OpenGL: نموذج لا يعرض بشكل صحيح. (تحتاج إلى إصلاح مسافة الرسم؟)

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

سؤال

أنا جديد على OpenGL. أنا ألعب مع Jogl.

لدي نموذج .OBJ أرسمه كمضلعات. يبدو الأمر جيدًا ، إلا أن معظمها يتم قصه. لذلك أعتقد أنني بحاجة إلى زيادة مسافة السحب.

لست متأكدًا حقًا من كيفية القيام بذلك. ها هو رمز العرض الخاص بي:

private void render(GLAutoDrawable drawable) {
        GL2 gl = drawable.getGL().getGL2();
        GLUgl2 glu = new GLUgl2();

        gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);

        gl.glMatrixMode(GL2.GL_MODELVIEW);
        gl.glLoadIdentity();

        // Position the camera
        glu.gluLookAt(cameraPos.x, cameraPos.y, cameraPos.z, cameraPos.x
                + cameraForward.x, cameraPos.y + cameraForward.y, cameraPos.z
                + cameraForward.z, cameraUp.x, cameraUp.y, cameraUp.z);

            // uncommenting out this line will make everything disappear.
        // glu.gluPerspective(2, 1, 10, 1000);

        // ****** Start of example code ******
        gl.glCallList(axes); // Show X, Y, Z axes

        gl.glCallList(secondLines);

        gl.glCallList(triangle);

        gazebo.render(gl);

                // ...

من المحتمل أن مشكلتي هي شيء آخر تمامًا. gazebo من النوع ObjModel, ، فئة تقرأ وتمثل .obj الملفات. فيما يلي أساليب قائمة التجسيد والبناء:

private int drawID = 0;

public ObjModel(String fn, GL2 gl) {

            // ...

    readFile(fn);

    drawID = buildDrawList(gl);
}

public void render(GL2 gl) {
    gl.glCallList(drawID);
}

private int buildDrawList(GL2 gl) {
    int result = gl.glGenLists(1);

    gl.glNewList(result, GL2.GL_COMPILE);
    gl.glPushMatrix();
    gl.glBegin(GL2.GL_POLYGON);

    for (Point3f vert : vertices) {
        gl.glVertex3f(vert.x, vert.y, vert.z);
    }

    gl.glEnd();
    gl.glPopMatrix();
    gl.glEndList();

    return result;
}

private void readFile(String filename) {
    try {
        BufferedReader input = new BufferedReader(new FileReader(fileName));
        try {
            String newLine = null;
            while ((newLine = input.readLine()) != null) {

                int indVn = newLine.indexOf("vn ");
                if (indVn != -1) {
                    readNormal(newLine);
                    continue;
                }

                int indV = newLine.indexOf("v ");
                if (indV != -1) {
                    readVertex(newLine);
                    continue;
                }

                int indF = newLine.indexOf("f ");
                if (indF != -1) {
                    readPolygon(newLine);
                    continue;
                }

                int indVt = newLine.indexOf("vt ");
                if (indVt != -1) {
                    readTexture(newLine);
                    continue;
                }
            }
        } finally {
            input.close();
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

يمكنني نشر لقطات الشاشة إذا كانت هناك حاجة إلى مزيد من المعلومات.

اي نصيحه؟ شكرًا.

هل كانت مفيدة؟

المحلول

يبدو أن النموذج الخاص بك يحتوي على رؤوس خارج مستوى القطع. هناك بعض الحلول لهذا الغرض.

1) خفض النموذج الخاص بك بحيث تتناسب جميع القمم داخل إحداثيات المقطع (استخدم glScale())

2) استخدم Gluperseptive لإعداد "كاميرا" تحتوي على طائرة لقطعة أعمق. على الرغم من أنك جربت هذا ، أظن أن نتائجك غير المرغوب فيها هي أنك لا تقوم بتعديل مصفوفة الإسقاط عند استخدام هذه المكالمة. محاولة:

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 60, 1, 0.1, 1000.0 );

3) الاستخدام glFrustrum() لتعديل طائرات القطع. هذا يشبه اللامع ، ولكنه يوفر مرونة أكبر باهظة الثمن من التعقيد المضافة.

FYI لا يزال بإمكانك استخدام Gluperseptive أو Glfrustrum عندما يكون في وضع مصفوفة ModelView ، ولكن ضع في اعتبارك أن الترتيب الذي تقوم به بإجراء هذه المكالمات ومكالمات تحويل المصفوفة الأخرى (على سبيل المثال. GLSCALE ، GLTRANSLATE ، GLROTATE) مهم.

نصائح أخرى

جرب هذا بدلاً من ذلك: Gluperseptive (60 ، 1 ، 0.1 ، 1000) ؛

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