5

我正在尝试模拟具有内部重力的船舶/空间站。

为了实现这一点,我正在制作船的玩家和船的所有内容。船本身有对撞机,但没有刚体组件。这个想法是,随着船的移动,它的所有内容也会移动。到目前为止非常简单。

为了模拟船上的重力,玩家控制器和所有刚体都关闭了默认重力。代替标准,每一帧沿母船的负向上矢量施加力。

这种工作,但有一个主要问题我必须在这件事变得稳固之前解决。所有刚体都在船内部非常缓慢地滑动。

我知道这可能是由于地板的更新位置加上重力导致了某种剪切力。物体总是随着船的旋转而滑动。

我已经尝试过处理从物理材料到拖动到质量等所有物理属性。这些都没有奏效,我很确定这是由于地板在移动的基本事实,即使 RBs是地板所属对象的子对象。

任何人都有解决方案,而不是某种胶带?我可以尝试使所有东西都运动,并且仅在发生某些外部碰撞或其他情况时“唤醒”,但这可能会变得非常麻烦。我需要尽可能多地以通用方式工作。

一些代码:

在船上

void Update () 
{
    transform.Rotate(new Vector3(Time.deltaTime * 0.125f,Time.deltaTime*0.5f,0));
}

void FixedUpdate()
{
Vector3 tempVec;

foreach(Rigidbody rb in rigidBodies)
    {
        //Gravity!!

        tempVec = transform.up * -9.81f * rb.mass * Time.deltaTime;         
        rb.AddForce(tempVec, ForceMode.Acceleration);
    }

}

我还制作了一个版本,其中船跟随刚体的运动。我不能直接做父母,所以我不得不简单地手动设置每一帧的变换来匹配物理代理。这仍然具有与上述相同的效果,尽管这可能是我最终想要移动飞船的方式,因为这将更恰当地与飞行机制相关联。

4

2 回答 2

0

如果你把它等同于现实世界的场景,唯一能阻止我们在地板上滑动的就是摩擦。

物理库是否根据接触材料正确应用摩擦?如果不施加一定量的摩擦力(或克服摩擦力所需的最小力)应该可以防止您在地板上滑动。

尽管这几乎是上面的“胶带”,但如果它还没有包含强制执行的方法,它可以巧妙地融入并扩展您的物理引擎。

于 2013-10-02T09:22:59.987 回答
0

如上所述,问题在于物理引擎如何应用摩擦。如果我没记错的话,会有一些其他力作用在旋转框架中的物体上(其中一些非常不直观 - 看看这个视频:https ://www.youtube.com/watch?v=bJ_seXo-Enc)。然而,尽管如此(加上引擎本身可能产生的舍入误差和浮点数学的乐趣),在现实世界中,静摩擦大于移动(动)摩擦。我认为这通常不会在游戏物理引擎中实现,这就是为什么我们经常看到“摇摆不定”的近乎静态物体的原因。此外,您可能会遇到这样的问题,即即使实现了这一点,物理引擎也可能会将两个接触的旋转体解释为非静态(即使它们的接触面从局部角度来看是静态的,但引擎可能会全局思考)。 .. [插入关于牛顿和爱因斯坦争论的笑话]。

https://i.stack.imgur.com/AMDr2.gif展示了现实世界中摩擦的理想化版本:在您克服静摩擦之前,什么都不会移动。

实现这一点的一种方法(如果您可以访问低级别的物理引擎)是将低于某个阈值的所有运动力四舍五入为零 - 即 force < 0.001* 设置为 0 (或者可能设置速度 < 0.001为零 - 以更容易者为准)。

*一些门槛 - 你必须弄清楚这是什么。

否则,也许您可​​以指示这些对象停止计算物理并将它们“粘”到父表面,直到您想对它们做些什么?(这可能是一个糟糕的解决方案,但上面的大多数其他想法都依赖于破解底层物理代码)。

于 2019-05-01T03:33:18.427 回答