java - 近距离的物体看起来被拉伸(stretch)/改变消失点?

标签 java android opengl-es perspective

我已经用 OpenGL 为我的 Android 应用程序构建了一个非常漂亮的魔方。不幸的是,当我把它靠近相机时,它看起来有点拉伸(stretch)。它看起来像这样:

My Rubiks Cube 1

My Rubiks Cube 2

我希望我的立方体尽可能大,但不要拉伸(stretch)。

这里有一些代码:

gl.glMatrixMode(GL10.GL_MODELVIEW);

    gl.glLoadIdentity();

    float z = 3;
    float x = 0;
    float y = 3;

    GLU.gluLookAt(gl, x, y, z, 0, 0, 0, 0, 1, 0);

我尝试使用 GLU.gluPerspective() 但没有成功。

编辑:这是我的渲染器类的更多代码:

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    gl.glDisable(GL10.GL_DITHER);

    gl.glClearColor(0, 0, 0, 0);

    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glClearDepthf(1f);
    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glDepthFunc(GL10.GL_LEQUAL);
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
}

@Override
public void onDrawFrame(GL10 gl) {

    gl.glDisable(GL10.GL_DITHER);

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

    gl.glMatrixMode(GL10.GL_MODELVIEW);

    gl.glLoadIdentity();

    float z = 3;
    float x = 0;
    float y = 3;

    GLU.gluLookAt(gl, x, y, z, 0, 0, 0, 0, 1, 0);


    gl.glRotatef(angleX, 1, 0, 0); //This is the rotation if surface is touched
    gl.glRotatef(angleY, 0, 1, 0); 

    f.draw(gl); //drawing the pieces of the cube
    r.draw(gl);
    l.draw(gl);
    u.draw(gl);
    d.draw(gl);
    b.draw(gl);

    for (int i = 0; i < corners.length; i++) {
        corners[i].draw(gl);
    }
    for (int i = 0; i < edges.length; i++) {
        edges[i].draw(gl);
    }
    display(); //this has nothing to do with opengl

}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
    gl.glViewport(0, 0, width, height);

    float ratio = (float) width / height;

    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glFrustumf(-ratio, ratio, -1, 1, 1, 25);
}

最佳答案

相机距离物体太近。尝试将相机向后移动一点,并将近平面向后移动一点。 (glFrustumf 的第 5 个参数)。

关于java - 近距离的物体看起来被拉伸(stretch)/改变消失点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10124618/

相关文章:

java - Spring MVC @RequestMapping注解中Path和Variable的区别

java - 如何在程序中从命令行使用数学运算符?

java - 我想从 firebase 存储中检索视频

android - 为 Google Map v2 fragment 创建 OnDragListener

performance - unity3d 和 webgl 在性能和速度方面的比较

java - 多线程写入文本文件

java - 如何在 spring mvc 中的服务器端验证上显示错误消息

android - 如何无限期地保持建立的 TCP 连接?

android - 将普通的安卓屏幕拆分为谷歌纸板 View

java - 检查 draw_texture