40 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using UnityEngine;
 | |
| 
 | |
| namespace Timeline.Samples
 | |
| {
 | |
|     public static class QuaternionUtils
 | |
|     {
 | |
|         const float k_FloatMin = 1e-10f;
 | |
| 
 | |
|         public static readonly Quaternion zero = new Quaternion(0f, 0f, 0f, 0f);
 | |
| 
 | |
|         public static Quaternion Scale(this Quaternion q, float scale)
 | |
|         {
 | |
|             return new Quaternion(q.x * scale, q.y * scale, q.z * scale, q.w * scale);
 | |
|         }
 | |
| 
 | |
|         public static Quaternion NormalizeSafe(this Quaternion q)
 | |
|         {
 | |
|             float dot = Quaternion.Dot(q, q);
 | |
|             if (dot > k_FloatMin)
 | |
|             {
 | |
|                 float rsqrt = 1.0f / Mathf.Sqrt(dot);
 | |
|                 return new Quaternion(q.x * rsqrt, q.y * rsqrt, q.z * rsqrt, q.w * rsqrt);
 | |
|             }
 | |
| 
 | |
|             return Quaternion.identity;
 | |
|         }
 | |
| 
 | |
|         public static Quaternion Blend(this Quaternion q1, Quaternion q2, float weight)
 | |
|         {
 | |
|             return q1.Add(q2.Scale(weight));
 | |
|         }
 | |
| 
 | |
|         public static Quaternion Add(this Quaternion rhs, Quaternion lhs)
 | |
|         {
 | |
|             float sign = Mathf.Sign(Quaternion.Dot(rhs, lhs));
 | |
|             return new Quaternion(rhs.x + sign * lhs.x, rhs.y + sign * lhs.y, rhs.z + sign * lhs.z, rhs.w + sign * lhs.w);
 | |
|         }
 | |
|     }
 | |
| }
 |