Рисование круга в Android с помощью opengl-es приводит к квадрату - PullRequest
2 голосов
/ 27 января 2011

Я пытаюсь нарисовать круг в 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();

Однако я никогда не рисую круг на экране, только квадрат. Я очень смущен, любая помощь ценится:)

Ответы [ 2 ]

2 голосов
/ 28 апреля 2011

//...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 &lt 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);
    }
}

Легкий ветерок.

2 голосов
/ 27 января 2011

Одна вещь, которая выглядит неправильно, это вычисление rad. Попробуйте изменить его на что-то вроде:

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

Вам нужно разделить его на points*3, потому что счетчик i увеличивается на 3 на каждой итерации. Вы должны распечатать значение rad на каждой итерации и убедиться, что вы получаете значения с шагом от 0 до 2 * PI

РЕДАКТИРОВАТЬ: вам также может понадобиться изменить направление круга (я не уверен в верхней части моей головы). но если приведенное выше ничего не отображает, попробуйте поменять его местами:

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

Кроме того, похоже, что вы рендерили только половину точек в вызове glDrawArrays.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...