《四元数插值算法实现游戏角色平滑旋转》此文中讲利用四元数做两个向量直接的平滑。如果按照上面的公式,那么得到的不是一个标准的圆,而是一个外凸的圆。
另外,每段的角度也不是相同的。
如果要做到标准的圆,且每个角度都相同,那么最好用底层的四元数的算法。也就是四元数的矩阵。
//nv是要进行选择的平面。可以通过叉积的方式进行计算。在二维中就是(0,0,1)
//th是要旋转的角度。
//p1 是当前的点
//得到的结果是p1饶nv旋转th得到的位置。
Vector3 Rotate(Vector3 nv,double th,Vector3 p1)
{
double costh2=Math.Cos(th/2);
double sinth2=Math.Sin(th/2);
double x = nv.X * sinth2;
double y = nv.Y * sinth2;
double z = nv.Z * sinth2;
double w = costh2;
double a11 = 1 - 2*(y * y + z * z);
double a12 = 2 * (x * y - w * z);
double a13 = 2 * (w * y + x * z);
double a21 = 2 * (x * y + w * z);
double a22 = 1 - 2 * (x * x + z * z);
double a23 = 2 * (y * z - w * x);
double a31 = 2 * (x * z - w * y);
double a32 = 2 * (y * z + w * x);
double a33 = 1 - 2 * (x * x + y * y);
Vector3 pt = new Vector3(a11 * p1.X + a12 * p1.Y + a13 * p1.Z,
a21 * p1.X + a22 * p1.Y + a23 * p1.Z,
a31 * p1.X + a32 * p1.Y + a33 * p1.Z);
return pt;
}
从上面的代码可以看出,计算量很少,只用了一个cos和sin比较占CPU的公式。
如果忽略迭代误差,上述算法基本实现在任何屏幕的平滑插入。