0

ユーザーがワークスペース内でオブジェクトをドラッグできるドラッグ機能を実装したいと考えています。もちろん、それは簡単なことです。難しいのは、トルクモーメントによる回転を組み込んだ、物理的に正しいドラッグにすることです (1 本の指だけを使ってテーブルの上で本をドラッグすることを想像してみてください。ドラッグするとどのように回転しますか?)。

これをコーディングする方法についての説明をどこで見つけることができるか知っている人はいますか (2D のみ、長方形のみ、摩擦は必要ありません)。

大変お世話になりました、デビッド


編集:

私が探しているものを言葉よりもはるかにうまく伝えることを願って、小さなアプリ (明らかに間違った動作をしています) を書きました。C# (VS 2008) ソースとコンパイル済みの exe はこちら


編集2:

サンプル プロジェクトを調整して、許容できる動作を実現しました。新しいソース (およびコンパイル済みの exe) は、こちらから入手できます。C# 2008 で書かれています。私はこのコードを著作権なしで提供します。自由に使用/変更/何でもしてください。私に知らせたり、私に言及したりする必要はありません。

4

3 に答える 3

1

トルクは、力が加えられた点とオブジェクトの重心の間のベクトルに垂直に投影された、加えられた力です。したがって、直径に対して垂直に引っ張ると、トルクは加えられた力に等しくなります。重心から直接引き離すと、トルクはゼロになります。

通常、これは、元のマウス ダウン ポイントをマウスの現在の位置 (オブジェクト ローカル座標) に接続するスプリングをモデル化することによって行います。スプリングと摩擦を使用すると、マウスの動きが少し滑らかになります。


2D 物理パッケージとしての Chipmunk について良いことを聞いたことがあります。

http://code.google.com/p/chipmunk-physics/


わかった、もう遅くなったし、寝なきゃいけない。しかし、ここにいくつかの出発点があります。すべての計算を 1 つの座標空間で行うか、オブジェクトごとに座標空間を定義することができます。ほとんどのアニメーション システムでは、計算が簡単になるため、オブジェクトごとに座標空間を使用し、変換行列を使用して変換します。

計算の基本的な順序は次のとおりです。

  1. マウス ダウンでヒット テストを実行し、イベントの座標を (オブジェクト座標空間に) 保存します。

  2. マウスが移動すると、移動距離を表すベクトルが作成されます。

  3. バネによって発生する力は k * M です。ここで、M は、ステップ 1 からの最初のマウス ダウン ポイントと現在のマウス位置との間の距離です。k はばねのばね定数です。

  4. 最初のマウスダウン ポイントから開始して、そのベクトルを 2 つの方向ベクトルに投影します。1 つの方向はオブジェクトの中心に向かっており、もう 1 つの方向はそこから 90 度です。

  5. オブジェクトの中心に向かって投影された力は、オブジェクトをマウス カーソルに向かって動かし、もう 1 つの力は軸の周りのトルクです。物体がどれだけ加速するかはその質量に依存し、回転加速度は角運動量に依存します。

  6. オブジェクトが移動している媒体の摩擦と粘性によって抗力が発生し、時間の経過とともにオブジェクトの動きが単純に減少します。


または、それを偽造したいだけかもしれません。その場合、長方形の (x,y) 位置とその現在の回転 phi を保存するだけです。次に、これを行います。

  1. 世界座標でのマウスダウン位置のキャプチャ
  2. マウスが移動すると、マウスの位置の変化に応じてボックスを移動します
  3. マウスとオブジェクトの中心の間の角度 (ここでは atan2 が便利です)、およびオブジェクトの中心と最初のマウス ダウン ポイントの間の角度を計算します。2 つの角度の差を四角形の回転に追加します。
于 2009-10-07T04:35:58.997 に答える
1

これは基本的な物理の問題のようです。

クリックした場所を知る必要があります。これにより、クリックが押しているか引いているかがわかります。したがって、これを 2D で実行している場合でも、計算は 3D で行う必要があり、クリックした場所を認識する必要があります。 3D。

空気は動きを提供するのに役立つため、各アイテムには質量などのプロパティと、おそらく空気抵抗の情報があります。

また、ユーザーがマウスを動かす速度に基づいて、異なる反応を示す必要があります。

したがって、彼らは 2 トンの重りを可能よりも速く動かすことができるかもしれません。ドラッグされるオブジェクトがマウス ポインターよりも遅い場合、ユーザーは満足しないため、それに適応する必要があります。

于 2009-10-07T03:55:50.337 に答える
0

どの言語?

これはCでの2次元変換の束です

于 2009-10-07T04:13:13.493 に答える