限制对象在 Z 轴上的旋转的问题
Issue with limiting the rotation of an object on Z-Axis
我是 unity 的新手,我以一种特殊的方式使用它来创建非 game2D 应用程序所以我只使用 UI 元素。我在做某事时遇到了一些问题。我有一个跟随手指(或鼠标)旋转的对象,但该对象不能脱离 "area" 这是我现在的代码:
using UnityEngine;
using System.Collections;
public class SteeringWheel : MonoBehaviour
{
public float angleMax = 90.0f;
private float baseAngle = 0.0f;
void OnMouseDown()
{
Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
pos = Input.mousePosition - pos;
baseAngle = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg;
baseAngle -= Mathf.Atan2(transform.right.y, transform.right.x) * Mathf.Rad2Deg;
}
void OnMouseDrag()
{
Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
pos = Input.mousePosition - pos;
float ang = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg - baseAngle;
Debug.Log("ang1 : " + ang);
ang = Mathf.Clamp(ang, -90, 90);
if (transform.eulerAngles.z >= 89 && transform.eulerAngles.z <= 271)
{
transform.rotation = new Quaternion(transform.rotation.x, transform.rotation.y, 0.7f, transform.rotation.w);
return;
}
transform.rotation = Quaternion.AngleAxis(ang, Vector3.forward);
}
}
这里是问题的 GIF 动图:
删除 if 语句及其中的所有内容,并将 Mathf.Clamp 调用放在 之前 与 baseAngle 的减法而不是之后。
- if 语句错误,因为它检查变换旋转
在设置之前。不管之前的轮换是什么,
如果你无论如何都要改变它。
- 底角是在运行时计算的,因此将其限制在预定义的范围内没有意义。无论如何,夹紧范围似乎更适合减去 baseAngle 之前的值。
我没有发现您的代码有任何这两项更改无法解决的问题。
(顺便说一下,我假设 baseAngle 位于方向盘的中心。如果不是,您应该相应地更改您的范围。)
干杯!
感谢您的回答:)
我在 Unity Answer 上提问,有人回答了我
我这样解决我的问题:
public class SteeringWheel : MonoBehaviour
{
public float angleMax = 90.0f;
private float baseAngle = 0.0f;
void OnMouseDown()
{
Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
pos = Input.mousePosition - pos;
baseAngle = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg;
baseAngle -= Mathf.Atan2(transform.right.y, transform.right.x) * Mathf.Rad2Deg;
}
void OnMouseDrag()
{
Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
pos = Input.mousePosition - pos;
//float ang = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg - baseAngle;
float ang = Mathf.Atan2(Mathf.Max(pos.y, 0), pos.x) * Mathf.Rad2Deg - baseAngle;
Debug.Log("ang1 : " + ang);
ang = Mathf.Clamp(ang, -90, 90);
transform.rotation = Quaternion.AngleAxis(ang, Vector3.forward);
}
}
我是 unity 的新手,我以一种特殊的方式使用它来创建非 game2D 应用程序所以我只使用 UI 元素。我在做某事时遇到了一些问题。我有一个跟随手指(或鼠标)旋转的对象,但该对象不能脱离 "area" 这是我现在的代码:
using UnityEngine;
using System.Collections;
public class SteeringWheel : MonoBehaviour
{
public float angleMax = 90.0f;
private float baseAngle = 0.0f;
void OnMouseDown()
{
Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
pos = Input.mousePosition - pos;
baseAngle = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg;
baseAngle -= Mathf.Atan2(transform.right.y, transform.right.x) * Mathf.Rad2Deg;
}
void OnMouseDrag()
{
Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
pos = Input.mousePosition - pos;
float ang = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg - baseAngle;
Debug.Log("ang1 : " + ang);
ang = Mathf.Clamp(ang, -90, 90);
if (transform.eulerAngles.z >= 89 && transform.eulerAngles.z <= 271)
{
transform.rotation = new Quaternion(transform.rotation.x, transform.rotation.y, 0.7f, transform.rotation.w);
return;
}
transform.rotation = Quaternion.AngleAxis(ang, Vector3.forward);
}
}
这里是问题的 GIF 动图:
删除 if 语句及其中的所有内容,并将 Mathf.Clamp 调用放在 之前 与 baseAngle 的减法而不是之后。
- if 语句错误,因为它检查变换旋转 在设置之前。不管之前的轮换是什么, 如果你无论如何都要改变它。
- 底角是在运行时计算的,因此将其限制在预定义的范围内没有意义。无论如何,夹紧范围似乎更适合减去 baseAngle 之前的值。
我没有发现您的代码有任何这两项更改无法解决的问题。
(顺便说一下,我假设 baseAngle 位于方向盘的中心。如果不是,您应该相应地更改您的范围。)
干杯!
感谢您的回答:) 我在 Unity Answer 上提问,有人回答了我 我这样解决我的问题:
public class SteeringWheel : MonoBehaviour
{
public float angleMax = 90.0f;
private float baseAngle = 0.0f;
void OnMouseDown()
{
Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
pos = Input.mousePosition - pos;
baseAngle = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg;
baseAngle -= Mathf.Atan2(transform.right.y, transform.right.x) * Mathf.Rad2Deg;
}
void OnMouseDrag()
{
Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
pos = Input.mousePosition - pos;
//float ang = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg - baseAngle;
float ang = Mathf.Atan2(Mathf.Max(pos.y, 0), pos.x) * Mathf.Rad2Deg - baseAngle;
Debug.Log("ang1 : " + ang);
ang = Mathf.Clamp(ang, -90, 90);
transform.rotation = Quaternion.AngleAxis(ang, Vector3.forward);
}
}