Java 闭合对象看起来拉伸/更改消失点?

Java 闭合对象看起来拉伸/更改消失点?,java,android,opengl-es,perspective,Java,Android,Opengl Es,Perspective,我在OpenGl中为我的android应用程序构建了一个非常漂亮的魔方。不幸的是,当我把它靠近相机时,它看起来有点拉长了。看起来是这样的: 我希望我的立方体在屏幕上尽可能大,但不要拉伸 下面是一些代码: gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); float z = 3; float x = 0; float y = 3; GLU.gluLookAt(gl, x, y, z,

我在OpenGl中为我的android应用程序构建了一个非常漂亮的魔方。不幸的是,当我把它靠近相机时,它看起来有点拉长了。看起来是这样的:

我希望我的立方体在屏幕上尽可能大,但不要拉伸

下面是一些代码:

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.glupperspective(),但没有成功

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

@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);
}
@覆盖
已创建曲面上的公共void(GL10 gl、EGLConfig配置){
gl.glDisable(GL10.gl\u抖动);
gl.glClearColor(0,0,0,0);
gl.glShadeModel(GL10.glu平滑);
gl.glClearDepthf(1f);
gl.glEnable(GL10.gl_深度_试验);
gl.glDepthFunc(GL10.gl_LEQUAL);
gl.glHint(GL10.gl\u透视图\u校正\u提示,GL10.gl\u最佳);
}
@凌驾
公共框架(GL10 gl){
gl.glDisable(GL10.gl\u抖动);
gl.glClear(GL10.gl_颜色_缓冲_位| GL10.gl_深度_缓冲_位);
gl.glMatrixMode(GL10.gl_MODELVIEW);
gl.glLoadIdentity();
浮点数z=3;
浮动x=0;
浮动y=3;
GLU.gluLookAt(gl,x,y,z,0,0,0,1,0);
gl.glRotatef(angleX,1,0,0);//这是接触曲面时的旋转
gl.glRotatef(角度,0,1,0);
f、 绘制(gl);//绘制立方体的各个部分
r、 绘图(gl);
l、 绘图(gl);
u、 绘图(gl);
d、 绘图(gl);
b、 绘图(gl);
对于(int i=0;i
相机离物体太近。尝试将相机向后移动一点,将近平面向后移动一点。(第5个参数到
glFrustumf
)。

请显示使用的投影矩阵。嘿,Stefan,我不确定我刚才添加的代码是否是您要找的。我找不到你要的任何投影矩阵。我从一个教程中获得了大部分代码,但我不理解其中的每一个细节。希望这有帮助。谢谢你看,相机离物体太近了。尝试将相机向后移动一点,将近平面向后移动一点。(第5个参数到
glFrustumf
)。就是这样!我改变了
gl.glFrustumf(-ratio,ratio,-1,1,2,25)和相机距离。非常聪明,斯蒂芬。非常感谢。我已经把课文抄成了答案。请接受。