飞机 - 防止旋转超出限制,但允许转弯
Aeroplane - prevent rotation outside limits, but allow turning
我有一个使用 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),平面不再沿 'arc' 移动,因为 forward
不是直线。当它到达极限时,飞机只是直线移动。我希望它继续弧形,只是不要超出旋转限制。我希望这是有道理的?有人对我如何实现这一目标有任何提示吗?
你的问题是你在比较旋转角度和欧拉角。所以,当你达到 50 度时,就不能再旋转了。
你必须将旋转与前向矢量进行比较,并将此旋转限制为 50 度
我不敢相信解决方案如此明显...当然,我不希望 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);
我有一个使用 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),平面不再沿 'arc' 移动,因为 forward
不是直线。当它到达极限时,飞机只是直线移动。我希望它继续弧形,只是不要超出旋转限制。我希望这是有道理的?有人对我如何实现这一目标有任何提示吗?
你的问题是你在比较旋转角度和欧拉角。所以,当你达到 50 度时,就不能再旋转了。
你必须将旋转与前向矢量进行比较,并将此旋转限制为 50 度
我不敢相信解决方案如此明显...当然,我不希望 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);