2

gluLookAt一緒glFrustumにレンダリングされた画像を歪ませているのではないかと思います。

シーンのレンダリング方法は次のとおりです。

ここに画像の説明を入力

そして、それをレンダリングしたコードがこれです。

InitCamera一度呼び出され、今理解しているように、原点の2単位上、3単位前の位置から原点に向かって見たかのように、マトリックスを設定する必要があります。またglFrustum、パースペクティブを作成するためにも使用されます`.

void InitCamera() {

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

  gluLookAt (
    0,  2  ,   3, 
    0,  0  ,   0,
    0,  1  , - 0 
  );

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glFrustum   (-  1,     1, 
               -  1,     1, 
                  1,1000.0);

  glMatrixMode(GL_MODELVIEW);
}

次にTheScene、実際に絵を描くのは次のとおりです。

void TheScene() {

  glClear(
    GL_COLOR_BUFFER_BIT | 
    GL_DEPTH_BUFFER_BIT    
  );

  glMatrixMode(GL_MODELVIEW);

  // Draw red circle around origin and radius 2 units:    
  glColor3d(1,0,0);
  glBegin(GL_LINE_LOOP);
  for (double i = 0; i<=2 * M_PI; i+=M_PI / 20.0) {
    glVertex3d(std::sin(i) * 2.0, 0, std::cos(i) * 2.0);
  }
  glEnd();

  // draw green sphere at origin:
  glColor3d(0,1,0);
  glutSolidSphere(0.2,128, 128);


  // draw pink sphere a bit away    
  glPushMatrix();
    glColor3d(1,0,1);
    glTranslated(8, 3, -10);
    glutSolidSphere(0.8, 128, 128);
  glPopMatrix();

  SwapBuffers(hDC_opengl);
}

赤いボールは、原点とその周囲の赤い円の中心に描画する必要があります。しかし、それを見ると奇妙な感じがし、緑色のボールがまったく中心にないような印象を受けます.

また、ピンクのボールは、楕円としてではなく、完全な円として描画する必要があります。

それで、私は間違っていますか、そして絵は正しく描かれていますか、それとも何か間違った設定をしていますか?

4

3 に答える 3

5

あなたの期待は単に間違っています

  • 3D 円の透視投影 (円が完全に見える場合) は楕円ですが、円の中心の投影は一般に楕円の中心ではありません。 中心の遠近歪み

  • 球の透視投影の輪郭は、一般に円錐曲線です。つまり、3D での視点、投影面、および球の位置に応じて、円、楕円、放物線、または双曲線になります。その理由は、球の輪郭は、視点から始まり、投影面と交差する球に接する円錐として想像できるからです。

もちろん、完全に垂直なカメラで円を見ている場合、円の中心は円投影の中心に投影されます。同様に、カメラが正確に球体を指している場合、球体の輪郭は円になりますが、これらは特殊なケースであり、一般的なケースではありません。

中心間のこれらの違いは、強力な遠近法 (広角) カメラでより顕著になります。代わりに、平行投影では、この明らかな歪みはありません (つまり、円の中心の投影は、円の投影の中心です)。

于 2011-02-06T22:19:41.933 に答える
1

遠近法は正しいですが、歪んで見えるだけです。gluLookAt でこれを試して、もう少し遊んでみてください。

gluLookAt (
    0,  2  ,   10, 
    0,  0  ,   0,
    0,  1  ,   0 
  );

私が試した方法は、マウスで位置とビューの方向を調整できるようにセットアップして、リアルタイムのモーションを取得することでした。私が動き回ると、あなたのシーンはきれいに見えます。必要に応じて、完全なコードを入手できるので、それを行うこともできますが、ここで回答に押し込みたいとは少し異なります.

于 2011-02-06T21:54:48.140 に答える
1

画面の中央にある緑色の球体とその周りに完全な円が表示されるようにするには、カメラの位置を次のように変更する必要があります。

gluLookAt (
  0, 3, 0, 
  0, 0, 0,
  0, 0, 1 
);

ただし、紫色の球体の歪みの原因は不明です。

于 2011-02-06T21:52:06.053 に答える