【问题标题】:How to apply velocity to a parent object that ignores child object's mass in Unity?如何将速度应用于忽略 Unity 中子对象质量的父对象?
【发布时间】:2021-02-18 10:24:12
【问题描述】:

我正在 Unity 中制作一个 VR 数据可视化应用程序,我的父母有很多孩子(只是一些原始立方体),我可以通过将父母的刚体设置为与我跟踪的 VR 控制器相同的速度来在场景中折腾。

Rigidbody rb = GetComponent<Rigidbody>();
Vector3 controllerVelocity = Player.instance.rightHand.GetTrackedObjectVelocity(); // how I ref the controller velocity in SteamVR
rb.velocity = controllerVelocity * 2f; // the 2f is just to speed up the velocity 

上面的代码工作正常,但问题是我认为可以由玩家调整的子对象的比例会影响父对象的移动速度。或者也许只是当孩子们很大时......控制器速度相对太慢?基本上我不需要这种情况;无论孩子的尺度/质量如何,我都希望父母的刚体以大致相同的速度移动。

所以为了实现这一点,我想使用 Rigidbody.AddForce 但它似乎没有任何区别,即较大的孩子仍然移动得更慢。这是我目前所拥有的:

Rigidbody rb = GetComponent<Rigidbody>();
Vector3 controllerVelocity = Player.instance.rightHand.GetTrackedObjectVelocity();
rb.AddForce(controllerVelocity  * 2f, ForceMode.VelocityChange);

我也尝试过 ForceMode.Acceleration,但没有任何动静?我是否错误地使用了 AddForce?还是我只需要一个基于孩子大小的缩放倍数?欢迎任何帮助。

【问题讨论】:

    标签: c# unity3d rigid-bodies


    【解决方案1】:

    我不是用确定的答案而是用一个建议来回答你。 更改比例可能不会更改全局对象的质量,但您可能会更改它的 center of mass,这会影响惯性。

    来自文档“如果您没有从脚本中设置质心,它将自动从连接到刚体的所有对撞机中计算出来”

    我会尝试获取质心值,并在修改比例后重新设置相同的质心,以检查所施加的力所描述的运动是否与之前相同.

    【讨论】:

    • 您好,谢谢您的建议。我在缩放前后检查了质心,它永远不会改变。但是,我也删除了所有儿童对撞机,看看有没有区别,也没有区别。所以我开始认为小孩子和大孩子的速度是一样的......这只是一个物理事实,当他们更大时,他们必须移动更远的距离,所以同样的速度看起来更慢......?
    • 我认为they have to move a greater distance when they're larger 不正确。从 A 移动到 B 的对象应该移动相同的距离,而不取决于对象的大小。考虑到外部观察者的速度感知可能会产生影响,但我认为如果不将蠕虫与鲸鱼进行比较,情况就不会如此。您还可以自己检查观察者的速度感知,使用一些代码而不是物理来移动变换,并与您想要的行为进行比较
    • 我想我的真正意思是在这种情况下,鲸鱼是由 50 条蠕虫组成的。当我扩大父级时,蠕虫之间的空间也会增加。而且我认为在两个尺度上应用相同的速度意味着在大尺度下,蠕虫之间的移动速度会更慢,因为空间更大,它们以相同的速度移动,就好像它们很小一样。我想我只需要应用一个比例推力,比如 transform.lossyscale.magnitude 来解释这一点。这在物理上有意义吗?
    • 不要认为它有物理意义,因为你正在施加力量。这种力会产生加速度 (F = m*a),从而使身体加速。如果 mas 没有改变,速度应该是一样的 afaik。物体移动的空间/距离在处理力时没有影响
    • 通过设计,儿童对撞机的体积将有助于计算得到的刚体质量的体积。如果你想避免这种情况,你可以使用约束系统让孩子跟随父母,而不必是同一个物理体,但这意味着孩子默认不会尊重碰撞
    【解决方案2】:

    不理想,但能够通过执行以下操作来模仿我的预期结果:

    float parentMagnitude = transform.lossyScale.magnitude;
    float thrustAdjuster = parentMagnitude * 5f;
    Vector3 controllerVelocity = Player.instance.rightHand.GetTrackedObjectVelocity();
    rb.velocity = controllerVelocity * thrustAdjuster;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      相关资源
      最近更新 更多