2012-04-17 102 views
3

四角形のウィンドウでポリゴンを描画しています。たとえばフルスクリーンでウィンドウのサイズを変更すると、縦横比が乱されます。リファレンスから、私はアスペクト比を保存する1つの方法を見つけました。ここでは、コードは次のとおりです。OpenGL - ウィンドウのサイズ変更時にアスペクト比を維持する

ここ
void reshape (int width, int height) { 
    float cx, halfWidth = width*0.5f; 
    float aspect = (float)width/(float)height; 
    glViewport (0, 0, (GLsizei) width, (GLsizei) height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glFrustum(cx-halfWidth*aspect, cx+halfWidth*aspect, bottom, top, zNear, zFar); 
    glMatrixMode (GL_MODELVIEW); 
} 

、CXは、誰かが私はこれを計算することができる方法を説明してもらえば、私は要求XのzNear面のアイスペースセンターです。私はこれがglFrustum()の最初の2つの引数の平均であるべきだと考えています。私は正しい?どんな助けでも大歓迎です。

+0

あなたは何をしたいかによって決まります。アスペクトを保持しない現在の投影行列は何ですか?あなたはGLUTを使用していますか? –

+0

generic ... glFrustum(left、right、bottom、top、near、far)としましょう。 GLUTを使っています。 – Iceman

答えて

6

アスペクト比が変更されたときに視野や画角を維持することが望ましいように見えます。それを行う方法の詳細については、OpenGL FAQの9.085 How can I make a call to glFrustum() that matches my call to gluPerspective()?セクションを参照してください。短いバージョンは次のとおりです:

fov*0.5 = arctan ((top-bottom)*0.5/near) 
top = tan(fov*0.5) * near 
bottom = -top 
left = aspect * bottom 
right = aspect * top 

リンクを参照してください。

+0

ええ、これらの計算と回答が確認されました。どうもありがとう! – Iceman

1

最初の2つの引数は、目の空間の左右のクリッピングプレーンのX座標です。オフ軸のトリックを実行している場合(たとえば、複数のモニタにまたがって非中心投影を表示する場合を除く)は、左右が同じ大きさと反対の符号を持つ必要があります。あなたのcx変数はゼロになります。

glFrustrumの理解に問題がある場合は、代わりにgluPerspectiveを使用することができます。これは、やや単純なインターフェイスを備えています。

+0

答えをありがとう。私はアスペクト比で左、右、上と下のスケールがどのようになるのか、つまりそれが1でないときにどのように作業するのかを考えています。 – Iceman

+0

(左下)/(上端)** **縦横比を定義します –

関連する問題