【问题标题】:Stabilize hovercraft rigidbody upright using torque使用扭矩稳定气垫船刚体直立
【发布时间】:2019-10-16 18:53:00
【问题描述】:

我目前正在创建一个涉及悬停自行车的游戏。当自行车与某物碰撞时,它的角度自然会发生变化。我希望创建某种方式使其趋向于 0。这是我尝试过的:

if (hoverbike.rotation.x != 0 || hoverbike.rotation.z != 0)
        {
            hoverbike.AddTorque(x: Mathf.MoveTowardsAngle(hoverbike.rotation.x, 0, 0.01f), y: hoverbike.rotation.y, z: Mathf.MoveTowardsAngle(hoverbike.rotation.z, 0, 0.01f));
        }

        transform.Rotate(0.0f, -Input.GetAxis("Mouse X") * 0.5f, 0.0f);

很难解释它在做什么,因为我不明白它在做什么,它似乎只是在旋转。 如果有兴趣,这是我的代码的其余部分:https://pastebin.com/kzMDQMVF,这是一团糟,但我仍在学习如何使用 Unity。

哦,角度 y 不应该趋向于 0,因为那是水平角度。

【问题讨论】:

  • 请不要使用四元数组件
  • 我该怎么做?
  • 查看我的答案作为起点。

标签: c# unity3d


【解决方案1】:

您可以使用Quaternion.FromToRotation 确定将气垫船从当前向上旋转到世界向上的四元数:

Rigidbody hoverRB; // hovercraft's rigidbody

Quaternion deltaQuat = Quaternion.FromToRotation(hoverRB.transform.up, Vector3.up);

然后使用Quaternion.ToAngleAxis 将其转换为角度和轴:

Vector3 axis;
float angle
deltaQuat.ToAngleAxis(out angle, out axis);

然后,抵消一些现有的旋转速度,以便最终达到目标:

float dampenFactor = 0.8f; // this value requires tuning
hoverRB.AddTorque(-hoverRB.angularVelocity * dampenFactor, ForceMode.Acceleration);

然后沿我们之前找到的轴施加一些扭矩,按剩余角度缩放:

float adjustFactor = 0.5f; // this value requires tuning
hoverRB.AddTorque(axis.normalized * angle * adjustFactor, ForceMode.Acceleration);

Rigidbody 使用的弧度和 ToAngleAxis 的度数之间的任何转换对于 float 常量都是多余的,所以不要太担心。

确保这一切都在FixedUpdate 中完成(或在FixedUpdate 时间调用/运行的函数),因为扭矩的方向可能需要从一个物理步骤更改为另一个物理步骤。所以,总的来说:

Rigidbody hoverRB; // hovercraft's rigidbody

...

void FixedUpdate() 
{    
    Quaternion deltaQuat = Quaternion.FromToRotation(hoverRB.transform.up, Vector3.up);

    Vector3 axis;
    float angle
    deltaQuat.ToAngleAxis(out angle, out axis);

    float dampenFactor = 0.8f; // this value requires tuning
    hoverRB.AddTorque(-hoverRB.angularVelocity * dampenFactor, ForceMode.Acceleration);

    float adjustFactor = 0.5f; // this value requires tuning
    hoverRB.AddTorque(axis.normalized * angle * adjustFactor, ForceMode.Acceleration);
}

【讨论】:

  • @KatalystPrime 太好了!很高兴听到它第一次尝试就奏效了!出于好奇,您最终使用了哪些float 因素?如果可能的话,我想将实际值编辑到我的答案中:)
  • 我还没有对它们进行过精确的微调,但到目前为止(对我而言)0.8 似乎是一个很好的阻尼系数,但我还没有确定调整系数。目前使用默认值 0.5,直到我可以进一步确定为止。
猜你喜欢
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
相关资源
最近更新 更多