OpenGL で視線を中心に回転するときの変形を防ぐにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/79360

  •  09-06-2019
  •  | 
  •  

質問

XZ 平面に楕円を描き、視点を Y 軸上に少し上にして Z 軸に戻し、楕円の中心を 45 度の角度から見て、gluPerspective() を使用して視錐台を設定しました。 。

ellipse

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

rotated ellipse

この変形を防ぐ (または少なくとも考慮する) には、視線を中心とした回転によって認識される楕円の長軸が維持される (この場合、楕円がビューポートを超えてしまう) には何をする必要がありますか?

役に立ちましたか?

解決

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

他のヒント

OpenGL 仕様によると:

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

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

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

gluPerspective 呼び出しのアスペクト パラメータを微調整する必要があるようです。見る マンページ. 。ウィンドウが物理的に正方形であれば、アスペクト比は 1 になり、問題は解決します。ただし、ウィンドウは長方形であるため、表示錐台は非正方形である必要があります。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top