OpenGL:模型无法正确显示。 (需要确定绘制距离吗?)

时间:2010-09-13 02:09:54

标签: java opengl graphics jogl .obj

我是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 个答案:

答案 0 :(得分:3)

听起来你的模型在剪裁平面之外有顶点。有一些解决方案。

1)缩小模型,使所有顶点都适合剪辑坐标(使用glScale()

2)使用gluPerspective设置具有更深剪裁平面的“相机”。虽然你已经尝试过这个,但我怀疑你不想要的结果是因为你在使用这个调用时没有修改投影矩阵。 尝试:

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

3)使用glFrustrum()修改剪裁平面。这类似于gluPerspective,但在一些额外的复杂性方面提供了更大的灵活性。

在模型视图矩阵模式下,您仍然可以使用gluPerspective或glFrustrum,但请记住,进行这些调用和其他矩阵转换调用的顺序(例如glScale,glTranslate,glRotate)非常重要。

答案 1 :(得分:0)

试试这个:gluPerspective(60,1,0.1,1000);