2011-08-09 85 views
0

我正在嘗試使用OpenGL ES繪製一個簡單的圓。問題在於圓形是垂直拉伸的。它看起來更像是一個橢圓而不是圓。有人能指出事情出錯的地方嗎?在OpenGL ES中拉伸的繪圖 - iOS

我玩glViewPort來解決這個問題,但沒有成功。至於別人這裏建議#2,我也嘗試加載不同的矩陣,而不是單位矩陣,並且不工作太...

這裏的並條機的代碼:

- (void)drawFrame 
{ 
    [(EAGLView *)self.view setFramebuffer]; 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity();  

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 

    GLfloat vertices[720]; 
    for (int i = 0; i < 720; i += 2) 
    { 
     vertices[i] = (cos(degreesToRadians(i)) * 1); 
     vertices[i+1] = (sin(degreesToRadians(i)) * 1); 
    } 

    glVertexPointer(2, GL_FLOAT, 0, vertices); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glColor4f(1.0f, 0.0f, 0.0f, 1.0f); 
    glDrawArrays(GL_TRIANGLE_FAN, 0, 360); 

    [(EAGLView *)self.view presentFramebuffer]; 
} 

回答

2

你的代碼正在展示的將會在世界座標中畫出一個完美的圓圈。你需要考慮的是這些世界座標如何變換成窗口座標,即像素。

如果glViewport設置爲始終與窗口匹配,那麼窗口的縱橫比將決定您使用您顯示的代碼示例所看到的內容。如果窗戶是方形的,它將起作用,即你會看到一個完美的圓形。如果窗口高於寬度,則該圓形將被垂直拉伸。

要保存完美的圓形,您可以使用投影矩陣,爲您提供與視口/窗口具有相同高寬比的觀看音量。我注意到在你第一次編輯之前,你在那裏打了一個glOrthof的電話。設置縱橫比以匹配那裏,那將爲你做這項工作。如果您想要透視投影而不是正投影,請使用glFrustum

+0

謝謝。我將你的解決方案與我在http://stackoverflow.com/questions/1067833/why-opengles-stretch-my-3d-model上獲得的解決方案相結合,它幫助了我。雖然我無法得到glViewPort/glOrthof的工作,但我創建了一個帶有值的新矩陣(如下所示)並加載它: GLfloat aspectRatio = self.view.bounds.size.height/self.view.bounds.size.width ;浮子米[16] = { 的aspectRatio,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1} ; glMatrixMode(GL_PROJECTION); glLoadMatrixf(m);這太瘋狂了 - >它有用,但我不明白。 – Ravi