指出一点很明显:鼠标实现的不流畅性来自于 camshift 给出的矩形仅精确到一帧像素的精度,因此可能的最小移动将屏幕大小/帧大小四舍五入到最近的屏幕像素。
如果是这样的话,可以应用某种指针加速,就像使用真实的低质量鼠标时一样(当然,如果是数千dpi的激光鼠标,则不需要这种东西) . 基本上,光标在屏幕上移动的距离不是指针输入所走的距离(在本例中为 camshift 矩形位移),而是它的一个巧妙选择的函数。因此,使用加速度函数 f(x),移动指针的步骤如下:
- 计算指针输入位移的向量,用v表示。
- 计算相应的单位长度向量,用u表示。
- 屏幕指针位移为v' =f(| v |) * u
我会以beta * e^( alpha * x - 1) 之类的形式选择 f(x),其中 0 < alpha和 0 < beta <= 1 是应该根据经验选择的参数。
基本上,任何在 0 处导数为 1 或更少的函数都会执行此操作(允许您使用输入的完全精度来进行精确的光标移动),随着 x 的增加而变为无穷大(大的移动应该对应于cursor) 是单调递增的,并且具有单调递增的一阶导数。编辑:还需要加速函数在0时的值为0,否则会发生非常奇怪的运动。:)
还需要 f( framewidth ) = screenwidth,以便在框架上移动被跟踪对象会导致光标在屏幕上移动。指数公式很容易使用,但使用二次或更高次多项式可能会在计算上变得更简单,具体取决于那里的性能要求......