public static Slerp ( |
||
p | ||
q | ||
t | float | |
return |
public static Quaternion Slerp(Quaternion p, Quaternion q, float t)
{
Quaternion quaternion;
float f = Quaternion.Dot(p, q);
if ((1f + f) > 1E-05)
{
float num2;
float num3;
if ((1f - f) > 1E-05)
{
float num4 = Mathf.Acos(f);
float num5 = 1f / Mathf.Sin(num4);
num2 = Mathf.Sin((1f - t) * num4) * num5;
num3 = Mathf.Sin(t * num4) * num5;
}
else
{
num2 = 1f - t;
num3 = t;
}
quaternion.x = (num2 * p.x) + (num3 * q.x);
quaternion.y = (num2 * p.y) + (num3 * q.y);
quaternion.z = (num2 * p.z) + (num3 * q.z);
quaternion.w = (num2 * p.w) + (num3 * q.w);
return quaternion;
}
float num6 = Mathf.Sin(((1f - t) * 3.141593f) * 0.5f);
float num7 = Mathf.Sin((t * 3.141593f) * 0.5f);
quaternion.x = (num6 * p.x) - (num7 * p.y);
quaternion.y = (num6 * p.y) + (num7 * p.x);
quaternion.z = (num6 * p.z) - (num7 * p.w);
quaternion.w = p.z;
return quaternion;
}
}
public static Quaternion GetQuatSquad(float t, Quaternion q0, Quaternion q1, Quaternion a0, Quaternion a1) { float t1 = (float)(2.0 * (double)t * (1.0 - (double)t)); Quaternion quaternion = MathUtils.Slerp(MathUtils.Slerp(q0, q1, t), MathUtils.Slerp(a0, a1, t), t1); float num = Mathf.Sqrt((float)((double)quaternion.x * (double)quaternion.x + (double)quaternion.y * (double)quaternion.y + (double)quaternion.z * (double)quaternion.z + (double)quaternion.w * (double)quaternion.w)); quaternion.x /= num; quaternion.y /= num; quaternion.z /= num; quaternion.w /= num; return(quaternion); }