在OpenGL ES 1.1中绘制一个扇形切割的圆圈

时间:2011-06-16 20:06:41

标签: opengl-es

我正在尝试使用OpenGL ES 1.1绘制以下形状。好吧,我被卡住了,我真的不知道如何去做。

我的游戏目前使用Android的Canvas API,它不是硬件加速的,所以我用OpenGL ES重写它。 Canvas类有一个名为drawArc的方法,它可以非常容易地绘制这个形状; Canvas.drawArc

有关使用OpenGL ES做同样的建议/提示吗?

enter image description here

感谢您的阅读。

3 个答案:

答案 0 :(得分:5)

void gltDrawArc(unsigned int const segments, float angle_start, float angle_stop)
{
    int i;
    float const angle_step = (angle_stop - angle_start)/segments;

    GLfloat *arc_vertices;
    arc_vertices = malloc(2*sizeof(GLfloat) * (segments+2));

    arc_vertices[0] = arc_vertices[1] = 0.

    for(i=0; i<segments+1; i++) {
        arc_vertices[2 + 2*i    ] = cos(angle_start + i*angle_step);
        arc_vertices[2 + 2*i + 1] = sin(angle_start + i*angle_step);
    }
    glVertexPointer(2, GL_FLOAT, 0, arc_vertices);
    glEnableClientState(GL_VERTEX_ARRAY);
    glDrawArrays(GL_TRIANGLE_FAN, 0, segments+2);
    free(arc_vertices);
}

答案 1 :(得分:1)

如何以离散角度对圆进行采样并绘制GL_TRIANGLE_FAN

编辑:这样的事情只会在2D中围绕原点绘制单位圆的一个扇区:

glBegin(GL_TRIANGLE_FAN);
    glVertex2f(0.0f, 0.0f);
    for(angle=startAngle; angle<=endAngle; ++angle)
        glVertex2f(cos(angle), sin(angle));
glEnd();

实际上更多地将其视为伪代码,因为sincos通常适用于弧度,我使用度数,但你应该明白这一点。

答案 2 :(得分:0)

我是编程的新手,所以我相信可能有更好的方法来做到这一点。但我正在关注Android开发者网站http://developer.android.com/resources/tutorials/opengl/opengl-es10.html上的OpenGL ES 1.0教程,该教程将引导您绘制一个绿色三角形。您可以点击该链接,您将看到我在那里使用的大部分代码。我想在三角形上画一个圆圈。我添加的代码基于datenwolf发布的上述示例。并在下面的片段中显示:

public class HelloOpenGLES10Renderer implements GLSurfaceView.Renderer {

    // the number small triangles used to make a circle
    public int segments = 100;
    public float mAngle;
    private FloatBuffer triangleVB;
            // array to hold the FloatBuffer for the small triangles
    private FloatBuffer [] segmentsArray = new FloatBuffer[segments];


    private void initShapes(){

                   .
                   .
                   .

        // stuff to draw holes in the board      
        int i = 0;
        float angle_start = 0.0f;
        float angle_stop = 2.0f * (float) java.lang.Math.PI;
        float angle_step = (angle_stop - angle_start)/segments;

        for(i=0; i<segments; i++) {
            float[] holeCoords;
            FloatBuffer holeVB;
            holeCoords = new float [ 9 ];
            // initialize vertex Buffer for triangle  
            // (# of coordinate values * 4 bytes per float)
            ByteBuffer vbb2 = ByteBuffer.allocateDirect(holeCoords.length * 4); 
            vbb2.order(ByteOrder.nativeOrder());// use the device hardware's native byte order
            holeVB = vbb2.asFloatBuffer();  // create a floating point buffer from the ByteBuffer

            float x1 = 0.05f * (float) java.lang.Math.cos(angle_start + i*angle_step);
            float y1 = 0.05f * (float) java.lang.Math.sin(angle_start + i*angle_step);
            float z1 = 0.1f;
            float x2 = 0.05f * (float) java.lang.Math.cos(angle_start + i+1*angle_step);
            float y2 = 0.05f * (float) java.lang.Math.sin(angle_start + i+1*angle_step);
            float z2 = 0.1f;
            holeCoords[0] = 0.0f;
            holeCoords[1] = 0.0f;
            holeCoords[2] = 0.1f;
            holeCoords[3] = x1;
            holeCoords[4] = y1;
            holeCoords[5] = z1;
            holeCoords[6] = x2;
            holeCoords[7] = y2;
            holeCoords[8] = z2;
            holeVB.put(holeCoords);    // add the coordinates to the FloatBuffer
            holeVB.position(0);            // set the buffer to read the first coordinate
            segmentsArray[i] = holeVB;
        }            
    }

    .
    .
    .


public void onDrawFrame(GL10 gl) {

        .
        .
        .
        // Draw hole
        gl.glColor4f( 1.0f - 0.63671875f, 1.0f - 0.76953125f, 1.0f - 0.22265625f, 0.0f);
        for ( int i=0; i<segments; i++ ) {
            gl.glVertexPointer(3, GL10.GL_FLOAT, 0, segmentsArray[i]);
            gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
        }

}

Here's a screen shot in the emulator