我正试图模拟一个内部重力的船舶/空间站。
为了实现这一点,我正在制作玩家和船上儿童的所有内容。船本身有碰撞器,但没有刚体部件。这个想法是,随着船的移动,其所有内容也将移动。到目前为止非常简单。
要模拟船舶中的重力,玩家控制器和所有刚体都会关闭默认重力。而不是标准,每个框架都沿着父船的负向上矢量施加一个力。
这种作品,但有一个主要问题,我必须在这个东西是坚实的之前解决。所有刚体都非常缓慢地绕着船的内部滑动。
我知道这可能是由于地板的更新位置加上重力导致某种剪切力。物体总是相对于船的旋转滑动。
我试过用物理材料的所有物理属性来拖拽到质量等等。这些都没有用,我很确定这是由于地板移动的基本事实,甚至虽然RB是地板所属对象的子项。
任何人都有解决方案,这不是某种胶带?我可以尝试制作一切运动学,只有在发生某些外部碰撞或其他事情时“醒来”,但这可能会变得非常麻烦。我需要以尽可能多的通用方式工作。
一些代码:
在船上
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);
}
}
我还研究过船只跟随刚体运动的版本。我不能直接做父母,所以我不得不手动设置每一帧的变换以匹配物理代理。这仍然具有与上述相同的效果,尽管它最终可能是我想要移动船的方式,因为这将更适合于飞行机制。
答案 0 :(得分:0)
如果你把它与现实世界的情景等同起来,唯一阻止我们在地板上滑动的东西就是摩擦。
物理库是否根据接触材料正确施加摩擦力?如果不施加一定量的摩擦力(或克服它所需的最小力量),应该具有防止你在地板上滑动的效果。
虽然这几乎就像上面的“胶带”,如果它还没有包含强制执行它的方法,它可以巧妙地适应和扩展你的物理引擎。
答案 1 :(得分:0)
如上所述,问题是由于物理引擎如何施加摩擦。如果我没记错的话,还会有其他力作用在旋转框架中的物体上(其中有些非常不直观-请观看此视频:https://www.youtube.com/watch?v=bJ_seXo-Enc)。但是,尽管有所有这些(加上引擎本身可能产生的舍入误差以及浮点数学的乐趣),但在现实世界中,静摩擦大于运动(动态)摩擦。我不认为这通常是在游戏物理引擎中实现的,这就是为什么我们经常看到“摆动”的近静态对象的原因。同样,您可能会遇到这样的问题,即使实施了此方法,物理引擎也可能会将两个接触的旋转体解释为非静态的(即使从局部角度来看它们的接触面是静态的,引擎也可能会全局考虑)。 .. [插入关于牛顿和爱因斯坦争论的笑话]。
https://i.stack.imgur.com/AMDr2.gif显示了现实世界中摩擦实际上是什么样的理想化版本:在克服静摩擦之前,没有任何动静。
实现此目标的一种方法(如果可以访问低级物理引擎)是将低于某个阈值的所有运动力都舍入为零-即,力<0.001 *被设置为0(或者可能是速度< 0.001设置为零-以较容易为准)。
*一些阈值-您必须确定这是什么。
否则,也许您可以指示这些对象停止计算物理并将其“粘贴”到父曲面,直到您想对它们做些什么为止? (这可能是一个不好的解决方案,但是上面的其他大多数想法都依赖于破解底层的物理代码)。