飞机 - 防止旋转超出限制,但允许转弯
Posted
技术标签:
【中文标题】飞机 - 防止旋转超出限制,但允许转弯【英文标题】:Aeroplane - prevent rotation outside limits, but allow turning 【发布时间】:2022-01-15 17:18:44 【问题描述】:我有一个使用 Input.GetAxis 输入旋转的飞机对象。它在 z 轴和 y 轴上都限制为 100 度的运动范围:
if (transform.eulerAngles.z < 50 || transform.eulerAngles.z > 310)
transform.Rotate(0f, Input.GetAxis("Horizontal"), -Input.GetAxis("Horizontal"));
if (transform.eulerAngles.y < 50 || transform.eulerAngles.y > 310)
transform.Rotate(Input.GetAxis("Vertical"), 0f, 0f);
按下按钮飞机向前推进,forward
是飞机面对的方向:
transform.position += transform.forward * Time.deltaTime * speed;
这不符合我的意愿。当平面达到旋转极限(例如 transform.eulerAngles.z == 50)时,平面不再沿“弧”移动,如 forward
不是直线。当它到达极限时,飞机只是直线运动。我希望它继续弧线,只是不超过旋转限制。我希望这是有道理的?有人对我如何实现这一点有任何提示吗?
【问题讨论】:
【参考方案1】:您的问题是您正在将旋转角度与欧拉角进行比较。所以,当你到达 50 度时,不可能再旋转更多。
您必须将旋转与前向矢量进行比较,并将此旋转限制为 50 度
【讨论】:
嗨@Jordi,谢谢你的回复。几何绝对不是我最强的领域,所以我必须考虑这个......我是否正确地认为我必须将transform.position =
更改为transform.forward...
加上或减去旋转角度? (不好意思,不知道旋转角和欧拉角有什么区别,我以为是同一个东西)
您必须将输入 getAxis 给出的新方向与您的飞机当前飞行的前向方向进行比较,而不是与作为绝对世界旋转角的欧拉角进行比较。如果这个旋转大于 50 度,那么你必须限制它【参考方案2】:
我不敢相信解决方案是如此明显......当然,我不希望 y 轴停止旋转。这是我的解决方案:
float getHorizontal;
float getVertical;
if (transform.eulerAngles.z < 50 || transform.eulerAngles.z > 310)
getHorizontal = Input.GetAxis("Horizontal");
else
getHorizontal = 0f;
if (transform.eulerAngles.x < 50 || transform.eulerAngles.x > 310)
getVertical = Input.GetAxis("Vertical");
else
getVertical = 0f;
transform.Rotate(getVertical, Input.GetAxis("Horizontal"), -getHorizontal);
【讨论】:
以上是关于飞机 - 防止旋转超出限制,但允许转弯的主要内容,如果未能解决你的问题,请参考以下文章