【问题标题】:Separating axis theorem algorithm not working分离轴定理算法不起作用
【发布时间】:2014-12-17 19:30:46
【问题描述】:

使用 Haxe 编写基于 following guide 的分离轴实现。似乎无法弄清楚为什么它不起作用,测试了各个部分,但它总是在碰撞时返回 true,即使无论如何都没有。

任何帮助表示赞赏! :D

public static function polygon_polygon(poly1Pos:Vec2, poly1Verts:Array<Vec2>, poly2Pos:Vec2, poly2Verts:Array<Vec2>):Bool
{
    var axes1:Array<Vec2> = MathTools.getAxes(poly1Verts);
    var axes2:Array<Vec2> = MathTools.getAxes(poly2Verts);

    for (i in 0...axes1.length)
    {
        var p1:Projection = MathTools.project(axes1[i], poly1Verts);
        var p2:Projection = MathTools.project(axes1[i], poly2Verts);

        if (!p1.overlap(p2))
        {
            return false;
        }
    }
    for (i in 0...axes2.length)
    {
        var p1:Projection = MathTools.project(axes2[i], poly1Verts);
        var p2:Projection = MathTools.project(axes2[i], poly2Verts);

        if (!p1.overlap(p2))
        {
            return false;
        }
    }
    return true;
}

/**
 * Gets a list of normalized axis from a list of vertices
 */
public static function getAxes(verts:Array<Vec2>):Array<Vec2>
{
    var axes:Array<Vec2> = new Array<Vec2>();
    for (i in 0...verts.length)
    {
        var p1:Vec2 = verts[i];
        var p2:Vec2 = verts[i + 1 == verts.length ? 0 : i + 1];
        var normal:Vec2 = p1.getSubtract(p2).getPerpendicular().getNormal();
        axes[i] = normal;
    }
    return axes;
}

/**
 * Projects a set of vertices onto an axis
 */
public static function project(axis:Vec2, verts:Array<Vec2>):Projection
{
    var min:Float = axis.dot(verts[0]);
    var max:Float = min;
    for (i in 1...verts.length)
    {
        var p:Float = axis.dot(verts[i]);
        if (p < min) min = p;
        else if (p > max) max = p;
    }
    return new Projection(min, max);
}

class Projection
{

    public var min:Float;
    public var max:Float;

    public function new(min:Float, max:Float) 
    {
        this.min = min;
        this.max = max;
    }

    public function overlap(p:Projection):Bool
    {
        if (max < p.min || p.max < min) return false;
        else return true;

    }

}

【问题讨论】:

    标签: collision-detection haxe separating-axis-theorem


    【解决方案1】:

    您确定顶点正在被转换吗? 然后检查垂线是右还是左,必须根据顶点的顺序来选择,顺时针还是逆时针。

    【讨论】:

    • 我检查了坐标轴值、投影后的最小值和最大值,以及一些明确的投影情况,它们重叠和不重叠。这一切似乎都单独工作正常。我现在只使用两个方块来测试碰撞,所以当我调试时这些数字更容易使用。我尝试交换垂直线只是为了看看它是否有任何区别,但没有。可能我以后需要根据顶点实现左右代码,但这似乎不是主要问题。
    • 已解决好吧,我是个白痴,我传递给我的 polygon_polygon 函数的顶点是相对于形状的原点,而不是世界上的实际坐标.我只是将形状中心的位置添加到所有顶点来修复它。感谢所有的帮助!
    • :) 好的。我以前遇到过这样的事情,就像你一样:D
    • 我认为这个实现不够高效,如果你移动这条线 :var axes2:Array = MathTools.getAxes(poly2Verts);在第一个循环之后。它会更快。
    • 好点,如果之前有返回,则不需要不必要地生成第二组轴。干杯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多