5

データセットを世界にプロットする小さなプロジェクトを行っています。プロットができました。次に、カメラの動きを実装したいと思います。

ユーザーが c を押したままマウスをドラッグすると、カメラの位置が変更されるコードがあります。問題は、マウスの動きからカメラの動きを計算する方法がわかりません。

これは、デフォルト位置のカメラ コードです: camera(width/2.0, height/2.0, (height/2.0) / tan(PI*60.0 / 360.0), width/2.0, height/2.0, 0, 0, 1, 0 );

マウスのドラッグに関連してカメラの位置を変更するにはどうすればよいですか? (mouseX と mouseY を使ってカメラの目の位置をずらしてみましたが、うまくいきません。)

4

2 に答える 2

2

方向ベクトルを取得している場合は、次のようにカメラの位置を設定できます (抽象コード):

pos += speed * normalize( direction );

それは前進するためです。後方に移動したい場合は、正規化された方向バーターに -1 を掛けるだけです。左右に機銃掃射するには、次のようなものを使用します。

pos += speed * normalize( cross_product( direction, upvector ) ); // strafing right
pos += speed * normalize( cross_product( upvector, direction ) ); // strafing left

ベクトル操作に関するいくつかのメモを次に示します (私の「HelloWorld」アプリケーションの 1 つから =) ):

  • 正規化 (vec); 長さが 1 に等しい vec を返します。これはvecを必要な長さに「カット」します
  • cross_product( vec_a, vec_b ); vec_a と vec_b に垂直に向けられた vec_c を返します (詳細については、この記事を参照してください)。

私のバージョンのcross_product()は次のようになります。

Vector Vector::CrossProduct(const Vector &v)
{
    double k1 = (y * v.z) - (z * v.y);
    double k2 = (z * v.x) - (x * v.z);
    double k3 = (x * v.y) - (y * v.x);

    return Vector(NumBounds(k1), NumBounds(k2), NumBounds(k3)); 
    // NumBounds(v) returns 0 when v is less than 10 ^ -8
}

これが役立つことを願っています=)

于 2010-11-21T12:06:12.110 に答える
1

最も簡単な方法は、peasycam ライブラリを使用することだと思います。

http://mrfeinberg.com/peasycam/

このライブラリは、カメラとその現在の状態に関する情報に簡単にアクセスできるようにするさまざまなゲッターと同様に、さまざまな方法で制約できるマウスを使用してカメラにアクセスできるようにします。

于 2011-10-05T10:43:24.927 に答える