【问题标题】:Adding force to 2D body and at the same time make sure velocity is always in the direction of the body's up direction向 2D 身体添加力,同时确保速度始终在身体向上的方向上
【发布时间】:2014-07-11 11:39:19
【问题描述】:

我在 Unity 3D 中(在 2D 模式下)制作这个,所以我的代码示例将在 Unity/C# 中,但我认为这更像是一个一般的物理问题。

我有一个 2D 宇宙飞船飞来飞去,它偶尔会遇到一些小行星(或其他飞船),我实现这一点的方式是将用户输入转换为这样的 2D 矢量:

Vector2 movement = new Vector2(0, currentPlayerSpeed);

“currentPlayerSpeed”由船的最大速度计算并随着时间的推移添加到加速度中,然后我将 Vector2D 添加到像这样在 Update 方法中的船变换中(船总是相对于它自己“向上”飞行旋转):

transform.Translate(movement);

我根据输入旋转飞船(并添加了一些最大旋转力),我直接旋转飞船,而不是通过物理体(我通过transform.Rotate (rotationVector) 设置它),飞船总是朝着“以当前的速度上升”,这意味着它永远不会飞,即使是最小的侧向。这是我希望它工作的方式,但是......我也希望这艘船能够反弹它击中的任何小行星(或其他船只),我想为此使用物理构建,但我不知道如何正确施加力,以便我保持正确的速度/方向。

我已将我的更新转换为 FixedUpdate,我现在这样做是为了移动飞船:

rigidbody2D.AddForce (transform.up * currentPlayerSpeed);
if(rigidbody2D.velocity.magnitude > maxShipSpeed)
{
    rigidbody2D.velocity = rigidbody2D.velocity.normalized * maxShipSpeed;
}

所以有了这个我得到了我想要的反弹效果,但显然船现在大部分时间都是侧向飞行的,因为力没有直接转化为船的速度,直接操纵rigidbody2D.velocity 给了我奇怪的结果,所以我不知道该怎么做。这是我想要的说明以及为什么它无法清除问题(矢量未正确绘制,但我希望它仍然有意义)。

我已尝试使用以下代码:

float magnitude = rigidbody2D.velocity.magnitude;
rigidbody2D.velocity = transform.up * magnitude;

这使船按照我的意愿飞行,但显然它也消除了碰撞力,所以我回到了零方格。欢迎任何帮助/想法,因为我对此非常坚持。

谢谢
索伦

【问题讨论】:

  • 你描述的情况在物理上是不可能的。每个动作都有一个相等和相反的反应。我想你可以给你的船一个巨大的质量,这样碰撞对它的明显影响就会最小化。
  • 我担心这在物理上是不可能的。给我的船一个巨大的质量不会解决任何问题,因为我希望碰撞产生影响,我只想将它与我的船的非物理运动结合起来。我想如果我想让它起作用,我必须实现自己的假物理。
  • 嗯,碰撞会产生影响,一个物体的质量越大,对另一个物体的影响就越大。你必须做的是执行两个计算。一个用于计算对您的船的旋转速度的影响,另一个用于计算对小行星的影响。物理学崩溃的地方是小行星和船的运动定律会有所不同。也许这个老游戏可能会引发一个想法。 youtube.com/watch?v=HlPgB9rEkBg :)

标签: unity3d game-physics physics-engine


【解决方案1】:

实现这一点很容易:

当它继续向上前进时,您实际上只是在尝试“反弹”(即“左右”..“前后”)。

Unity 中最简单的方法是 - 只制作碰撞器触发器,而不实际使用 PhysX 碰撞器。在每次碰撞时,在相关方向上施加一个力(Unity 的“爆炸力”就可以了),左或右(可能有一点上下变化)。

享受吧!

【讨论】:

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