【问题标题】:Unity physics - how to make objects bob down then up as if in space with gravity?Unity 物理 - 如何让物体像在重力作用下在太空中一样上下摆动?
【发布时间】:2016-11-13 02:26:41
【问题描述】:

好的,刚刚在 Unity 中学习物理,我也浏览过 Unity 的论坛,但是我不知道如何创建这种与比重相关的效果 -

我有这些质量为 100 的刚体,我可以将它们从平台(我的游戏是一组设置在太空中的平台)推到开放空间中。因为它们受到重力影响,所以它们会掉落。

我需要的是让物体从平台上滑下,慢慢下落,然后向上摆动并保持漂浮状态。就像在太空中被推开一样,但他们无法继续前进。只需向下摆动,然后向上,停留并漂浮。

这似乎比我想象的要复杂得多,因为我玩过重力并且在高值时它们会直接下落(显然不是向外),而低值时它们会在被推开时漂浮在上方。似乎没有一个他们既不下降也不上升的甜蜜点,只是鲍勃。

我怎样才能做到这一点?我的群众是 100。

【问题讨论】:

  • 看看你是否可以使用 mathf.pingpong 改变刚体的重力修改器
  • 您想要创建与掉落漂浮在水中的东西相同的效果的声音。你试过这种方法吗?
  • 是的,这就是我所需要的——我研究过液体体素,但如何创造水物理学?
  • @skyguy 啊,我错过了你的回复。请使用@,以便我收到通知。可能有许多不同的方法来近似水,但我认为简单地使用基于物体体积的势就足够了,想想阿基米德原理en.wikipedia.org/wiki/Archimedes%27_principle。你试过吗?
  • @pingul 对,但是我会根据它修改特定对象的重力,还是在代码中我会做什么?

标签: c# unity3d physics gravity


【解决方案1】:

我的建议是实现一个试图类似于 Arkimedes 原理的力函数。关键是潜力取决于物体的深度:物体越深入水中,升力越大。因此,这里的关键函数(也是最棘手的函数)是volumeBeneathSurface

double liftForce(object)
{
    const double waterLevel = 0.0;
    const double density = 1000.0; // kg/m^3 -- using water atm

    double vol = volumeBeneathSurface(object, waterLevel);

    double displacedMass = vol*density; // density = m/vol
    double displacedWeight = displacedMass*gravity; // F = m*a
    return displacedWeight;
}

现在,这里的棘手部分可能是计算水面以下的体积量。想象一个可能会旋转的非常棘手的几何图形——它可以变得任意复杂。最简单的情况可能是用一个不旋转的盒子来近似你的形状。

double volumeBeneathSurface(object, double surfaceLevel)
{
     // assuming the object has `height`, `width`, and `depth`
     // also assuming its coordinate is references from the center of the object
     double r = object.y - surfaceLevel - object.height/2.0; // How much of the object is beneath the surface
     if (r > 0)
         return 0.0; // the object is purely above
     else if (r < object.height)
         return object.height*object.width*object.depth; // the whole object is beneath
     else
         return abs(r)*object.width*object.depth; // partly under
}

水中的真实物体会上下波动,但最终运动会消失。这是由于能量转移到物体并在水中产生波浪。我们在这里没有这样的效果,所以我们的对象很可能会永远上下摆动。你可以做的是给物体增加一些额外的摩擦力,然后运动应该会淡出。

【讨论】:

  • 谢谢你,我一定会采纳你的建议的。您如何将其与改变重力联系起来?
  • @skyguy 在第一部分使用了重力,displacedWeight = displacedMass*gravity 所以你可以在那里改变它。我应该注意到,尽管我们周围的重力在变化,但它变化得如此缓慢,以至于在大多数用例中它可以近似为常数而不会出现问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多