どのようなズームレンズのパンニング、回転す。
質問
OpenGLを使用いということがプリミティブ地図のキャンパス。
誰でもできるので説明することができなかったたパンニング、拡大鏡、回転は、通常データエスクローエージェント
例えば、パンやズームレンズではなく調整私のビューポート?私はプロットを描く全てのラインを構成する私の地図としてのユーザーがクリック創調整私のビューポート?
のためのパンなのx/y値のビューポートやズームな増減には私のビューポートより。うための回転?
のための回転、私はアフィン変換のための各座標を表す私のキャンパス地図か?なことに費用がかかることについては、fly onステイタスを中心に地図か?
または、ビューポート左のパン-チルトズーム回転を行うにあotherway?
例えば、こちら リンク だが彼に記述してパンやズームを行うたっては、上記を変更することにより、ビューポートです。
ているのではないだろうか正しいのですか。
解決
これは、シーンを描画する前に(カメラの位置と方向を表す)glTranslate、glRotateの一連のコマンドを適用することによって達成しています。 (技術的には、あなたがシーン全体を回転させている!)
これについていくつかの詳細みかん抽象gluLookAtのようなユーティリティ関数があります。
位置と方向:物事をsimplyifyするには、あなたのカメラを表す2つのベクトルを持っていると仮定します。
gluLookAt位置、目的地、およびベクトルまでを要します。
あなたはベクトルクラスを実装する場合、destinaion = position + direction
はあなたに先のポイントを与える必要があります。
ここでも簡単なものを作るために、あなたが常にあることを、ベクターを想定することができます(0,1,0)
次に、あなたのシーンに何かをレンダリングする前に、単位行列をロードし、呼び出しgluLookAt
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt( source.x, source.y, source.z, destination.x, destination.y, destination.z, 0, 1, 0 );
次に、あなたのオブジェクトを描き始める。
あなたは右または左に少し位置を変更することで、ユーザのスパンを聞かせすることができます。あなたが方向ベクトルを回転させるように持っているように回転はもう少し複雑です。あなたが回転していることはカメラではなく、シーン内のいくつかのオブジェクトであると仮定すると。
あなたが唯一の方向ベクトルを持っている場合は、一つの問題は、あなたがそれを移動しない方法を「前方」、ですか?右と左がどこにあるのでしょうか?
この場合の私のアプローチは、単に「方向」と(0,1,0)の外積を取ることである。
今、あなたは左にとのようなものを使用してカメラを右に移動することができます:
position = position + right * amount; //amount < 0 moves to the left
あなたは「方向ベクトル」を使用して前進することができますが、IMOそれは、水平面への移動を制限した方が良いですので、前方ベクトルを我々は右のベクトルを得たのと同じ方法を取得します:
forward = cross( up, right )
正直に言うと、これは幾分ハックアプローチである。
は適切なアプローチでは、カメラの「姿勢」だけでなく、正方向を表すために、より「洗練された」データ構造を使用することです。あなただけ出始めているので、しかし、それは物事を一度に1歩を踏み出すために良いことだ。
他のヒント
これらの「アクション」のすべてのモデルビュー行列の変換関数を使用して達成することができます。あなたはglTranslatef(パン)、glScalef(ズーム)、glRotatef(回転)についてお読みください。また、あなたが見つけるかもしれない、OpenGLのに関するいくつかの基本的なチュートリアルを読むために必要があるのこのリンクに役立ちます。
一般的にまたは適用でき基準の任意の点3次元空間内のopengl.
与えられ、アメリカ-ポートランド
- 地域->世界の変換
- 世界>カメラ変換
- カメラ->画面に変換(通常のテクノロジー。により使用している場合は、視点や直交)
それぞれの変換は、次の3点を乗じてマトリクス.
きに回転し、カメラでは一般的に世界を変える->カメラ変換を乗じることによって変換マトリクスによるご回転/パン/ズームアフィン変容しています。すべてのお客様はポイントの再描画される各フレームは、新しいマトリクスを返し応用へのポイントは、この回転ができます。