2010-11-20 28 views
5

私は、世界にデータセットをプロットする小さなプロジェクトをやっています。私はプロットを完了しました。今私はカメラの動きを実装したいと思います。処理とOpenGL - カメラの位置を変更しますか?

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

カメラの幅(2.0)、高さ/2.0、高さ/2.0、tan(PI * 60.0/360.0)、幅/2.0、高さ/2.0、0、0のカメラコードです。 、1,0)。

マウスのドラッグに関連してカメラの位置を変更するにはどうすればよいですか? (私は、カメラの目の位置をオフセットするためにするmouseXとmouseYのを使用して試してみたが、それはうまく動作しません。)

+0

「カメラコード」と言うと、それはモデルビュー行列ですか?または、シーンの計算の背後にある「カメラ」クラス/関数を使用していますか?シーンを移動する最も簡単な方法は、カメラを完全に無視してシーン自体を移動することです。レンダリングしているすべてのX、Y、Zポイントに「カメラオフセット」を追加するだけです。これは「カメラ」を移動させたい場所の反対です。 – cecilkorik

+0

処理カメラ()メソッドの変数をマウスのドラッグに応じて変更したいのです。 –

答えて

2

あなたは方向ベクトルを持っている場合は、抽象的な次のようにお使いのカメラの位置を(設定することができますコード):

pos += speed * normalize(direction); 

これは進歩的なものです。逆方向に移動したい場合は、正規化方向の頂点に-1を掛けてください。 (私の "HelloWorldの" アプリケーションのいずれかから=)ベクトル演算に

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

ているいくつかの注意):左右の機銃掃射のために、何かこの使用

  • ノーマライズ(VEC)を、は、長さが1に等しいvecを返します。これは必要な長さにvecを「切り詰める」
  • cross_product(vec_a、vec_b);はvec_cを返します。vec_cはvec_aとvec_bに直行します(詳細はthis articleを参照)。

cross_product()の私のバージョンのようになります。私はこれまでで一番簡単な方法は、peasycamを使用することだと思う

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 
} 

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

1

ライブラリ

http://mrfeinberg.com/peasycam/

このライブラリますカメラとその現在の状態に関する情報に簡単にアクセスできるさまざまなゲッターだけでなく、さまざまな方法で拘束することができるマウスを使用してカメラにアクセスできます。

関連する問題