2011-08-09 20 views
0

OpenGL ESを使って単純な円を描こうとしています。問題は、円が垂直に伸びていることです。それは円よりも楕円のように見えます。誰かが物事がうまくいかないことを指摘できますか?OpenGL ESで描画を伸ばす - iOS

これを修正するためにglViewPortで遊んだが成功しなかった。 StackOverflowの上ここに提案し、他の誰かとして、私はまた、代わりに単位行列の異なる行列をロードしようと、それはあまりにも動作しません...

ここdrawFrameのコードです:

- (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/whyopengles-stretch-my-3d-modelに持っているものと組み合わせて、それが私を助けました。 glViewPort/glOrthofを動作させることはできませんでしたが、値を持つ新しい行列を作成してロードしました: GLfloat aspectRatio = self.view.bounds.size.height/self.view.bounds.size.width ;フロートM [16] = { アスペクト比、0、0、0、 0、1、0、0、 0、0、1、0、 0、0、0、1} 。 glMatrixMode(GL_PROJECTION); glLoadMatrixf(m);それは狂っている - >それは動作しますが、私はどのように理解できません。 – Ravi

関連する問題