C# 使用扭矩使气垫船刚体保持直立
我目前正在创建一个游戏,涉及一个悬停自行车。当自行车与物体相撞时,其角度会自然变化。我希望创建某种方式,使其返回到0。以下是我尝试过的:C# 使用扭矩使气垫船刚体保持直立,c#,unity3d,C#,Unity3d,我目前正在创建一个游戏,涉及一个悬停自行车。当自行车与物体相撞时,其角度会自然变化。我希望创建某种方式,使其返回到0。以下是我尝试过的: if (hoverbike.rotation.x != 0 || hoverbike.rotation.z != 0) { hoverbike.AddTorque(x: Mathf.MoveTowardsAngle(hoverbike.rotation.x, 0, 0.01f), y: hoverbike.rotatio
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);
很难解释它在做什么,因为我不明白它在做什么,它似乎只是在旋转。
如果有兴趣,下面是我的代码的其余部分:,这是一团乱,但我仍在学习如何使用Unity
Oh和角度y不应趋向于0,因为这是水平角度。您可以使用以下方法确定将气垫船从当前位置旋转到世界位置的四元数: 然后使用将其转换为角度和轴:
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);
刚体使用的弧度和到角轴的度数之间的任何转换都与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);
}
请不要使用四元数组件我该怎么做?请看我的答案作为起点。@katalysttime太棒了!很高兴听到第一次尝试成功!出于好奇,您最终使用了哪些float
因素?如果可能的话,我想将实际值编辑到我的答案中:)到目前为止,我还没有对它们进行过太精确的微调,但到目前为止(对我来说),0.8似乎是一个很好的阻尼因子,但我还没有确定调整因子。目前使用默认值0.5,直到我可以进一步确定它。
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);
}