拖动和旋转统一
drag & rotate unity
拜托,我需要帮助来通过拖动来旋转对象。对象是随触摸屏转动的船舵。我有一个问题,点击对象总是 returns 到角度 0。然后如果我可以让它旋转,但它总是从 0 而不是我停留的地方开始。
public void OnClick()
{
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;
}
public void OnDrag()
{
Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
pos = Input.mousePosition - pos;
float ang = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg - baseAngle;
transform.rotation = Quaternion.AngleAxis(ang, Vector3.right);
}
抱歉,之前的 post 不对。问题是你的立方体的 "default" 方向(你使用 Vector.right,但你需要 Vector.up),以及它的错误轴。您可以使用 "z" 和 "y",而不是 "y" 和“z”。我现在修复它,结束完全重写我的答案。
private Vector2 GetDirectionToMouse()
{
var mousePosition = Camera.main.WorldToScreenPoint(transform.position);
Vector2 result = Input.mousePosition - mousePosition;
return result;
}
float dragAngle;
public void OnBeginDrag(PointerEventData data)
{
var directionToMouse = GetDirectionToMouse().normalized;
var mouseAngle = Mathf.Atan2(directionToMouse.y, directionToMouse.x) * Mathf.Rad2Deg;
var transAngle = Mathf.Atan2(transform.up.z, transform.up.y) * Mathf.Rad2Deg;
dragAngle = mouseAngle - transAngle;
}
public void OnDrag(PointerEventData data)
{
var directionToMouse = GetDirectionToMouse().normalized;
var mouseAngle = Mathf.Atan2(directionToMouse.y, directionToMouse.x) * Mathf.Rad2Deg;
var targetAngle = mouseAngle - dragAngle;
transform.rotation = Quaternion.AngleAxis(targetAngle, Vector3.right);
}
拜托,我需要帮助来通过拖动来旋转对象。对象是随触摸屏转动的船舵。我有一个问题,点击对象总是 returns 到角度 0。然后如果我可以让它旋转,但它总是从 0 而不是我停留的地方开始。
public void OnClick()
{
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;
}
public void OnDrag()
{
Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
pos = Input.mousePosition - pos;
float ang = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg - baseAngle;
transform.rotation = Quaternion.AngleAxis(ang, Vector3.right);
}
抱歉,之前的 post 不对。问题是你的立方体的 "default" 方向(你使用 Vector.right,但你需要 Vector.up),以及它的错误轴。您可以使用 "z" 和 "y",而不是 "y" 和“z”。我现在修复它,结束完全重写我的答案。
private Vector2 GetDirectionToMouse()
{
var mousePosition = Camera.main.WorldToScreenPoint(transform.position);
Vector2 result = Input.mousePosition - mousePosition;
return result;
}
float dragAngle;
public void OnBeginDrag(PointerEventData data)
{
var directionToMouse = GetDirectionToMouse().normalized;
var mouseAngle = Mathf.Atan2(directionToMouse.y, directionToMouse.x) * Mathf.Rad2Deg;
var transAngle = Mathf.Atan2(transform.up.z, transform.up.y) * Mathf.Rad2Deg;
dragAngle = mouseAngle - transAngle;
}
public void OnDrag(PointerEventData data)
{
var directionToMouse = GetDirectionToMouse().normalized;
var mouseAngle = Mathf.Atan2(directionToMouse.y, directionToMouse.x) * Mathf.Rad2Deg;
var targetAngle = mouseAngle - dragAngle;
transform.rotation = Quaternion.AngleAxis(targetAngle, Vector3.right);
}