簡體   English   中英

在 Java 中實現 SAT 多邊形碰撞檢測時遇到問題

[英]Having problems implementing SAT polygon collision detection in Java

我目前正在嘗試在 Java 中實現 SAT,但由於某種原因它不起作用。 我已經多次重寫我的代碼,更仔細地查看它並觀看了許多教程,但找不到我的錯誤。 在某些情況下,對於某些邊緣,它部分工作正常,但否則它會在不碰撞時檢測到碰撞。 稍后我將添加 AABB 碰撞檢測以獲得更好的性能。 以下是我的代碼的相關部分:

SAT課程:

public class SAT {
    public static boolean checkSAT(Polygon poly1, Polygon poly2) {
        Vector[] axes = new Vector[poly1.p.length + poly2.p.length];
        
        for (int i = 0; i < poly1.p.length + poly2.p.length; i++) {
            int a = i; if(i == poly1.p.length) a -= poly1.p.length;
            axes[i] = poly1.getEdge(a).getNormal().getNormalized();
            
        }
        
        double p1_min = Double.POSITIVE_INFINITY, p1_max = Double.NEGATIVE_INFINITY,
               p2_min = Double.POSITIVE_INFINITY, p2_max = Double.NEGATIVE_INFINITY;
        
        for (int i = 0; i < axes.length; i++) {
            for (int j = 0; j < poly1.p.length; j++) {
                double proj = axes[i].dotProduct(poly1.p[j]);
                if(proj < p1_min) p1_min = proj;
                if(proj > p1_max) p1_max = proj;
                
            }
            
            for (int j = 0; j < poly2.p.length; j++) {
                double proj = axes[i].dotProduct(poly2.p[j]);
                if(proj < p2_min) p2_min = proj;
                if(proj > p2_max) p2_max = proj;
                
            }
            
            if (p1_max < p2_min || p2_max < p1_min)
                return false;
            
        }
        
        return true;
        
    }
}

向量類:

public class Vector {
    public final double x;
    public final double y;
    
    public Vector(double x, double y) {
        this.x = x;
        this.y = y;
        
    }
    
    public Vector getNormal() {
        return new Vector(-y, x);
        
    }
    
    public double getLength() {
        return Math.sqrt(x*x + y*y);
        
    }
    
    public Vector getNormalized() {
        double l = getLength();
        
        return new Vector(x/l, y/l);
        
    }
    
    public double dotProduct(Vector vec) {
        return x * vec.x + y * vec.y;
    }
    
}

多邊形類的相關部分:

public class Polygon {
    public Vector[] m; //"model" of the polygon
    public Vector[] p; //coordinates of the corners of the polygon in space
    
    public double posX;
    public double posY;
    
    public Polygon(Vector[] m) {
        this.m = m;
        
        p = new Vector[m.length];
        
        transform();
        
    }
    
    //later i'll add rotation
    public void transform() {
        for (int i = 0; i < m.length; i++) {
            p[i] = new Vector(m[i].x + posX, m[i].y + posY);
        }
        
    }
    
    public void setPosition(Vector pos) {
        posX = pos.x;
        posY = pos.y;
        
        transform();
        
    }
    
    public Vector getEdge(int i) {
        if(i >= p.length) i = 0;
        int j = i+1; if(j >= p.length) j = 0;
        return new Vector(p[j].x - p[i].x, p[j].y - p[i].y);
        
    }
    
}

更新:我發現了錯誤,這簡直是愚蠢的!! 最重要的是,我花了超過 5 個小時才找到它!!!!!!

        double p1_min = Double.POSITIVE_INFINITY, p1_max = Double.NEGATIVE_INFINITY, 
               p2_min = Double.POSITIVE_INFINITY, p2_max = Double.NEGATIVE_INFINITY;
        //those doubles should be declared inside the for loop

        for (int i = 0; i < axes.length; i++) {
            //right here

            for (int j = 0; j < poly1.p.length; j++) {
                double proj = axes[i].dotProduct(poly1.p[j]);
                if(proj < p1_min) p1_min = proj;
                if(proj > p1_max) p1_max = proj;
                
            }
            
            for (int j = 0; j < poly2.p.length; j++) {
                double proj = axes[i].dotProduct(poly2.p[j]);
                if(proj < p2_min) p2_min = proj;
                if(proj > p2_max) p2_max = proj;
                
            }
            
            if (p1_max < p2_min || p2_max < p1_min)
                return false;
            
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM