【问题标题】:Collision Resolving - Point outside Circle碰撞解决 - 圆外点
【发布时间】:2011-11-12 02:04:37
【问题描述】:

在基于时间步长的模拟中,点粒子 p(x,y) 与速度 v(x,y) 之间的碰撞,从圆内 (x-a)^2 + (y-b)^2 = r^,与那个圆,发生在两个时间步之间,这样当检测到碰撞时,点粒子已经离开了圆。

因此,我想将粒子向后移动一个量 outsideDepth(x,y),使其正好位于圆上。

现在的问题是:如何确定点p与速度矢量与圆的交点之间的距离l?

在代码中:

Vector2 circleCollision(double a, double b, double r, double x, double y){

    double s = sqrt( pow((x-a),2) + pow((y-b),2) );

    if (s>r) {
        Vector2 outsideDepth = {0,0};

        // determine depth by which point lies outside circle as vector (x,y)

        return outsideDepth;
    }
}

编辑尝试 Ian 的解决方案,将 2 和 3 替换为 1 并重新排列 t,然后按如下方式确定 p 和 q:

p = 1/( pow(v.x,2) + pow(v.y,2) ) * (-2*x*v.x + 2*v.x*a - 2*y*v.y + 2*v.y*b);
q = 1/( pow(v.x,2) + pow(v.y,2) ) * (-2*x*a -2*y*b + x*x + y*y + a*a + b*b - r*r);

root = sqrt( pow((p/2),2) - q );
t1 = -p/2 + root;
t2 = -p/2 - root;

// ???

【问题讨论】:

    标签: c++ collision-detection geometry


    【解决方案1】:

    同时求解(简单代码)

    (x-a)^2 + (y-b)^2 = r^2

    x = p(x) - v(x)*t

    y = p(y) - v(y)*t

    对于一些 t。取决于discriminant(使用 b^2 - 4ac 的条件),可能有零个、一个或两个解决方案。如果两个解决方案 (b^2 > 4ac) 选择最小化大小的 t (p(x,y) - t(x, y)) (使用 pythag)。返回。

    【讨论】:

    • 我已经更新了我的问题,尝试使用您的解决方案。请您详细说明如何找到最小值。
    • 上面的方程会给你一个位移矢量,v1(x, y),比如说一些 t1(代表圆上以 (a, b) 为中心的点)。使用向量加法(减法)求粒子点与圆上点之间的位移向量。即 diffv = p - v1。然后计算该向量的大小( (x^2 + y^2) ^ 1/2 )。对另一个解决方案 t2 执行相同的操作。找到它们之间的位移矢量的最小量值,并假设粒子更接近它离开圆的点(对于 const 速度为真)。 t 将定义出口点。
    【解决方案2】:

    您希望新点与原始点 (x, y) 的角度相同,但要向内移动。要将点“向内”移动到圆的边界,请通过减去 来调整其 x 坐标p>

    (x -a) * r / d
    和你的 y 坐标,分别从 x 和 y 中减去
    (y - b) * r / d

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 2014-05-20
      相关资源
      最近更新 更多