2012-04-17 72 views
3

我正在一個方形窗口中繪製一個多邊形。當我調整窗口的大小時,例如通過全屏顯示,縱橫比會受到干擾。從參考資料中,我發現了一種保留寬高比的方法。下面是代碼: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()的前兩個參數的平均值。我對嗎?任何幫助將不勝感激。

+0

取決於您要存檔的內容。什麼是當前的投影矩陣不保留方面?你使用GLUT? – 2012-04-17 04:17:06

+0

讓我們說generic..glFrustum(左,右,下,上,近,遠)。是的,使用GLUT。 – Iceman 2012-04-17 04:28:27

回答

6

它看起來像你想要做的是當高寬比變化時保持視野或視角。有關如何執行此操作的詳細信息,請參閱OpenGL常見問題的標題爲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 2012-04-17 04:54:22

1

前兩個參數是眼睛空間左右剪切平面的X座標。除非你正在做離軸技巧(例如,要在多個顯示器上顯示未經預測的投影),否則左側和右側應具有相同的幅度和相反的符號。這會使你的cx變量爲零。

如果您在理解glFrustrum時遇到困難,您可以始終使用gluPerspective代替,它具有簡化的界面。

+0

感謝您的回答。我正在研究如何在縱橫比的情況下左,右,上和下縮放比例,即當它不是一致時。 – Iceman 2012-04-17 04:39:12

+0

(左右)/(上下)**定義**長寬比 – 2012-04-17 04:41:32

相關問題