2011-08-09 87 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