libgdx对位置单位的困惑

时间:2012-11-07 13:59:34

标签: android opengl-es libgdx perspectivecamera

我前一天开始研究libgdx。我想创建一个三角形,其点应该是两个角应该在屏幕的左下角和右下角以及一个点位于屏幕的顶部中间。我正在使用透视相机。我的代码示例是:

public class Test1 implements ApplicationListener{

    PerspectiveCamera camera;
    Mesh triangle;

    @Override
    public void create() {
        // TODO Auto-generated method stub
        camera = new PerspectiveCamera(67, 45, 45 / (Gdx.graphics.getWidth() / (float)Gdx.graphics.getHeight()));
        camera.near = 1;
        camera.far = 200;
        triangle = createTriangle();
    }

    @Override
    public void resize(int width, int height) {
        // TODO Auto-generated method stub

    }

    @Override
    public void render() {
        // TODO Auto-generated method stub
        GL10 gl = Gdx.gl10;
        gl.glClearColor(0, 0, 0, 1);
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        gl.glEnable(GL10.GL_DEPTH_TEST);

        camera.update();
        camera.apply(gl);

        triangle.render(Gdx.gl10.GL_TRIANGLES);

    }

    public Mesh createTriangle() {
        float[] vertices = {-45f, -27f, -67,
                45f, -27f, -67,
                0, 27f, -67
        };

        short[] indices = {0,1,2};
        Mesh mesh = new Mesh(true, 3, 3, new VertexAttribute(Usage.Position, 3, ShaderProgram.POSITION_ATTRIBUTE));
        mesh.setVertices(vertices);
        mesh.setIndices(indices);
        return mesh;


    }

    @Override
    public void pause() {
        // TODO Auto-generated method stub

    }

    @Override
    public void resume() {
        // TODO Auto-generated method stub

    }

    @Override
    public void dispose() {
        // TODO Auto-generated method stub

    }
}

我读到OpenGL是无单元的,所以我决定有45个单位宽,因此设置它的高度。当我执行应用程序时,三角形不像我预期的那样。它小于屏幕的宽度和高度。我以前没有3D经验。请指导我哪里错了? 这是屏幕截图:

enter image description here

1 个答案:

答案 0 :(得分:0)

你说你想创建一个矩形?你只指定了3个顶点?你的意思是Triangle,如果是的话,你的结果似乎有什么问题?

干杯

编辑1: 重读了你的问题,我为我给出的答案道歉。

你需要实现resize函数,在调用render之前创建窗口时调用一次调用它。

的内容
@Override
public void resize(int width, int height) {
   float aspectRatio = (float) width / (float) height;
   camera = new PerspectiveCamera(67,2f * aspectRatio, 2f);
}

应该是您正在寻找的。在相机部分中详细了解here。它可能与正交相机有关,但基本原理仍然适用

编辑2: OpenGl中的单位是特定于应用程序的。您必须设置您使用的单位。

然而,有些惯例,例如通过defualt相机将“向下看”负Z轴,正向X向右,正向Y向上。这被称为右手系统。

您已将3D相机设置为视图宽度为45(因此相机宽度为45的对象将填满屏幕),高宽比为45。我们必须记住的是,3D中远处的物体比它们近距离时的物体要小。所以你可能一直期望三角形填满屏幕,但是三角形点的Z坐标距离相机很远(距离相机67),因此它使三角形看起来更小。

如果您只对2D感兴趣,那么请使用一个名为OrthographicCamera的东西,这使得它所绘制的内容不会因距离相机的距离而改变大小(它没有透视)< / p>