【问题标题】:libgdx confusion about position unitslibgdx 关于位置单位的混淆
【发布时间】:2012-11-07 13:59:33
【问题描述】:

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

【问题讨论】:

    标签: android opengl-es libgdx perspectivecamera


    【解决方案1】:

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

    干杯

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

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

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

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

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

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

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

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

    【讨论】:

    • 你说的不是我的问题。我想了解GL使用的屏幕单位,如何定义和正确使用?
    • 我再次编辑了我的原始帖子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多