Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android下OpenGLES 2.0基于像素的碰撞检测问题_Android_Opengl Es 2.0 - Fatal编程技术网

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

Android下OpenGLES 2.0基于像素的碰撞检测问题,android,opengl-es-2.0,Android,Opengl Es 2.0,这是我在这里的第一篇帖子,因此请为我的错误道歉。 我正在使用OpenGL ES 2.0和Android 2.3开发一个简单的动作游戏。我目前正在开发的游戏框架基于三维世界中的二维精灵。当然,我的世界实体拥有诸如虚拟世界中的位置、浮点[]矩阵形式的旋转值、OpenGL纹理句柄以及Android的位图句柄等信息(我不确定后者是否必要,因为我正在使用OpenGl机器进行光栅化,但为了我的方便,目前它就在那里)。这是问题的背景。现在是问题的背景。 目前我一直使用基于像素的碰撞检测,因为我不确定是哪个对象


这是我在这里的第一篇帖子,因此请为我的错误道歉。
我正在使用OpenGL ES 2.0和Android 2.3开发一个简单的动作游戏。我目前正在开发的游戏框架基于三维世界中的二维精灵。当然,我的世界实体拥有诸如虚拟世界中的位置、浮点[]矩阵形式的旋转值、OpenGL纹理句柄以及Android的位图句柄等信息(我不确定后者是否必要,因为我正在使用OpenGl机器进行光栅化,但为了我的方便,目前它就在那里)。这是问题的背景。现在是问题的背景。
目前我一直使用基于像素的碰撞检测,因为我不确定是哪个对象(这里是OGL纹理或Android位图)我需要采样。我的意思是,我已经尝试采样Android的位图,但它对我完全不起作用-许多运行时崩溃与读取位图之外的内容有关。当然,为了能够从位图中读取像素,我使用了Bitmap.create方法来获得正确旋转的sprite。下面是代码片段:

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.rotateM(mtxRotate,0,-角度,0,0,1);
//原始位图大小,等于其模型空间中的精灵大小,
//以及在世界的太空中
float[]rect=新的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
};
multiplyMV(rect,0,mtxRotate,0,rect,0);
multiplyMV(rect,4,mtxRotate,0,rect,4);
multiplyMV(rect,8,mtxRotate,0,rect,8);
multiplyMV(rect,12,mtxRotate,0,rect,12);
//计算对象的边界框(这是必要的,因为对象已
//前一秒旋转,现在它的边界矩形与它的主体不匹配
左浮动=矩形[0];
浮顶=矩形[1];
右浮动=矩形[0];
浮动底部=矩形[1];
对于(int i=4;i<16;i+=4){
left=Math.min(left,rect[i]);
top=Math.max(top,rect[i+1]);
右=Math.max(右,rect[i]);
bottom=Math.min(bottom,rect[i+1]);
};
干杯

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

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


我希望它能有所帮助……

一般来说,OpenGL只用于图形。你不应该让它接触你的游戏/世界坐标,除非你将它们转换成一个副本以显示在屏幕上。这意味着你拥有的任何边界框都应该用你自己的代码计算。而且要注意基于像素的物理系统:)这听起来对所有东西都是个好主意,直到你尝试它,发现它只是对那些没有物理交互的物品(任何当你触摸它时消失的物品,比如子弹或拾起的物品,或者如果你被触摸时立即死亡)才是个好主意。谢谢你的回答。我想要得到的结果是比基于圆形和长方体的碰撞更好。这可能是真的,像素碰撞不够好,因为它们在计算上很昂贵。最近我读到了一篇关于“凸面形状”的文章,我可能会用它们来增加行为我的碰撞系统的ur关于每像素的警告主要是因为我玩弄了它,为一个老式的平板电脑实现了一个回避功能,并发现它感觉不对劲。使用正确的技术可以大大降低计算复杂性(最初只进行AABB碰撞,可能会通过网格系统或动态四叉树等空间分区信息进行减少,然后使用特殊的黑白碰撞遮罩,并仅测试重叠).凸面图形肯定也是一种很好的方式,它可以让你在游戏中用2d交互代替3d艺术。哦,我必须检查我的其他multiplyMV调用,谢谢你指出这一点。不过,有趣的是,由于multiplyMV的不当使用,应用程序行为从未出现任何问题……至于凸面图形猿类,我得更深入地研究这个问题。非常感谢!