我试图创建一个涉及用户走进屏幕的游戏。我发现了一些关于如何执行此操作的想法here由此question引导。但该教程基于GLES1,我无法将其用于GLES2。
这是我到目前为止所尝试的,
我修改了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中调整视角,我们将不胜感激其他技巧。
答案 0 :(得分:1)
老实说,我放弃并制作了自己的伪3D投影引擎。这个问题是它很慢,因为它都是在没有GL编码的情况下完成的。 我不得不使用Sprite组和1个非常大的网格(Mesh是道路),如果你有连绵起伏的山丘或隧道等,这真的会伤害Z轴上的分层。你会在下面的图片中看到。
最后我必须创建3个精灵组和3个网格。检测精灵是否在地面/隧道/等后面。 从那时起,我会向后(进入距离) 1:从第一组中取出精灵并进入第二组 2:停止所有第一个网格顶点,然后从该点开始绘制第二个网格 3:重复,如果在第二个网格后面发生碰撞,则启动第三个
很难解释,花了我一段时间让它运转起来,并且在很多限制下非常古怪。我花了几个月的时间才将FPS从3回到60。
没有分层(树木在地面上显示)
使用碰撞检测分层
如果您愿意,我可以详细介绍。
如果有人有更好的方法,请为我们提供一些信息。