Теорема о разделяющей оси AABB, определение глубины перекрытия - PullRequest
1 голос
/ 09 июля 2020

Я хочу обнаружить конфликт между aabb. Мне нужна величина перекрытия, глубина проникновения, чтобы я мог разделить их с помощью этой информации.

Я пытаюсь понять приведенный ниже код, в моем случае он дает неправильные результаты: Например:

для aabb [x, y, width, height], [0, 780, 60, 60] и [0, 606, 120, 240] он производит xOverlap 60, yOverlap -23, вместо этого должно было быть yOverlap 6.

/*
     * Collision Manifold
     * https://gamedevelopment.tutsplus.com/tutorials/how-to-create-a-custom-2d-physics-engine-the-basics-and-impulse-resolution--gamedev-6\
    331#:~:text=Collision%20resolution%20is%20the%20act,allow%20them%20to%20remain%20intersecting.&text=The%20idea%20behind%20impulse%20res\
    olution,to%20separate%20objects%20found%20colliding.
     */
     function aabbvsaabb(a, b) {
    
      let normal,
          penetration;
    
      let n = [b.pos[0] - a.pos[0], b.pos[1] - a.pos[1]];
    
      let aExtent = a.width / 2,
          bExtent = b.width / 2;
    
       let xOverlap, yOverlap;
    
      xOverlap = aExtent + bExtent - Math.abs(n[0]);
    
      xOverlap = Math.min(xOverlap, Math.min(a.width, b.width));
    
      if (xOverlap > 0) {
    
        aExtent = a.height / 2,
        bExtent = b.height / 2;
    
    
        yOverlap = aExtent + bExtent - Math.abs(n[1]);
    
        yOverlap = Math.min(yOverlap, Math.min(a.height, b.height));
        if (yOverlap > 0) {
    
          if (xOverlap < yOverlap) {
            normal = n[0] < 0 ? [-1, 0]: [1, 0];
            penetration = xOverlap;
          } else {
            normal = n[1] < 0 ? [0, -1]:[0,1];
            penetration = yOverlap;
          }
    
        }
      }
    
   
          return {
            normal,
            xOverlap,
            yOverlap
          };
    };
    
 function rect(x, y, w, h) {
   return {
     x, y, width: w, height: h,
     pos: [x, y]
   };
 }
 
 let manifold = aabbvsaabb(rect(0, 780, 60, 60),
 rect(0, 606, 120, 240));
 
 console.log(manifold);
...