代码之家  ›  专栏  ›  技术社区  ›  user48202

xna碰撞检测-vector2.reflect-帮助计算圆sprite-c的法向#

  •  3
  • user48202  · 技术社区  · 15 年前

    我很难把注意力集中在如何计算二维空间中运动圆的法向上。我已经计算出物体的速度(方向速度)的法向,但这就是我大学代数所关注的过热的地方,任何我正在处理的二维圆,都有中心点、半径、速度和位置。

    最后,我想使用vector2.reflect方法从这个练习中得到一个更真实的物理效果。

    提前谢谢。

    编辑:添加了一些代码尝试建议(没有效果),可能误解了建议。这里我用的是篮球和棒球,所以是垒和篮。我还有位置和速度,它们被添加到位置来创建运动。

    if ((Vector2.Distance(baseMid, basketMid)) < baseRadius + basketRadius)
    {
        Vector2 baseNorm = basketMid - baseMid;
        baseNorm.Normalize();
        Vector2 basketNorm = baseMid - basketMid;
        basketNorm.Normalize();
        baseVelocity = Vector2.Reflect(baseVelocity, baseNorm);
        basketVelocity = Vector2.Reflect(basketVelocity, basketNorm);
    }
    
    basePos.Y += baseVelocity.Y;
    basePos.X += baseVelocity.X;
    basketPos.Y += basketVelocity.Y;
    basketPos.X += basketVelocity.X;
    basketMid = new Vector2((basketballTex.Width / 2 + basketPos.X), (basketballTex.Height / 2 + basketPos.Y));
    baseMid = new Vector2((baseballTex.Width / 2 + basePos.X), (baseballTex.Height / 2 + basePos.Y));
    
    3 回复  |  直到 11 年前
        1
  •  5
  •   Beta    15 年前

    首先是反思。如果我正确地阅读了您的代码,vector2.reflect的第二个参数对于曲面来说是正常的。水平地面的法向为(0,1),速度为(4,-3)的球撞击它,然后以速度(4,3)飞走。对吗?如果这不正确,那么我们必须更改if语句的主体。(请注意,您可以通过设置basketnorm=-basenorm来保存一些循环。)

    现在是物理学。如前所述,当两个球碰撞时,每个球都会反弹,就像撞上了与两个球相切的玻璃墙一样,这不现实。想象一下打台球:一个快速的红球击中一个静止的蓝球死点。红球会反弹并离开蓝球吗?不,蓝球被击落,红球失去了大部分速度(所有,在完美的情况下)。一个炮弹和一个高尔夫球,两个都以相同的速度运动,但方向相反,正面碰撞,怎么样?它们都会平等反弹吗?不,炮弹会继续,几乎没有注意到撞击,但是高尔夫球会反向飞走。 比它来的快 .

    要理解这些碰撞,你必须理解动量(如果你想要的碰撞不是完全弹性的,比如当豆袋碰撞时,你也必须理解能量)。基础物理教科书将在第一章中对此进行介绍。如果您只想模拟这些东西,请使用质心框架:

    Vector2 CMVelocity = (basket.Mass*basket.Velocity + base.Mass*base.Velocity)/(basket.Mass + base.Mass);
    
    baseVelocity -= CMVelocity;
    baseVelocity = Vector2.Reflect(baseVelocity, baseNorm);
    baseVelocity += CMVelocity;
    
    basketVelocity -= CMVelocity;
    basketVelocity = Vector2.Reflect(basketVelocity, basketNorm);
    basketVelocity += CMVelocity;
    
        2
  •  1
  •   spurserh    15 年前

    一个圆在它的边上某一点的法向是从它的中心到那个点的方向。假设您在这里处理的是圆的碰撞,那么一种简单的“速记”方法可以解决这一问题,即在碰撞时(当圆接触时),以下条件成立:

    设A为一个圆的中心,B为另一个圆的中心。圆A的法向为正火(B-A),圆B的法向为正火(A-B)。这是真的,因为它们接触的点总是与两个圆的中心共线。

        3
  •  0
  •   kyoryu    15 年前

    警告:我不认为这是完全正确的。物理是 我的专长。

    运动对正常人没有影响。通常,法线只是表示方向的标准化(长度1)向量,通常是多边形在三维对象上面对的方向。

    我想你要做的是找到两个圆之间的碰撞法向,是吗?如果是这样的话,球体的一个很酷的特性是,如果你找到它们中心之间的距离,你可以将其标准化,得到球体的法向。

    什么 似乎 对于二维物理来说,正确的做法是,取一个球体的速度*质量(能量),然后将其乘以标准化向量,得到另一个球体。将结果加到目标球体的能量上,从原始球体的能量中减去它,然后分别除以质量,得到最终的速度。如果另一个球体正在移动,则反向执行相同的操作。当然,你可以从那里简化数学,但现在已经晚了,我不想这样做:)

    如果两个球体都在移动,则对另一个球体重复该过程(尽管您可以简化该方程以获得更有效的数学)。

    这只是纸巾数学的后面,但似乎给出了正确的结果。还有,嘿,我曾经自己推导过欧拉角,所以有时候我的餐巾纸背面的数学公式也会计算出来。

    这也假设了完全弹性碰撞。

    如果我错了,我会很高兴知道在哪里:)

    推荐文章