2011-01-27 12 views
2

次のコードを使ってOpenGL-esで円を描こうとしています。それは円の周りにいくつかの点を作成します。頂点配列の値をプリントアウトすると、円の周りにポイントを形成することがわかります。OpenGL-esで円を描くと正方形になります

// Create verticies for a circle 

points=40; 
vertices = new float[(points+1)*3]; 

//CENTER OF CIRCLE 
vertices[0]=0.0f; 
vertices[1]=0.0f; 
vertices[2]=0.0f; 

for (int i = 3; i<(points+1)*3; i+=3){ 
    double rad = deg2rad(i*360/points); 
    vertices[i] = (float) (Math.cos(rad)); 
    vertices[i+1] = (float) (Math.sin(rad)); 
    vertices[i+2] = 0; 
} 

// vertexBuffer is filled with verticies 

そして、私の描画機能でのOpenGLの呼び出し:

// IN MY DRAWING FUNCTION: 
gl.glPushMatrix(); 
gl.glTranslatef(x, y, 0); 
gl.glScalef(size, size, 1.0f); 
gl.glColor4f(1.0f,1.0f,1.0f, 1.0f); 
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, points/2); 
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
gl.glPopMatrix(); 

私は画面に描かれた円、しか四角を取得することはありませんが。私は非常に混乱しています、どんな助けも高く評価されています:)

+1

これをデバッグする方法は、ループ内の反復回数を減らし(1回の反復であっても)、何が起こるのか、反復回数が増えるにつれてどうなるのかを確認することが望ましいと考えるべきです。 – fabspro

答えて

2

間違っているものはradの計算です。 iカウンタは各反復に3つインクリメントなっているので、あなたはpoints*3ことによってそれを分割する必要が

double rad = deg2rad(i*360/(points*3)); 

:ような何かにそれを修正してみてください。あなたは、各反復でradの値をプリントアウトして、0〜2 * PI

EDITをインクリメント値を取得していることを確認する必要があります:あなたはまた、円の方向を変更する必要があります(私はありません私の頭の上に確かに)。上記は何をレンダリングしない場合は、それを逆にしてみてください:あなたが唯一のglDrawArraysコールに半分のポイントをレンダリングしているよう

double rad = deg2rad(360.0 - i*360/(points*3)); 

また、それが見えます。

+0

良い点はありますが、なぜそれが四角形を描いているのか説明できません:( – stealthcopter

+0

*これらの変更後もまだ*四角形を描いていますか?それは完璧な四角形やジャギーのエッジですか? –

2

//...vertex and index buffers... 

int VERTICES=180; // more than needed // changed variable name 
float coords[] = new float[VERTICES * 3]; 
float theta = 0; 

for (int i = 0; i < VERTICES * 3; i += 3) { 
    coords[i + 0] = (float) Math.cos(theta); 
    coords[i + 1] = (float) Math.sin(theta); 
    coords[i + 2] = 0; 
    vertexBuffer.put(coords[i + 0]); 
    vertexBuffer.put(coords[i + 1]); 
    vertexBuffer.put(coords[i + 2]); 
    theta += Math.PI/90; 
} 

// ....set buffer positions to zero... 

protected void draw(GL10 gl) { 
    gl.glColor4f(0, 0, 1, 0.5f); 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
    gl.glDrawElements(GL10.GL_TRIANGLE_FAN, VERTICES, 
    GL10.GL_UNSIGNED_SHORT, indexBuffer); 
    } 
} 

Easy breezy。

+0

indexBufferについて –

関連する問題