gpt4 book ai didi

android - Android下OpenGLES 2.0基于像素的碰撞检测问题

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:48:42 25 4
gpt4 key购买 nike


这是我在这里的第一篇文章,因此对于任何错误表示歉意。
我正在使用 OpenGL ES 2.0 和 Android 2.3 开发一个简单的 Action 游戏。我目前正在开发的游戏框架基于存在于三维世界中的二维 Sprite 。当然,我的世界实体拥有想象世界中的位置、float[] 矩阵形式的旋转值、OpenGL 纹理句柄以及 Android 的位图句柄等信息(我不确定后者是否必要,因为我正在做使用 OpenGl 机器的光栅化,但为了我的方便,暂时就在那里)。这是简要的背景,现在是有问题的问题。
目前我坚持使用基于像素的碰撞检测,因为我不确定我需要采样哪个对象(这里是 OGL 纹理或 Android 位图)。我的意思是,我已经尝试过对 Android 的位图进行采样,但它对我来说完全不起作用——许多与读取位图外部相关的运行时崩溃。当然,为了能够从位图中读取像素,我使用了 Bitmap.create 方法来获得正确旋转的 Sprite 。这是代码 fragment :

android.graphics.Matrix m = new android.graphics.Matrix();
if(o1.angle != 0.0f) {
m.setRotate(o1.angle);
b1 = Bitmap.createBitmap(b1, 0, 0, b1.getWidth(), b1.getHeight(), m, false);
}

另一个问题,可能会增加问题,甚至是主要问题,是我的相交矩形(表示两个对象相互的二维空间的矩形)是从两个边界框的部分构建的,这些边界框是用使用 OpenGL 矩阵 Matrix.multiplyMV 功能(代码如下)。会不会是Android和OpenGL这两种矩阵计算方式不一样?

Matrix.rotateM(mtxRotate, 0, -angle, 0, 0, 1);

// original bitmap size, equal to sprite size in it's model space,
// as well as in world's space
float[] rect = new float[] {
origRect.left, origRect.top, 0.0f, 1.0f,
origRect.right, origRect.top, 0.0f, 1.0f,
origRect.left, origRect.bottom, 0.0f, 1.0f,
origRect.right, origRect.bottom, 0.0f, 1.0f
};

android.opengl.Matrix.multiplyMV(rect, 0, mtxRotate, 0, rect, 0);
android.opengl.Matrix.multiplyMV(rect, 4, mtxRotate, 0, rect, 4);
android.opengl.Matrix.multiplyMV(rect, 8, mtxRotate, 0, rect, 8);
android.opengl.Matrix.multiplyMV(rect, 12, mtxRotate, 0, rect, 12);

// computation of object's bounding box (it is necessary as object has been
// rotated second ago and now it's bounding rectangle doesn't match it's host
float left = rect[0];
float top = rect[1];
float right = rect[0];
float bottom = rect[1];
for(int i = 4; i < 16; i += 4) {
left = Math.min(left, rect[i]);
top = Math.max(top, rect[i+1]);
right = Math.max(right, rect[i]);
bottom = Math.min(bottom, rect[i+1]);
};

最佳答案

干杯,

首先请注意,您的代码中存在错误。您不能在源向量和目标向量相同的情况下使用 Matrix.multiplyMV() (该函数将正确计算它将在源向量中覆盖的 x 坐标。但是,它需要原始 x 来计算 y、z 和 w坐标——这又是有缺陷的)。另请注意,在第一个检测碰撞步骤中使用边界球会更容易,因为它们不需要如此复杂的代码来执行矩阵转换。

然后,碰撞检测。您不应该从位图或纹理中读取。你应该做的是为你的对象建立一个轮廓(这很简单,轮廓只是一个位置列表)。之后,您需要构建填充(非凸)轮廓的凸对象。它可以通过例如实现。耳朵剪裁算法。它可能不是最快的,但它很容易实现并且只需一次即可。一旦你有了凸物体,你就可以使用矩阵转换它们的坐标并检测与你的世界的碰撞(有很多关于光线-三角形相交的好文章你可以使用),并且你可以获得与使用像素相同的精度基于碰撞检测。

希望对你有帮助...

关于android - Android下OpenGLES 2.0基于像素的碰撞检测问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7285584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com