(OpenGL ES)远离视图中心的对象被拉伸 [英] (OpenGL ES) Objects away from view centre are stretched

查看:16
本文介绍了(OpenGL ES)远离视图中心的对象被拉伸的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我在 OpenGL ES 中生成了一个球体(特别是 OpenGL ES 2.0,在 Java 中,用于 Android).当这个球体放置在与我的视图矩阵使用的中心相同的位置时,这很好,但是当偏离中心时,球体会严重扭曲(见下文).

So I have generated a sphere in OpenGL ES (specifically, OpenGL ES 2.0, in Java, for Android). When this sphere is placed at the same position as the centre used for my view matrix, it's fine, but when off centre the sphere is pretty badly warped (see below).

为什么会发生这种情况,我该如何阻止它?

Why is this happening, and how do I stop it?

那是同一个球体.右上角的那个只是在 x 和 y(不是 z)中翻译的.

That's the same sphere. The one in the upper right is just translated in x and y (not z).

我的 GLSurfaceView.renderer 实现中的一些代码片段,

Some snippets of the code from my implementation of GLSurfaceView.renderer,

public void onSurfaceCreated(GL10 unused, EGLConfig config) {
    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    GLES20.glEnable(GLES20.GL_CULL_FACE);
    GLES20.glEnable(GLES20.GL_DEPTH_TEST);

    // Both centred on (0,0,0), of radius 1.0.
    outerSphere = new Sphere();
    centreSphere = new Sphere();
}

public void onSurfaceChanged(GL10 unused, int width, int height) {
    GLES20.glViewport(0, 0, width, height);

    ratio = (float) width / height;

    final float left = -ratio;
    final float right = ratio;
    final float bottom = -1.0f;
    final float top = 1.0f;
    final float near = 1.0f;
    final float far = 100.0f;

    Matrix.frustumM(projMatrix, 0, left, right, bottom, top, near, far);
}

public void onDrawFrame(GL10 unused) {
    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);

    float eyeX = 0.0f;
    float eyeY = 0.0f;
    float eyeZ = 10.0f;

    final float lookX = 0.0f;
    final float lookY = 0.0f;
    final float lookZ = 0.0f;

    final float upX = 0.0f;
    final float upY = 1.0f;
    final float upZ = 0.0f;

    Matrix.setLookAtM(viewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ,
                      upX, upY, upZ);

    // Set identity matrix as input for translations.
    Matrix.setIdentityM(outerModelMatrix, 0);

    // Translate outer sphere by 5 in x and y.
    Matrix.translateM(outerModelMatrix, 0, 5.0f, 5.0f, 0.0f);

    // MVP matrix = Projection * View * Model.
    Matrix.multiplyMM(centreMVPMatrix, 0, viewMatrix, 0, centreModelMatrix, 0);
    Matrix.multiplyMM(centreMVPMatrix, 0, projectionMatrix, 0, centreMVPMatrix, 0);
    Matrix.multiplyMM(outerMVPMatrix, 0, viewMatrix, 0, outerModelMatrix, 0);
    Matrix.multiplyMM(outerMVPMatrix, 0, projectionMatrix, 0, outerMVPMatrix, 0);

    outerSphere.draw(outerMVPMatrix);
    centreSphere.draw(outerMVPMatrix);

}

我的着色器很简单,

private final static String vertexShaderCode =
    "uniform mat4 u_MVPMatrix;" +
    "attribute vec4 a_Position;" +
    "uniform vec4 u_Color;" +
    "void main() {" +
    "    gl_Position = u_MVPMatrix * a_Position;" +
    "}";
private final static String fragmentShaderCode = 
    "precision mediump float;" +
    "uniform vec4 u_Color;" +
    "void main() {" +
    "    gl_FragColor = u_Color;" +
    "}";

我几乎省略了 Sphere 类中的所有代码,以及其他我认为不需要的东西(?),但如果需要它们,我会把它们放上来.

I've left out almost all code from the Sphere class, and other things that I don't think are necessary(?), but if they are needed I'll put them up.

推荐答案

欢迎来到 透视变形

更多细节:您的视野太窄,您必须塑造截头锥体,使其更大一些.

A little more detail: your Field-Of-View is too narrow, you'll have to shape the frustum so that it's a bit larger.

这篇关于(OpenGL ES)远离视图中心的对象被拉伸的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆