gpt4 book ai didi

javascript - 圆形/矩形碰撞响应

转载 作者:行者123 更新时间:2023-12-03 16:29:49 27 4
gpt4 key购买 nike

所以我前段时间建了一点突破克隆 ,我想稍微升级一下,主要是为了碰撞。当我第一次制作它时,我在我的球和我的砖 block 之间进行了基本的“碰撞”检测,这实际上将球视为另一个矩形。但这造成了边缘碰撞的问题,所以我想我会改变它。问题是,我找到了一些问题的答案:

例如这张图片

enter image description here

以及该线程的最后一条评论:circle/rect collision reaction但我找不到如何计算最终的速度矢量。

到目前为止,我有:

- 找到矩形上最近的点 ,
- 创建了法线和切线向量 ,

现在我需要以某种方式“将速度向量划分为法线分量和切线分量;否定法线分量并添加法线和切线分量以获得新的速度向量”如果这看起来非常简单,我很抱歉,但是我无法解决这个问题......
代码 :

function collision(rect, circle){
var NearestX = Max(rect.x, Min(circle.pos.x, rect.x + rect.w));
var NearestY = Max(rect.y, Min(circle.pos.y, rect.y + rect.w));

var dist = createVector(circle.pos.x - NearestX, circle.pos.y - NearestY);
var dnormal = createVector(- dist.y, dist.x);
//change current circle vel according to the collision response
}

谢谢 !

编辑:还发现 this但我不知道它是否适用于矩形的所有点或仅适用于 Angular 落。

最佳答案

最好用几个图表来解释:

angles

有入射 Angular =反射 Angular 。将此值称为 θ。

angles2

有 θ = 法向 Angular - 入射 Angular 。

atan2是用于计算向量与正 x 轴的 Angular 函数。

然后下面的代码立即如下:

function collision(rect, circle){
var NearestX = Max(rect.x, Min(circle.pos.x, rect.x + rect.w));
var NearestY = Max(rect.y, Min(circle.pos.y, rect.y + rect.h));

var dist = createVector(circle.pos.x - NearestX, circle.pos.y - NearestY);
var dnormal = createVector(- dist.y, dist.x);

var normal_angle = atan2(dnormal.y, dnormal.x);
var incoming_angle = atan2(circle.vel.y, circle.vel.x);
var theta = normal_angle - incoming_angle;
circle.vel = circle.vel.rotate(2*theta);
}

另一种方法是获得沿切线的速度,然后从圆周速度中减去该值的两倍。

angles3

然后代码变成
function collision(rect, circle){
var NearestX = Max(rect.x, Min(circle.pos.x, rect.x + rect.w));
var NearestY = Max(rect.y, Min(circle.pos.y, rect.y + rect.h));

var dist = createVector(circle.pos.x - NearestX, circle.pos.y - NearestY);
var tangent_vel = dist.normalize().dot(circle.vel);
circle.vel = circle.vel.sub(tangent_vel.mult(2));
}

上面的两个代码片段在大约相同的时间(可能)基本上做同样的事情。只需选择您最了解的一个。

此外,正如@arbuthnott 指出的那样, NearestY 中存在复制粘贴错误。应该使用 rect.h而不是 rect.w .

编辑 : 我忘了位置分辨率。这是将两个物理对象分开以使它们不再相交的过程。在这种情况下,由于 block 是静态的,我们只需要移动球。

penetration diagram
function collision(rect, circle){
var NearestX = Max(rect.x, Min(circle.pos.x, rect.x + rect.w));
var NearestY = Max(rect.y, Min(circle.pos.y, rect.y + rect.h));
var dist = createVector(circle.pos.x - NearestX, circle.pos.y - NearestY);

if (circle.vel.dot(dist) < 0) { //if circle is moving toward the rect
//update circle.vel using one of the above methods
}

var penetrationDepth = circle.r - dist.mag();
var penetrationVector = dist.normalise().mult(penetrationDepth);
circle.pos = circle.pos.sub(penetrationVector);
}

关于javascript - 圆形/矩形碰撞响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45370692/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com