1

我前一天开始研究 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 方面的经验。请指导我哪里错了?这是屏幕截图:

在此处输入图像描述

4

1 回答 1

0

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

干杯

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

您需要实现调整大小功能,在那里创建您的相机,因为它在调用渲染之前创建窗口时被调用一次。类似的东西

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

应该是你要找的。在相机部分阅读更多关于它的信息。可能是关于正交相机,但基本原理仍然适用

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

但是有一些约定,例如,默认情况下,相机将“向下看”负 Z 轴,正 X 向右,正 Y 向上。这称为右手系统。

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

如果您只对 2D 感兴趣,请使用称为 an 的东西OrthographicCamera,这样您绘制的内容不会随着与相机的距离而改变大小(它没有透视图

于 2012-11-07T17:57:30.263 回答