Search code examples
unity-game-enginerotationquaternionsclamp

Issue with limiting the rotation of an object on Z-Axis


I'm pretty new to unity and i use it in a special way of creating a non-game2D application So i work only with UI element. I'm having some issues with something i want to do . I have an object which rotate following the finger (or mouse) but the object must not get out of the "area" Here is my code for now :

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

And here is a GIF of the problem :

http://img15.hostingpics.net/pics/324271Animation.gif


Solution

  • Thanks for your answers :) I ask my question on Unity Answer and someone answer me I fix my problem like this :

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