1

OpenGL を使用してアプリケーションを実装しようとしていますが、基本的なカメラの動き (軌道、パン、ズーム) を実装する必要があります。

もう少しわかりやすくするために、Maya のようなカメラ コントロールが必要です。アプリの性質上、昔ながらの「シーンを変形してカメラが動いているように見せる」が使えません。だから私は、変換行列、gluLookAt などを使用して立ち往生しています。

ズームは非常に簡単です。目のベクトル (gluLookAt) の深度コンポーネントにフックするだけで済みますが、他の 2 つのパンと軌道を実装する方法がよくわかりません。誰もこれをやったことがありますか?

4

2 に答える 2

3

古き良き「カメラが動くようにシーンを変形する」は使えない

OpenGLにはカメラがありません。したがって、これを正確に実行することになります。

ズームは非常に簡単です。目のベクトル(gluLookAt)の深度コンポーネントにフックするだけです。

これはズームではなく、ドリーです。ズームとは、投影ボリュームの制限、つまり正投影の範囲、または遠近法の視野を変更することを意味します。

于 2012-05-15T22:40:32.857 に答える
1

あなたがすでに遭遇したgluLookAtはあなたの解決策です。最初の3つの引数はカメラの位置(x、y、z)、次の3つはカメラの中心(カメラが見ているポイント)、最後の3つは上向きのベクトル(通常は(0,1,0))であり、カメラのyz平面。*

非常に簡単です。glLoadIdentity();を呼び出し、gluLookAt(...)を呼び出してから、通常どおりにシーンを描画します。個人的には、私は常にCPUですべての計算を自分で行います。ポイントを周回することは非常に一般的な作業であることがわかりました。私のテンプレートC/C ++コードは球面座標を使用しており、次のようになります。

double camera_center[3] = {0.0,0.0,0.0};
double camera_radius = 4.0;
double camera_rot[2] = {0.0,0.0};
double camera_pos[3] = {
    camera_center[0] + camera_radius*cos(radians(camera_rot[0]))*cos(radians(camera_rot[1])),
    camera_center[1] + camera_radius*                            sin(radians(camera_rot[1])),
    camera_center[2] + camera_radius*sin(radians(camera_rot[0]))*cos(radians(camera_rot[1]))
};
gluLookAt(
       camera_pos[0],   camera_pos[1],   camera_pos[2],
    camera_center[0],camera_center[1],camera_center[2],
    0,1,0
);

明らかに、カメラの「ズーム」を変更するcamera_radius、軸を中心としたカメラの回転を変更するcamera_rot、またはカメラが周回するポイントを変更するcamera_centerを調整できます。

*他のトリッキーな点は、それが何を意味するのかを正確に学ぶことだけです。明確にするために、インターネットが不足しているため:

  • 位置は、カメラの(x、y、z)位置です。かなり簡単です。
  • 中心は、カメラが焦点を合わせている(x、y、z)ポイントです。基本的に、位置から中心までの架空の光線に沿って見ています。
  • これで、カメラはこのベクトルの周りの任意の方向を向いている可能性があります(たとえば、逆さまになっている可能性がありますが、同じ方向を向いている可能性があります)。上向きのベクトルはベクトルであり、位置ではありません。それは、位置から中心までのその想像上のベクトルとともに、平面を形成します。これはカメラのyz平面です。
于 2012-05-19T08:08:16.953 に答える