12

トラックボールの回転、ズーム、パンからユーザーを抽象化する C++ クラスを設計しました。回転 (トラックボールを使用) とズームが期待どおりに機能しています。ただし、パンは期待どおりに動作しません。ポイントをピックしてドラッグすると、ドラッグを終了しても、ピックしたポイントが引き続きマウスの下にあると思います。透視投影でのパンについての私の理解は次のとおりです。ターゲットとカメラの位置、両方がパン操作の影響を受けます。カメラのターゲットとカメラの位置 (目) は、ドラッグに比例して移動する必要があります。比例性 (一定でない場合があります) は、Z 深度に基づく必要があります。

パンニングは、正投影では簡単ですが、遠近法では問題が生じます。OpenGL の数学と実装の詳細を説明できると便利です。

4

2 に答える 2

9

OpenGL の詳細についてはわかりませんが、あなたの質問を正しく理解できれば、数学を手伝うことができます。

オブジェクトをクリックして、アンカーポイントpでオブジェクトに当たるシーンを介してレイを「送信」することにより、オブジェクトを既に選択していると仮定します。

次のことを理解する。

透視投影によるパン

ここで、ベクトルtに沿ってマウスをドラッグします。切片定理を使用すると、「カーソルの下に保持する」ためにpを変換する必要があるベクトルsを簡単に計算できます。

|p| / |q| = |s| / |t|

|s| = ( |p| / |q| ) * |t|

s は t に平行であるため、t を |s| で乗算して正規化します。

s = t / |t| * |s|

s = t / |t| * ( |p| / |q| ) * |t|

s = t * ( |p| / |q| )

パンしている場合は、psずつシフトしていないだけで、まったく同じことを行っていますが、シーン全体を-sで移動する必要があります。

于 2012-08-23T19:38:33.917 に答える