像素完美的旋转位图碰撞检测

我有两个使用matrix绘制到canvas上的位图

canvas.drawBitmap(bitmap, matrix, paint); 

首先要弄清楚,如果我需要检查碰撞,我正在使用eucilidean载体

 //vector between the bitmaps float vx = bitmap2.x - bitmap1.x; float vy = bitmap2.x - bitmap1.x; //magnitude of the vector between the two bitmaps float m = Math.sqrt( (vx*vx)+(vy*vy) ); if( m < bitmap1.getDiagonalWidth() + bitmap1.getDiagonalWidth()) { //pixel perfect collision detection required } 

首先,这是处理这部分碰撞检测的最好方法吗?

其次,一旦我发现碰撞是可能的,在将位图投影到运行像素完美碰撞检测的方法之前,我需要做些什么吗? 基本上,这个问题是因为图像的旋转而变得复杂吗?

编辑*有可能位图也将由matrix缩放。 我想这会使事情进一步复杂化。

如果您可以生成适合于平移和旋转对象的matrix,则可以非常直接地解决这个问题

假设对象A具有平移&旋转matrixmat_A,而对象B具有平移&旋转matrixmat_B

你需要循环遍历A中的像素,如果它的alpha值大于0(或者你想要的自定义阈值),检查B的哪个像素位于这个位置,并检查这个像素是否也有非0的alpha通道

使用matrixmath,您可以将第二个对象移动到第一个对象的世界空间,以获得像素之间的映射

您需要将全局位置转换为对象B空间中的本地位置。这是mat_B 。 所以,我们必须用以下matrix来改变A中的地方位置:

 matrix fromAToB = mat_A * Inverse_Matrix(mat_B); //now iterate over each pixel of A for(int x = 0; x < width_A; ++x) { for(int y = 0; y < height_A; ++y) { // check alpha channel if (alpha_value != 0) { //calculate the position in B Vector pos_in_A = new Vector2(x, y); Vector pos_in_B = Vector2.Transform(posInA, fromAToB); //use width_B & height_B to make sure the point is within the object if (point_inside_B) { //round posInB.X and posInB.Y to integer values //check if the pixel is transparent //if pixel is not transparent, you got collision } } } } 

这不是真正合适的Java代码,主要是pseduo代码,但我认为它很好地传达了这个想法