OpenGL: модель не отображается правильно.(Нужно исправить расстояние отрисовки?) - PullRequest
0 голосов
/ 13 сентября 2010

Я новичок в 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();
    }
}

Я могу публиковать скриншоты, если требуется дополнительная информация.

Любой совет?Спасибо.

Ответы [ 2 ]

3 голосов
/ 19 сентября 2010

Похоже, что ваша модель имеет вершины вне плоскости отсечения. Есть несколько решений для этого.

1) уменьшите вашу модель так, чтобы все вершины вписывались в координаты клипа (используйте glScale())

2) Используйте gluPerspective, чтобы установить «камеру» с более глубокой плоскостью отсечения. Хотя вы пытались это сделать, я подозреваю, что ваши нежелательные результаты связаны с тем, что вы не изменяете матрицу проекции при использовании этого вызова. Попробуйте:

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

3) Используйте glFrustrum(), чтобы изменить плоскости отсечения. Это похоже на gluPerspective, но обеспечивает большую гибкость за счет некоторой дополнительной сложности.

К вашему сведению, вы все равно можете использовать gluPerspective или glFrustrum, когда находитесь в режиме матрицы просмотра модели, но имейте в виду, что порядок, в котором вы делаете эти вызовы и другие вызовы преобразования матрицы (например, glScale, glTranslate, glRotate), важен.

0 голосов
/ 13 сентября 2010

попробуйте вместо этого: gluPerspective (60, 1, 0,1, 1000);

...