Search Unity

  1. Get all the Unite Berlin 2018 news on the blog.
    Dismiss Notice
  2. Unity 2018.2 has arrived! Read about it here.
    Dismiss Notice
  3. We're looking for your feedback on the platforms you use and how you use them. Let us know!
    Dismiss Notice
  4. The Unity Pro & Visual Studio Professional Bundle gives you the tools you need to develop faster & collaborate more efficiently. Learn more.
    Dismiss Notice
  5. Improve your Unity skills with a certified instructor in a private, interactive classroom. Learn more.
    Dismiss Notice
  6. ARCore is out of developer preview! Read about it here.
    Dismiss Notice
  7. Magic Leap’s Lumin SDK Technical Preview for Unity lets you get started creating content for Magic Leap One™. Find more information on our blog!
    Dismiss Notice
  8. Want to see the most recent patch releases? Take a peek at the patch release page.
    Dismiss Notice

How does Unity work with (or treat) Radians

Discussion in 'General Discussion' started by godfreyidk, Aug 13, 2018 at 8:03 AM.

  1. godfreyidk

    godfreyidk

    Joined:
    Feb 4, 2018
    Posts:
    6
    Hello folks,

    So i've been going over the ThirdPersonCharacter.cs script from the Unity Standard Assets, and noticed that radians were not being converted to degrees. Then i saw that despite this conversion not taking place, the radians were being conditionally multiplied by 180 and 360, which makes the radian float "large" enough to do a degrees-equivalent rotation of say 50, 90, 180 etc. Thus a conversion might not be necessary. But then i noticed how when the input direction was "left" (-1, 0, 0), the character would rotate left starting from its forward. Instead of going "clockwise all the way around from 0 to the radians/degrees mapped at (-1, 0, 0) on the object's unit circle - which would be 270 degrees or 3/2pie radians. This expectation is from my naive understanding of the unity unit circle, whose degrees/radians are mapped starting from 0 at the object's forward, and increasing clockwise.
    So, i decided to serialize the radians (float) returned by Mathf.Atan2(x,y) - corrected for clockwise angle progression. And i saw that the radians (float) returned by Mathf.Atan2(x,y) was actually a negative value when the input direction was "left". Which to me, meant that Unity was dividing the unit circle of mapped radians/degrees, into a negative-left hemisphere, and a positive-right hemisphere. Such that if Mathf.Atan2(x,y) returned a negative radian float, that radian would start/apply from the object forward (0 radians on the unit circle) and progress anticlockwise on the negative-left hemisphere. When Atan2 returned a positive radian float, the radian/float would be applied clockwise from the object forward, on the positive-right hemisphere.

    Just for clarity sake, here's an illustration of "unity unit circle" that i keep mentioning:
    radians4.PNG radians4 (2).PNG radians5.PNG

    Thanks for reading this far. I apologize if it was unclear.
    I've been revising my high school trigonometry and studying this ThirdPersonCharacter.cs script over the weekend. I would really appreciate some confirmation on whether this assumption of mine (negative-left and positive-right hemispheres of the unity unit circle) is correct or not.

    Here's the relevant excerpt from the ThirdPersonCharacter.cs script that you can test for yourself. Be sure to drop in the camera transform in the editor for camTransform.



    Code (CSharp):
    1. public class howUnityTreatsRadians : MonoBehaviour {
    2.     [SerializeField] private Vector3 inputDir;
    3.     public Transform camTransform;
    4.     [SerializeField] private float turnAmount;
    5.  
    6.    void Start () {
    7.        
    8.     }
    9.    
    10.     void Update () {
    11.         inputDir = camTransform.right * Input.GetAxis("Horizontal") +
    12.                    camTransform.forward * Input.GetAxis("Vertical");
    13.        
    14.         if (inputDir.magnitude > 1f) inputDir.Normalize();
    15.         inputDir = transform.InverseTransformDirection(inputDir);
    16.        
    17.         inputDir = Vector3.ProjectOnPlane(inputDir, Vector3.up);
    18.        
    19.         turnAmount = Mathf.Atan2(inputDir.x, inputDir.z);
    20.     }
    21. }
     
  2. Braineeee

    Braineeee

    Joined:
    Nov 9, 2014
    Posts:
    684
    If you want to convert from radians to degrees you just multiply by Mathf.Deg2Rad and inversely: Mathf.Rad2Deg.

    Next I think you have some confusion going on here. The axis alignment of the unit circle is because you've mapped Vector3.forward to vertical and Vector3.right to the horizontal. This changes where zero on the circle is.

    These unity unit circle and the traditional unit circle are the exact same things. You've picked up on the fact that in the ThirdPersonCharacterController zero is forward (Vector3.forward), and that is because in Unity the Z axis is the forward direction. If you wanted to have a proper Unit circle for your character controller, you would map transform.forward to the vertical axis, and the horizontal axis to transform.right.

    Its a simple concept, but easy to get confused. I recommend that you keep studying, but at least you asked a question somewhere to clear up any confusion.

    --ComputerScience major/Math minor at University
     
    godfreyidk likes this.