2D移動(マウスから)を3D軸に沿った変位に変換するにはどうすればよいですか?


8

小さな3Dシーンエディターを作成しています(オブジェクトの位置の変更のみが可能です)。

各オブジェクトは、3D X / Y / Z軸で描画されます。

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

仕組み:ユーザーは軸(X、Y、Z)を左クリックして選択し、左クリックを押したままマウスを移動します(オブジェクトを軸方向に移動します)。選択はすでに問題ありhow muchませんが、2Dマウスの動きに応じて、選択した軸に対してオブジェクトを移動する必要があることを知りたいのですが。

例として、この図では、X軸を選択してマウスを左右に動かすと、上下に動かすよりも大きな変位が得られます(この場合はほぼゼロ)。

それは本当にシンプルでなければならないが、私はそれを理解することができません。

入力は、最初の左クリックからのマウスの変位(2Dベクトル)、選択された軸ベクトル(3dベクトル)、モデルビュー/投影行列です。

出力:量(floatまたはdouble)


オブジェクトの向きとカメラの向きを比較することで、ユーザーがオブジェクトに対してマウスを動かしている方向を比較できます。
MichaelHouse

回答:


5

これをどのように動作させますか?これにはさまざまな方法があります。

簡単なオプションは、マウスが移動する各スクリーンスペースユニット(ピクセルなど)に対して、オブジェクトを特定の数のワールドスペースユニットだけ移動することです。

別のオプションは、マウスの動きのベクトルを取り、それを通常の投影/カメラマトリックスを通して動きの軸に投影することです。逆ビューポート、投影、およびカメラマトリックスを介してマウスの動きベクトルを投影します(これに近いビューの平面距離の初期Zを指定します。最終的には近い平面のオフセットになります)。これにより、ワールド空間でのマウスの動きベクトルが得られます。そのベクトルを目的の軸に投影します。これにより、ワールド空間での動きが得られます。オブジェクトは、オブジェクトの向きに関係なく、ユーザーがポイントした場所に移動します。軸がほぼ垂直である場合、それを移動するには垂直方向の動きが必要です。

画面スペースで開始と終了のマウスポイントを取り、両方を投影して、そこからワールドスペースの移動ベクトルを計算することもできます。私はそうしませんが、あなたはそれがより簡単であると思うでしょう

もう1つのオプションは、マウスの動きを利用して、動きが速いほどオフセットが大きくなることです。

最初のオプションのバリアントを使用して、ユーザーがマウスを連続的に移動できるように(上下にピックして)ポインターをつかむこともできます。これは、回転とスケールのコントロールで特に人気があります。


面白いテクニック。とにかく、RobCurrテクニックも有効であるかどうかを知るのは良いことです(私には思えますが、ダウンやアップ投票はありません...)
tigrou

私がそれを読んでいるとき、彼は私がリストした一つのオプションと同じことを言っています。投影された端点を計算し、ワールド空間でベクトルを形成し、それを目的の軸に投影します。彼はちょうどベクトル投影のためのいくつかの紛らわしい数学をリストしました。
Sean Middleditch 2013

0

おそらく、選択した軸の端点を2D空間に投影し、それらを差し引いて2Dベクトルを生成します。次に、2dマウスの動きの正規化されたベクトルと正規化された最初のベクトルの内積をとって、適用する必要のある動きの部分を決定します。

したがって、基本的には、2つのベクトルを計算します。

Va =投影された軸の端点の正規化された差

Vb =マウスの動きのデルタxとyから作成された正規化ベクトル

Va.Vb = | Va || Vb | cos @

Va.Vb /(| Va | Vb |)= cos @-これは、軸に沿って適用されるマウスの動きのコンポーネントです。

ちょうど別のオプション。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.