提问人:Abdul Rehman 提问时间:11/16/2023 最后编辑:derHugoAbdul Rehman 更新时间:11/19/2023 访问量:65
自动控制自行车的旋转
Controlling the Rotation of bike automatically
问:
我正在制作一个自行车特技游戏,我希望如果用户不旋转自行车,它会回到零旋转,忽略所有力。使用旋转似乎非常复杂。
if (body.rotation.eulerAngles.z > 25)
body.AddTorque(new Vector3(0, 0, -inAirRotationSpeed * 30 * Time.deltaTime));
else if (body.rotation.eulerAngles.z < 10)
body.AddTorque(new Vector3(0, 0, inAirRotationSpeed * 30 * Time.deltaTime));
else
body.angularVelocity = Vector3.zero;
我已经尝试了此代码,但似乎无法正常工作,我认为需要更改条件 谁能帮我解决这个问题。 如果需要,我可以提供完整的脚本。
答:
0赞
Alex Leest
11/16/2023
#1
你是对的,轮换非常复杂。您正在尝试读出旋转的欧拉角,即简单的旋转 x-y-z 轴。但是,旋转被保存为四元数,这是一种保存“真实”旋转的奇特数学方法。有多种方法可以滚动俯仰偏航以获得相同的旋转,但只有 1 个唯一的四元数来表示它。
综上所述,可能会给你一个看似奇怪的结果(在本文档中解释)。这意味着不可靠。body.rotation.eulerAngles
if (body.rotation.eulerAngles.z > 25)
您可以做的是使用 (docs) 来获取自行车当前旋转与未旋转状态 (Quaternion.identity) 之间的角度。然后在 if 语句中使用该角度。
在某些情况下,您还可以使用 (docs) 来避免意外加速/晃动,而不是使用强制。力可能会变得微不足道,尤其是当您直接设置角速度时。Quaternion.Angle(body.rotation, Quaternion.identity)
Quaternion.RotateTowards
评论
0赞
Abdul Rehman
11/16/2023
这解决了一半的问题,当它向后翻转时,它会回到我想要的位置,但当它向前翻转时,它不在乎。我应该如何检测它何时翻转到前面,因为它不返回负值。任何建议
0赞
Abdul Rehman
11/17/2023
兄弟,你能帮我吗?
0赞
Alex Leest
11/17/2023
@AbdulRehman Quaternion.Angle 将仅返回一个正角度。这就是为什么我建议使用 ,因为你可以放入(这根本不是旋转的东西),它会给你一个朝向它的旋转。将其应用于自行车,它应该开始旋转回起始位置。Quaternion.RotateTowards
Quaternion.Identity
0赞
Alex Leest
11/17/2023
@AbdulRehman 您可能唯一需要避免的是,如果自行车完全倒置,它可能会在错误的轴上旋转。
0赞
derHugo
11/19/2023
有时使用四元数旋转确实非常复杂......相反,您可以尝试使用向上向量,将其投影到与右向量对齐的平面上,然后使用 To 与全局向上向量进行比较Vector3.SignedAngle
评论