- 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