使用andengiine GLES2创建透视图

时间:2015-08-19 10:26:26

标签: andengine perspectivecamera

我试图创建一个涉及用户走进屏幕的游戏。我发现了一些关于如何执行此操作的想法here由此question引导。但该教程基于GLES1,我无法将其用于GLES2。

以下是设计的外观,Game Design

这是我到目前为止所尝试的,

我修改了GLState并添加了

public void frustumProjectionGLMatrixf(final float fov_degrees, float aspect, float zNear, float zFar) {
    this.mProjectionGLMatrixStack.glFrustumf(fov_degrees, aspect, zNear, zFar);
}

我修改了GLMatrixStack并添加了

public void glFrustumf(float fov_degrees, float aspect, float zNear, float zFar) {

        float[] mTemp = new float[2 * GLMatrixStack.GLMATRIX_SIZE];
        Matrix.setIdentityM(this.mMatrixStack, this.mMatrixStackOffset);
//                Matrix.frustumM(this.mMatrixStack, this.mMatrixStackOffset, 0, this.getWidthRaw(), this.getHeightRaw(), 0, 10, 300);
        Matrix.perspectiveM(this.mMatrixStack, this.mMatrixStackOffset, fov_degrees, aspect, zNear, zFar);

        Matrix.setLookAtM(this.mMatrixStack, this.mMatrixStackOffset, 0, 120f, zNear * 10, 0, 0, 0f, 0, 1, 0);

        Matrix.scaleM(this.mMatrixStack, this.mMatrixStackOffset, 1, -1, 1);

        System.arraycopy(this.mMatrixStack, this.mMatrixStackOffset, mTemp, GLMatrixStack.GLMATRIX_SIZE, GLMatrixStack.GLMATRIX_SIZE);
        Matrix.multiplyMM(this.mMatrixStack, this.mMatrixStackOffset, mTemp, GLMatrixStack.GLMATRIX_SIZE, mTemp, 0);
    }

我按照以下方式创建了相机

this.camera = new Camera(0, 0, WIDTH, HEIGHT) {
        @Override
        public void onApplySceneMatrix(final GLState pGLState) {
            super.onApplySceneMatrix(pGLState);
            this.setZClippingPlanes(-3000, 3000);
            setFrustum(pGLState);

        }

        @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
        private void setFrustum(GLState pGLState) { // set field of view to 60 degrees
            float fov_degrees = 60;
            float fov_radians = fov_degrees / 180 * (float) Math.PI;

            float aspect = this.getWidth() / (this.getHeight());
            float camZ = this.getHeight() / 2 / (float) Math.tan(fov_radians / 2);

            pGLState.frustumProjectionGLMatrixf(fov_degrees, aspect, -100, 100);
            pGLState.flush();
        }
    };

但屏幕上没有任何内容。场面完全是黑色的。任何如果没有办法在AndEngine GLES2中调整视角,我们将不胜感激其他技巧。

1 个答案:

答案 0 :(得分:1)

老实说,我放弃并制作了自己的伪3D投影引擎。这个问题是它很慢,因为它都是在没有GL编码的情况下完成的。 我不得不使用Sprite组和1个非常大的网格(Mesh是道路),如果你有连绵起伏的山丘或隧道等,这真的会伤害Z轴上的分层。你会在下面的图片中看到。

最后我必须创建3个精灵组和3个网格。检测精灵是否在地面/隧道/等后面。 从那时起,我会向后(进入距离) 1:从第一组中取出精灵并进入第二组 2:停止所有第一个网格顶点,然后从该点开始绘制第二个网格 3:重复,如果在第二个网格后面发生碰撞,则启动第三个

很难解释,花了我一段时间让它运转起来,并且在很多限制下非常古怪。我花了几个月的时间才将FPS从3回到60。

没有分层(树木在地面上显示) No Layering

使用碰撞检测分层 With Layering

如果您愿意,我可以详细介绍。

如果有人有更好的方法,请为我​​们提供一些信息。