- Home /
 
 
               Question by 
               gravelpootis · May 14, 2021 at 06:56 PM · 
                mathrotation axisrotatearound  
              
 
              Rotate around to angle with lerp

How to do it
 
                 
                problem.png 
                (7.5 kB) 
               
 
              
               Comment
              
 
               
               
               Best Answer 
              
 
              Answer by andrew-lukasik · May 14, 2021 at 09:13 PM
Linear interpolation:
 using System.Collections;
 using UnityEngine;
 public class RotationScript : MonoBehaviour
 {
     [SerializeField] Transform _objectToRotate = null;
     [SerializeField] Transform _pivotPointAndAxis = null;
     [SerializeField] float _angle = 70f;
     [SerializeField] float _duration = 2f;
     void OnEnable ()
     {
         var coroutine = Rotation(
             angle:      _angle ,
             duration:   _duration ,
             subject:    _objectToRotate ,
             pivot:      _pivotPointAndAxis.position ,
             axis:       _pivotPointAndAxis.up
         );
         StartCoroutine( coroutine );
     }
     static IEnumerator Rotation ( float angle , float duration , Transform subject , Vector3 pivot , Vector3 axis )
     {
         Vector3 initialPosRelative = subject.position - pivot;
         Quaternion initialRotation = subject.rotation;
         float time = 0;
         do
         {
             float t = time / duration;
             Quaternion rot = Quaternion.AngleAxis( angle * t , axis );
             subject.position = pivot + rot * initialPosRelative;
             subject.rotation = initialRotation * rot;
             yield return null;
         }
         while( ( time += Time.deltaTime ) < duration );
     }
     #if UNITY_EDITOR
     void OnDrawGizmos ()
     {
         if( !Application.isPlaying && _pivotPointAndAxis!=null && _objectToRotate!=null )
         {
             Vector3 pivot = _pivotPointAndAxis.position;
             Vector3 pos = _objectToRotate.position;
             Vector3 axis = _pivotPointAndAxis.up;
 
             Gizmos.DrawRay( pivot , axis );
             Gizmos.DrawLine( pos , pivot );
             for( int i=0 ; i<9 ; i++ )
             {
                 float t1 = (float) i / (float) 10;
                 float t2 = (float) (i+1) / (float) 10;
                 Vector3 vec1 = pivot + Quaternion.AngleAxis(_angle*t1,axis) * (pos-pivot);
                 Vector3 vec2 = pivot + Quaternion.AngleAxis(_angle*t2,axis) * (pos-pivot);
                 Gizmos.DrawLine( vec1 , vec2 );
                 Gizmos.DrawLine( vec2 , pivot );
             }
         }
     }
     #endif
 }
 
               Elastic interpolation:
(cool-looking one)
 using System.Collections;
 using UnityEngine;
 public class RotationScript : MonoBehaviour
 {
     [SerializeField] Transform _objectToRotate = null;
     [SerializeField] Transform _pivotPointAndAxis = null;
     [SerializeField] float _angle = 70f;
     [SerializeField] float _duration = 2f;
     void OnEnable ()
     {
         IEnumerator coroutine = Rotation(
             angle:      _angle ,
             duration:   _duration ,
             subject:    _objectToRotate ,
             pivot:      _pivotPointAndAxis.position ,
             axis:       _pivotPointAndAxis.up
         );
         StartCoroutine( coroutine );
     }
     static IEnumerator Rotation ( float angle , float duration , Transform subject , Vector3 pivot , Vector3 axis )
     {
         Vector3 initialPosRelative = subject.position - pivot;
         Quaternion initialRotation = subject.rotation;
         float time = 0;
         do
         {
             float t = time / duration;
             float tElastic = easeOutElastic(t);
             Quaternion rot = Quaternion.AngleAxis( angle * tElastic , axis );
             subject.position = pivot + rot * initialPosRelative;
             subject.rotation = initialRotation * rot ;
             yield return null;
         }
         while( ( time += Time.deltaTime ) < duration );
     }
     static float easeOutElastic ( float t )
     {
         const float c4 = (2f*Mathf.PI)/3f;
         return t==0 ? 0 : t==1 ? 1 : Mathf.Pow(2f,-10f*t)*Mathf.Sin((t*10f-0.75f)*c4)+1f;
     }
 }
 
               You forgot about rotation axis that must be defined. Here, as pivotTransform.up: 
Your answer
 
             Follow this Question
Related Questions
Flying player Rotates in the left and right direction not forward and back 1 Answer
rotating objects around collider axis 1 Answer
Sprite rotation clockwise or counter clockwise according to direction towards mouse 0 Answers
Rotation that keeps upright 1 Answer
Change orbit while rotating. 2 Answers