统一物理学 - 如何让物体在重力空间中向下飞起,好像在空间中一样?

时间:2016-11-13 02:26:41

标签: c# unity3d physics gravity

好吧,刚刚在Unity学习物理,我也经历过Unity的论坛,但我无法弄清楚如何创建这种与比重相关的效果 -

我有这些质量100的刚体,我能够将平台(我的游戏是一堆空间中设置的平台)推入开放空间。因为它们受到重力影响的检查,它们会掉落。

我需要的是让物体从平台上滑下来,缓慢下降然后然后浮起来并保持浮动状态。就像在空间被推开一样,但他们不能继续前进。只是下来,然后上升,停留并漂浮。

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

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

1 个答案:

答案 0 :(得分:0)

我的建议是实现一个试图类似阿基米德原则的力量函数。关键是潜力取决于物体向下的距离:物体越往水深,升力越大。因此,这里的关键功能(以及最棘手的功能)是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
}

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