72 return Mathf.Sqrt(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w);
77 return new Quaternion(-q.x, -q.y, -q.z, q.w);
87 if (Mathf.Abs(q.w) < 1.0){
88 float theta = Mathf.Acos(q.w);
89 float sin_theta = Mathf.Sin(theta);
91 if (Mathf.Abs(sin_theta) > 0.0001){
92 float coef = theta/sin_theta;
106 float fAngle = Mathf.Sqrt(q.x*q.x + q.y*q.y + q.z*q.z);
107 float fSin = Mathf.Sin(fAngle);
109 res.w = Mathf.Cos(fAngle);
111 if (Mathf.Abs(fSin) > 0.0001){
112 float coef = fSin/fAngle;
123 public static Quaternion
GetQuatSquad (
float t, Quaternion q0, Quaternion q1, Quaternion a0,Quaternion a1){
125 float slerpT = 2.0f*t*(1.0f-t);
126 Quaternion slerpP =
Slerp(q0, q1, t);
127 Quaternion slerpQ =
Slerp(a0, a1, t);
129 return Slerp(slerpP, slerpQ, slerpT);
133 public static Quaternion
GetSquadIntermediate (Quaternion q0uaternion,Quaternion q1uaternion,Quaternion q2uaternion){
135 Quaternion p0 =
GetQuatLog(q1Inv*q0uaternion);
137 Quaternion p2 =
GetQuatLog(q1Inv*q2uaternion);
138 Quaternion sum=
new Quaternion(-0.25f*(p0.x+p2.x), -0.25f*(p0.y+p2.y), -0.25f*(p0.z+p2.z), -0.25f*(p0.w+p2.w));
147 public static float Ease(
float t,
float k1,
float k2){
150 f = k1*2/Mathf.PI + k2 - k1 + (1.0f-k2)*2/Mathf.PI;
154 s = k1*(2/Mathf.PI)*(Mathf.Sin((t/k1)*Mathf.PI/2-Mathf.PI/2)+1);
159 s = (2*k1/Mathf.PI + t-k1);
163 s= 2*k1/Mathf.PI + k2-k1 + ((1-k2)*(2/Mathf.PI))*Mathf.Sin(((t-k2)/(1.0f-k2))*Mathf.PI/2);
165 f = k1*2/Mathf.PI + k2 - k1 + (1.0f-k2)*2/Mathf.PI;
169 s = k1*(2/Mathf.PI)*(Mathf.Sin((t/k1)*Mathf.PI/2-Mathf.PI/2)+1);
174 s = (2*k1/Mathf.PI + t-k1);
178 s= 2*k1/Mathf.PI + k2-k1 + ((1-k2)*(2/Mathf.PI))*Mathf.Sin(((t-k2)/(1.0f-k2))*Mathf.PI/2);
186 public static Quaternion
Slerp (Quaternion p ,Quaternion q,
float t){
193 float fCos = Quaternion.Dot(p, q);
195 if ((1.0f + fCos) > 0.00001f){
196 if ((1.0f - fCos) > 0.00001f){
197 omega = Mathf.Acos(fCos);
198 invSin = 1.0f/Mathf.Sin(omega);
199 fCoeff0 = Mathf.Sin((1.0f-t)*omega)*invSin;
200 fCoeff1 = Mathf.Sin(t*omega)*invSin;
207 ret.x = fCoeff0*p.x + fCoeff1*q.x;
208 ret.y = fCoeff0*p.y + fCoeff1*q.y;
209 ret.z = fCoeff0*p.z + fCoeff1*q.z;
210 ret.w = fCoeff0*p.w + fCoeff1*q.w;
213 fCoeff0 = Mathf.Sin((1.0f-t)*Mathf.PI*0.5f);
214 fCoeff1 = Mathf.Sin(t*Mathf.PI*0.5f);
216 ret.x = fCoeff0*p.x - fCoeff1*p.y;
217 ret.y = fCoeff0*p.y + fCoeff1*p.x;
218 ret.z = fCoeff0*p.z - fCoeff1*p.w;
static Quaternion Slerp(Quaternion p, Quaternion q, float t)
static float GetQuatLength(Quaternion q)
static Quaternion GetQuatSquad(float t, Quaternion q0, Quaternion q1, Quaternion a0, Quaternion a1)
static float Ease(float t, float k1, float k2)
static Quaternion GetQuatExp(Quaternion q)
static Quaternion GetSquadIntermediate(Quaternion q0uaternion, Quaternion q1uaternion, Quaternion q2uaternion)
static Quaternion GetQuatConjugate(Quaternion q)
static Quaternion GetQuatLog(Quaternion q)