C++检测两点之间的碰撞,并在发生碰撞时从法线上反弹

C++ Detect collision between two points and bouncing off the normal if there is a collision

本文关键字:碰撞 检测 两点 C++ 之间      更新时间:2023-10-16

我有一个由各种点组成的地面,其中一些点是平的,另一些点是成角度的,我试图检查成角度的点之间是否发生碰撞(非轴对齐)。

我有一个向量数组,每个点上有两个浮点-这是地面上的每个点。

这是地面的图像。https://i.stack.imgur.com/BZcnI.png

目前,我想检查点1和2之间的碰撞,然后转到其他点。

我将以第1点和第2点为例。

g1x = 150; g2x = 980;
g2x = 500; g2y = 780;

这个的dxdy是dx=350和dy=-200

它的法线x是dy,法线y是-dx

nx = -200;
ny = -350;

归一化它是点1和点2之间的长度,为403.11

nx/归一化=-0.496ny/归一化=-0.868

//get position of object - Don't know if its supposed to be velocity or not
float vix = object->getPosition().x;
float viy = object->getPosition().y;
//calculate dot product - unsure if vix/viy are supposed to be minused
float dot = ((-vix * nrmx) + (-viy * nrmy)) * nrmx; //= -131.692

此信息对于计算两点之间的法线和点积是否正确。

如何检查是否与这条线发生碰撞,然后根据法线进行反射。

谢谢:)欢迎任何更改。

假设在位置x有一个粒子以速度v移动,边界由ab之间的线定义。

我们可以通过将c-a投影到b-a上,并除以长度||b-a||来找到粒子沿着边界碰撞的距离(作为分数)。也就是说,

u=((c-a ((b-a)/||b-a||)/|b-a||=(c-a/b>)b-a)/|b-a||2

如果u>1,则粒子经过b侧的边界,如果u><0,则粒子经过a侧的边界。碰撞点将是

c=a+ub

通过求解可以找到碰撞时间

x+tv=a+sb-a

对于t。反射矩阵可以在这里找到。但它需要旋转90°(或π/2),这样你就可以反射到与线正交的方向,而不是穿过线。

对于多个边界,计算每个边界的碰撞时间,按该时间排序(丢弃负时间),并在列表中检查碰撞。一旦你找到了将要碰撞的粒子,你就可以将粒子移动到碰撞点,反映它的速度,改变deltat,然后再次重做整个过程(忽略刚刚碰撞的那个),因为在角落的情况下,你可能会碰撞多个边界(明白吗?这是数学双关语)。

线性代数可能很有趣,你可以用它做更多的事情,掌握线性代数可以让你做一些强大的事情。祝你好运