【问题标题】:Slow the movement of circle collision resolution减慢圆碰撞分辨率的运动
【发布时间】:2019-10-14 06:58:21
【问题描述】:

我为我目前正在开发的游戏编写了一个碰撞检测和解决系统。碰撞解决方案并没有按预期工作。有时我会在另一个圆圈内生成一个圆圈,当这种情况发生时,我希望内圆圈慢慢移出另一个圆圈的直径,但目前我正在工作的代码非常快速且不和谐。它会立即传送到圆圈之外,而不是缓慢的过渡。

我知道我当前使用的代码告诉圆圈它应该在哪里,所以我只需要慢慢地将圆圈移动到那个位置。但事实证明这很困难。

我尝试了几个解决方案,其中一个包含在下面的代码中。我还尝试使用线性插值将圆移动到其当前位置,即碰撞算法告诉它应该在的位置。那也不能正常工作。

//r is the radius of the circle
var dx = cell.x - cell2.x;
var dy = cell.y - cell2.y;
var distance = Math.sqrt(dx * dx + dy * dy);

if (distance < cell.r + cells2.r && cell.r > cells2.r){
var unitX = dx/distance;
var unitY = dy/distance;

cell.x = cells2.x + (cell.r + cells2.r + 1) * unitX;
cell.y = cells2.y + (cell.r + cells2.r + 1) * unitY;
//Ive tried below, but the results were not correct.
//cell.x += (cells2.x + (cell.r + cells2.r + 1) * unitX)*0.5;
//cell.y += (cells2.y + (cell.r + cells2.r + 1) * unitY)*0.5;
}

【问题讨论】:

    标签: javascript geometry game-physics collision


    【解决方案1】:

    要将单元格从单元格2移开,您无需添加单元格2坐标

     cell.x += (cell.r + cells2.r + 1) * unitX;
    

    要缓慢移动,请减小速度

    //calculate once:
    v = 0.01 * (cell.r + cells2.r - distance);
    // at every step:
    cell.x += v * unitX;
    

    【讨论】:

    • += 是我在重写堆栈溢出代码时犯的一个错字,感谢您指出这一点。在玩弄了一些值之后,您的代码肯定工作得更好,并为我提供了一个工作的好地方。虽然它并不完美,它在第一次在另一个圆圈内产生时移动有点快和不和谐,而在接近另一个圆圈的尽头后又有点太慢了。我想,我想要一个更恒定的速度。当只是跑来跑去撞到其他圆圈时,碰撞也显得不太精确。我会继续努力,看看我能想到什么。
    • 为了避免减速,按我写的做阶段-产卵后只计算一次速度,并以相同的速度多次更新位置
    猜你喜欢
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多