明らかなことを指摘すると、マウスの実装が滑らかでないのは、camshiftによって与えられる長方形が1フレームピクセルの精度にしか正確でないため、可能な限り最小の動きは、最も近い画面に丸められた画面サイズ/フレームサイズになります。ピクセル。
その場合、実際の低品質のマウスを使用する場合と同じように、ある種のポインターアクセラレーションを適用できます(もちろん、数千dpiのレーザーマウスの場合、そのようなことは必要ありません)。 。基本的に、カーソルが画面上で移動する距離は、ポインター入力(この場合はカムシフト長方形の変位)がとる距離ではなく、巧妙に選択された関数です。したがって、加速関数f(x)を使用すると、ポインターを移動する手順は次のようになります。
- ポインタ入力変位のベクトルを計算します。これをvで表します。
- 対応する単位長ベクトルを計算します。これをuで表します。
- 画面上のポインタの変位はv' =f(| v |)* uです。
私はベータ*e^(アルファ* x --1)のような形式でf(x)を選択しました。ここで、0<アルファおよび0<ベータ<=1は経験的に選択する必要のあるパラメーターです。
基本的に、0で1以下の導関数を持つ関数(正確なカーソルの動きに入力の完全な精度を使用できるようにする)は、xが増加するにつれて無限大になります(大きな動きは、の大きな動きに対応する必要があります)カーソル)、単調に増加し、単調に増加する一次導関数を持ちます。編集:加速関数の値が0で0である必要もあります。そうしないと、非常に奇妙な動きが発生します。:)
また、追跡対象オブジェクトをフレーム全体に移動するとカーソルが画面上を移動するように、f(framewidth)= screenwidthにすることが望ましいです。指数式は非常に使いやすいですが、2次以上の多項式を使用すると、パフォーマンス要件によっては計算が簡単になる場合があります...