帮助用opengl绘制一个楔子

时间:2011-08-18 12:31:07

标签: opengl-es

我正在尝试做一些基本的opengl编程来开始基础知识。

我有一个绘图功能试图绘制一个圆的楔形。出现问题,因为它实际上只是画了一个圆圈。

我仍然只是想在这里掌握opengl的基础知识。这是我到目前为止所拥有的。

- (void)drawView

{
    [EAGLContext setCurrentContext:context];

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glViewport(0, 0, 60, 60);


    int i;
    float angle_start=90;
    float angle_stop=180;
    int segments=360;
    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.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);
    glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
    glDrawArrays(GL_TRIANGLE_FAN, 0, segments+2);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
    free(arc_vertices);





}

3 个答案:

答案 0 :(得分:1)

sin()cos()radians作为输入:

float angle_start=90;
float angle_stop=180;
int segments=360;
float const angle_step = (angle_stop - angle_start)/segments;

GLfloat* verts = (GLfloat*)malloc(2*sizeof(GLfloat) * (segments+2));
unsigned int pos = 0;
verts[pos++] = 0;
verts[pos++] = 0;  

float radius = 10;
for( unsigned int i = 0; i < segments; ++i )
{
    float rads = (angle_start + i*angle_step) * (3.14159 / 180);

    verts[pos++] = ( cos( rads ) * radius );
    verts[pos++] = ( sin( rads ) * radius );
}

glVertexPointer(2, GL_FLOAT, 0, verts);
glEnableClientState(GL_VERTEX_ARRAY);
glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
glDrawArrays(GL_TRIANGLE_FAN, 0, segments+1);
glDisableClientState(GL_VERTEX_ARRAY);

答案 1 :(得分:0)

我看错了。您可以访问顶点[i]和顶点[i + 1],但我总是增加1。

尝试替换

  

GLfloat顶点[720];

  

GLfloat顶点[2 * 720];

并替换

  

顶点[I] = P1;   顶点[I + 1] = P2;

通过

  

顶点[2 * I] = P1;   顶点[2 * I + 1] = P2;

答案 2 :(得分:0)

这有效。

抗锯齿是可怕的,但它的工作原理。 [信用1

-(void)drawcircelofSlice2
{
    amt+=20;

    if(amt>360.0)
    {
        amt=0;
    }

    [EAGLContext setCurrentContext:context];

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glViewport(20, 20, 50,50);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrthof(30.0f, 30.0f, -1.5f, 1.5f, -1.0f, 1.0f);
    glMatrixMode(GL_MODELVIEW);

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);


    float x=0;
    float y=0;
    //float radius=20;
    float lowAngle=0;
    float highAngle=(amt/360) *360;
   // float highAngle=360;

    float numcirclePts=360;

    lowAngle=DEGREES_TO_RADIANS(lowAngle);
    highAngle=DEGREES_TO_RADIANS(highAngle);

    float res=numcirclePts;

    float angle=lowAngle;
    float anglerange=highAngle-lowAngle;
    float angleAdder=anglerange/ res;

    int k=0;

    GLfloat verts[720];

    for (int i = 0; i < numcirclePts; i++){
        verts[k] = x + cos(angle) ;
        verts[k+1] = y - sin(angle) ;
        angle += angleAdder;
        k+=2;
    }





    verts[0] = x;  
    verts[1] = y;  
    k = 2;  
    for (int i = 2; i < numcirclePts; i++){  
        verts[k] = verts[k];  
        verts[k+1] = verts[k+1];          
        k+=2;  
    }  





    glVertexPointer(2, GL_FLOAT, 0, verts);
    glEnableClientState(GL_VERTEX_ARRAY);
    glColor4f(0.0f, 0.0f, 1.0f, 0.0f);
    glDrawArrays(GL_TRIANGLE_FAN, 0, numcirclePts);

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    glDisableClientState(GL_VERTEX_ARRAY);    
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}