2008-09-17 2 views
4

私はXZ平面に楕円を描き、Y軸上に少し上を向いてZに戻って、楕円の中心を45度の角度から見てgluPerspective()を使ってmy欲求不満を見る。OpenGLで視線を回転させたときの変形を防ぐにはどうすればよいですか?

ellipse

非回転、楕円の長軸は、私のビューポートの幅に及びます。視線を90度回転させると、楕円の長軸がビューポートの高さに広がり、楕円が変形します(この場合は偏心して表示されなくなります)。

rotated ellipse

、この場合には(私は(それのためか、少なくともアカウント)は、この変形を防止するために行うには何が必要ですので、視線周りの回転は、楕円の知覚長径を維持しますそれがビューポートを越えてしまいます)。

答えて

5

gluPerspective()を呼び出すと、アスペクトとして1.0を使用しているようです。幅と高さを使用する必要があります。たとえば、ビューポートが640x480の場合、aspect引数として1.33333を使用します。 OpenGLの仕様によると

+0

ああ、私は私のglutReshapeFunc()コールバックで縦横比を取得するためにウィンドウの幅を高さで分割していましたが、最初に浮動小数点型に幅をキャストしていませんでした。 Bada-bing、Bada-boom、丸め誤差。ありがとう。 – rampion

3

void gluPerspective(GLdouble fovy, 
        GLdouble aspect, 
        GLdouble zNear, 
        GLdouble zFar) 

アスペクトは、あなたのウィンドウの幅と高さの関数でなければなりません。具体的には幅を高さで割った値です(ただし、除算はゼロに注意してください)。

おそらく、あなたのウィンドウが正方形でない限り、正確ではないアスペクトとして1を使用しています。

1

gluPerspectiveコールのaspectパラメータが必要なように見えます。 The Man Pageを参照してください。あなたのウィンドウが物理的に正方形の場合、アスペクト比は1になり、問題はなくなります。しかし、あなたのウィンドウは長方形なので、視錐台は非正方形である必要があります。

アスペクト比をwindow_width/window_heightに設定すると、楕円が正しく表示されます。ウィンドウのサイズが変更されるたびにこれを更新する必要があることに注意してください。 GLUTを使用している場合は、glutReshapeFuncを設定し、そこに投影行列を再計算します。

関連する問題