关于《四元数插值算法实现游戏角色平滑旋转》中的算法一些问题

《四元数插值算法实现游戏角色平滑旋转》此文中讲利用四元数做两个向量直接的平滑。如果按照上面的公式,那么得到的不是一个标准的圆,而是一个外凸的圆。

另外,每段的角度也不是相同的。


如果要做到标准的圆,且每个角度都相同,那么最好用底层的四元数的算法。也就是四元数的矩阵。

//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的公式。

如果忽略迭代误差,上述算法基本实现在任何屏幕的平滑插入。



猜你喜欢

转载自blog.csdn.net/htsitr2/article/details/56009721