【问题标题】:C++ Detect collision between two points and bouncing off the normal if there is a collisionC ++检测两点之间的碰撞并在发生碰撞时从法线反弹
【发布时间】:2014-04-15 22:37:38
【问题描述】:

我有一个由多个点组成的地面,其中一些是平坦的,而另一些是倾斜的,我正在尝试检查倾斜点之间是否存在碰撞(非轴对齐)。

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

这是地面外观的图像表示。 http://i.imgur.com/cgEMqUv.png?1?4597

目前我想检查点 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.496 ny/归一化 = -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

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

如何检查是否与这条线发生碰撞,然后按正常反映。

谢谢 :) 欢迎任何和所有更改。

【问题讨论】:

  • 我的建议是你拿起一本关于线性代数的书(甚至游戏数学也可以)。如果您遇到这些问题之一,那么您可能会遇到更多类似的问题。首先,研究一下矢量投影或en.wikipedia.org/wiki/Distance_from_a_point_to_a_line

标签: c++ vector collision-detection normals


【解决方案1】:

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

我们可以通过将 c-a 投影到 b-a 并除以长度 ||b-a||。也就是说,

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

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

c = a + u b.

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

x + t v = a + s ( b-a)

对于t。反射矩阵可以找到here。但它需要旋转 90 deg(或 pi/2),以便您反射的与直线正交,而不是穿过它。

就多个边界而言,计算每个边界的碰撞时间,按该时间排序(丢弃负数)并通过列表检查碰撞。一旦你找到了你要碰撞的那个,你就可以将你的粒子移动到碰撞点,反映它的速度,改变 delta t 并重做整个再说一遍(忽略你刚刚碰撞的那个),因为你可能会在极端情况下与多个边界发生碰撞(明白吗?这是一个数学双关语)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多