飞机 - 防止旋转超出限制,但允许转弯

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);

【讨论】:

以上是关于飞机 - 防止旋转超出限制,但允许转弯的主要内容,如果未能解决你的问题,请参考以下文章

Three.js 飞机的 3D 旋转

相机跟随物体,旋转除了 z 轴

强制 uiviewcontroller 旋转

如何移动 3D 盒子以保持在旋转平面上?

unity点击左转弯按钮控制赛车左转弯怎样实现?

根据 3D 对象的位置旋转相机