3

私は、変換、回転、スケーリングなどの基本機能を備えたC++での単純なメッシュビューアの実装に取り​​組んでいます。マウスを使用してz軸に沿ったオブジェクトの回転を実装することに固執しています。私が実装したいのは次のとおりです。

  1. マウスをクリックして垂直にドラッグし(単純なしきい値を使用して水平軸に沿ったわずかな偏差をフィルタリングするため、ほぼ垂直になります)、オブジェクトをy軸に沿って回転させます(この部分は完了です)。
  2. 上記のようにマウスをクリックして水平方向にドラッグし、オブジェクトをx軸に沿って回転させます(この部分も実行されます)。
  3. z軸の回転の場合、円形(または円弧に沿った)のマウスの動きを検出したいと思います。私はこの部分で立ち往生していて、これを実装する方法がわかりません。

上記の2つについては、atan2()を使用して移動角度を決定します。しかし、どうすれば円運動を検出できますか?

4

6 に答える 6

0

これに対処する唯一の方法は、ユーザーがモーションを開始してからオブジェクトが回転するまでの間に遅延を設けることです。

ユーザーがクリックしてマウスを動かし始めたら、マウスが直線移動になるのか、円形移動になるのかを判断する必要があります。これには、その判断を下す前に、一定量のデータを収集する必要があります。

最も極端なケースは、ユーザーが最初に1つの完全な円を作成してから、回転を開始することを要求することです(実際には、これよりもはるかにうまくいく可能性があります)。この期間をどれだけ短くできるかは、a)ユーザーのアクションをどれだけ正確に指示するか、およびb)パターン認識アルゴリズムがどれだけ優れているかによって異なります。

ここから始めるために、非常に貧弱なアルゴリズムの概要を示します。

ユーザーがクリックすると、x座標とy座標が保存されます。1/10秒ごとに、新しい座標とprocess_for_patternを保存します。

あなたが探しているprocess_for_patternで:

x座標とy座標の両方が定期的に増加する、両方が減少する、または1つが増加して1つが減少する期間。時間の経過とともに、このパターンが変化して、xまたはyのいずれかが反転し始め、もう一方がそのまま継続する場合、その時点で、円を持っていることをかなり確信で​​きます。

このアルゴリズムでは、ユーザーが検出される前に1/4の円を描く必要があり、サイズ、方向、または大きく不規則な動きは考慮されません。

この方法を本当に続行したい場合は、はるかに優れたアルゴリズムを取得できますが、制御方法を再検討することをお勧めします。

于 2012-10-25T13:29:38.077 に答える
0

私はそれがそのように機能するとは思わない...

マウスホイールの回転をz軸に変換するか、すべての軸に沿ってほぼ直感的に回転できるクォータニオンカメラの向きを使用できます...

クォータニオンカメラの場合は逆になります。メッシュを直線に沿って回転させようとすると、メッシュは他の奇妙な軸を中心にわずかに回転しているように見えます。これを補うために、わずかに湾曲した軌道を直感的にたどろうとします。

于 2012-10-25T13:11:25.573 に答える
0

おそらく、画面領域(ウィンドウの境界など)を定義する必要があります。これは、クリックされると円弧の移動を開始します。または、他の修飾子やボタンなどを使用します。

次に、マウスをクリックして、2D画面空間の座標と回転の中心(メッシュ軸)をキャプチャします。これはあなたにベクトルを取得します(メッシュセンター、ボタンダウン位置)

マウスを動かすたびに、新しいベクトル(メッシュの中心、マウスの位置)を計算し、2つのベクトル間の角度が回転角になります。

于 2012-10-25T13:16:31.130 に答える
0

それはあなたが望むものではありませんが、十分に近づく必要があります。

説明されているように、1と2の番号の付いた動きが機能する円形の領域を選択します(図では、これは赤い円よりも小さい領域になります。ただし、ユーザーが円形の領域の外側をクリックすると、最初のクリック位置が保存されます(これは、画面のx軸に対して特定の角度を持つ点を定義し(これは、いくつかの三角関数で簡単に見つけることができます)、ユーザーが作業している円の半径も定義します(緑色で表示)。マウスを離すと、2番目のポイント(青)が追加されます。次に、このポイントが画面の中心とx軸に対して持つ角度を見つけます(前と同じように)。次に、その角度を自分の最初のクリックで決定された半径の円。濃い赤の円弧は、モデルの回転量を定義します。

ここに画像の説明を入力してください

これはあなたが始めるのに十分なはずです。

于 2012-10-25T13:52:55.563 に答える
0

それは良い入力方法ではないと思います。直線と曲線を区別するには、常にある程度の移動距離が必要になるため、入力遅延が発生します。別の方法は次のとおりです。

画面の中央を横切る線を持つ垂直マウスのみが垂直と見なされます。横も同じです。それ以外の場合は回転と見なされ、その振幅を計算するには、画面の中心を基準にした最後のマウスの位置と現在の位置の間の角度を計算します。

または、アプリケーションがそのように機能する場合は、選択したメッシュの中心を使用できます。

于 2012-10-25T14:02:20.103 に答える
0

3Dモデルの表示に必要な精度に近い場所では、「円弧に沿った円形」のマウスの動きを検出することはできません。あなたが欲しいのはこのようなものです:http ://thetechartist.com/?p = 80

キーボードショートカットまたはマウスでつかむことができる画面上の軸インジケータのいずれかを使用して、軸(x、y、またはz)を指定します。

これは、「アーク」ジェスチャを検出しようとするよりもはるかに正確です。「アーク」認識には、アークジェスチャが開始されたかどうかを判断するのに十分なマウスサンプルを蓄積する間、必然的に遅延が発生します。このようなジェスチャ認識は簡単ではありません(私はWiiリモコンでいくつかのジェスチャ作業を行いました)。同様に、単純な「垂直」および「水平」のマウスの動きの検出でも、同じ理由で遅延が必要になります。「わずかな偏差をフィルタリングするための単純なしきい値」があると、それは弱くて奇妙に感じられます。

3D表示の場合、1:1のマウス応答性が必要です。つまり、ショートカットキーやUIなどを使用して軸を明示的に指定するだけです。x軸の回転の場合は、マウスxに制限し、必要に応じてy軸をマウスyに制限します。zの場合、同様にxまたはyマウス入力に制限するか、マウスの移動距離の合計を2Dにすることができます。それはあなたにとって何が一番気持ちがいいかによります。

別の方法として、 3dConnexionSpaceExplorerのような3Dマウスのサポートをコーディングしてみることができます。

于 2012-10-25T14:21:35.870 に答える