统一。试图伪造内部船舶重力。旋转物体的刚体儿童不停地滑动

问题描述 投票:4回答:2

我正试图模拟一个内部重力的船舶/空间站。

为了做到这一点,我正在制作玩家和船上儿童的所有内容。船本身有碰撞器,但没有刚体部件。这个想法是,随着船的移动,其所有内容也将移动。到目前为止非常简单。

为了模拟船舶的重力,玩家控制器和所有刚体都关闭了默认的重力。而不是标准,每个框架沿着父船的负向上矢量施加力。

这种作品,但有一个主要问题,我必须在这个东西是坚实的之前解决。所有刚体都非常缓慢地绕着船的内部滑动。

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

我已经尝试过使用Physic材料的所有物理属性来拖拽到质量等等。这些都没有用,我很确定这是由于地板移动的基本事实,即使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);
    }

}

我还研究过船只跟随刚体运动的版本。我不能直接做父母,所以我不得不手动设置每一帧的变换以匹配物理代理。这仍然具有与上述相同的效果,尽管它最终可能是我想要移动船的方式,因为这将更适合于飞行机制。

c# unity3d physics rigid-bodies
2个回答
0
投票

如果你把它与现实世界的情景等同起来,唯一阻止我们在地板上滑动的东西就是摩擦力。

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

虽然这几乎就像上面的“胶带”,如果它还没有包含强制执行它的方法,它可以巧妙地适应和扩展你的物理引擎。


0
投票

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

https://i.stack.imgur.com/AMDr2.gif展示了现实世界中摩擦力的理想化版本:直到你克服静摩擦,没有任何动作。

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

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

否则,也许您可​​以指示这些对象停止计算物理并将它们“粘贴”到父表面,直到您想要对它们执行某些操作为止? (这可能是一个糟糕的解决方案,但上面的大多数其他想法都依赖于黑客攻击基础物理代码)。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.