Unity物理-如何使物体上下浮动,就像在空间重力

本文关键字:空间 物理 何使物 上下 Unity | 更新日期: 2023-09-27 18:17:43

好了,刚刚进入Unity的物理,我也通过Unity的论坛,但是我不知道如何创建这个特定的重力相关的效果-

我有这些质量为100的刚体,我可以把它们从平台(游戏邦注:我的游戏是一堆设置在空间中的平台)推到开放空间。因为要检查它们是否受重力影响,所以它们会掉下来。

我需要的是让物体从平台上滑下来,稍微慢一点下降,然后浮起来并保持漂浮。就像被推到太空,但他们不能继续前进。先下潜,再上浮,停留和漂浮。

这似乎比我想象的要复杂得多,因为我玩的是重力,值高的时候它们会直接掉下来(显然不是掉出来),值低的时候它们会被推到上面。似乎没有一个既不下降也不上升的最佳点,只是波动。

我怎样才能做到这一点?我的质量是100。

Unity物理-如何使物体上下浮动,就像在空间重力

我的建议是实现一个类似于阿基米德原理的力函数。关键是势能取决于物体在水中的深度:物体在水中越深,升力越大。因此,这里的关键函数(也是最棘手的函数)是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
}

水中的真实物体会上下摆动,但最终运动会消失。这是由于能量传递到物体并在水中产生波浪。我们这里没有这样的效果,所以我们的物体很可能永远上下摆动。你所能做的就是给物体增加一些额外的摩擦力,这样运动就会逐渐消失。