【问题标题】:How does this bouncing off object after collision detection code work?碰撞检测代码后这个反弹的物体是如何工作的?
【发布时间】:2011-06-02 23:54:54
【问题描述】:

最近我正在阅读 XNA 4.0 Game Development by Example 一书。在其中一章中,这段代码是为在碰撞检测后反弹(反射)对象而编写的:

private void BounceAsteroids(Sprite asteroid1, Sprite asteroid2)
{

    Vector2 cOfMass = (asteroid1.Velocity + asteroid2.Velocity) / 2;
    Vector2 normal1 = asteroid2.Center - asteroid1.Center;
    normal1.Normalize();
    Vector2 normal2 = asteroid1.Center - asteroid2.Center;
    normal2.Normalize();

    asteroid1.Velocity -= cOfMass;
    asteroid1.Velocity = Vector2.Reflect(asteroid1.Velocity, normal1);
    asteroid1.Velocity += cOfMass;

    asteroid2.Velocity -= cOfMass;
    asteroid2.Velocity = Vector2.Reflect(asteroid2.Velocity, normal2);
    asteroid2.Velocity += cOfMass;
}

任何人都可以用一些图表或一些易于可视化的示例来解释这段代码吗?我无法可视化此代码。如果有人知道任何书可以让我学习这种对游戏编程有用的物理知识,那么我也将非常感激。

【问题讨论】:

    标签: c# xna collision-detection game-physics


    【解决方案1】:

    这是试图模拟弹跳。

    Normalize 和 center 计算使 blob 在它们的边缘接触时开始反弹,而不是在它们的中心可能碰到时。

    然后根据涉及每个小行星质量的一些计算来改变速度。

    Reflect 函数无疑会计算一些角度,以便事情朝着正确的方向发展。

    【讨论】:

    • 你能告诉我如果没有 Reflect 方法我必须写什么代码吗?此外,如果我不规范化矢量,则只要两个对象边缘接触,对象就会消失,并且不再出现在视口中。
    • @Anthony:这就是为什么 reflect() 需要一个归一化向量
    • @BlackBear:好的。如果我不使用 Reflect 方法,你能告诉我需要写什么方程吗?
    • @Anthony,Reflect只是把向量关于指定的法向量反射回来,和投影向量(使用点积)一样,减去投影得到偏移量,再减去偏移量投影以“镜像”法线周围的矢量。如果您不知道这意味着什么,请在谷歌上搜索向量和向量数学。如果您打算进行游戏开发,则需要了解向量数学和基本的线性代数,所以这将是值得的。
    • 小心这段代码。它平均了两颗小行星之间的质量效应,并将该平均值应用于每个小行星的反射速度大小。如果这两个小行星恰好大小(质量)完全相同,那么这段代码是 100% 准确的(在我所说的上下文中)。但是,如果你有一颗大小行星和一颗小小行星,那么由此产生的速度大小就不是那么真实/准确。当一个大的撞到一个小的时,你会认为小一个的速度会比大的偏离更多……这段代码不是这样。
    猜你喜欢
    • 2010-12-29
    • 2015-02-10
    • 2018-01-28
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多