2013-05-19 49 views
0

有人可以帮助我理解这段代码的逻辑吗?它不是随便画一个圆圈。基于Android OpenGL ES Line的圈子

#include <math.h> 
... 
void drawCircle(){ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glUseProgram(programObject); 
    const float DEG2RAD = 3.14159f/180.0f; 
    int totalVertices = 360; 
    const float radsPerLine = (360.f/totalVertices) * DEG2RAD; 
    float lineVertices[(totalVertices * 4)]; 
    int i; 
    int ii = 0; 
    float rad = 0.8f; 
    for (i = 0; i < (totalVertices); i++) { 
    float degInRad = radsPerLine * i; 
    float cosine = cos(degInRad); 
    float sine = sin(degInRad); 
    lineVertices[ii++] = 0.0f; 
    lineVertices[ii++] = 0.0f; 
    lineVertices[ii++] = cosine * rad; 
    lineVertices[ii++] = sine * rad; 
    } 
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, lineVertices); 
    glEnableVertexAttribArray(0); 
    glDrawArrays(GL_LINES, 0, totalVertices * 4); 
} 

分形图案出现在很高的数字(如360)。另一个奇怪的事情是有些线条比其他奇怪的线条看起来更高。

+1

您将要覆盖在每次迭代先前计算的数据相乘。你应该增加2我 – Trax

+0

谢谢,有一点帮助,但看看我准备写更新。 – Jackie

+1

你的新代码仍然是错误的,后缀++运算符在发射一个值后发生,这意味着lineVertices [ii ++] = sin(degInRad)* 0.8f;正在覆盖以前的数据。将其改为++ ii。 – Trax

回答

0

这结束了工作......

glClear(GL_COLOR_BUFFER_BIT); 
glUseProgram(programObject); 
const float DEG2RAD = 3.14159f/180.0f; 
int totalVertices = 360*12; 
const float radsPerLine = (180.f/totalVertices) * DEG2RAD; 
float lineVertices[(totalVertices * 4)]; 
int i; 
int ii = 0; 
float rad = 0.5f; 
for (i = 0; i < (totalVertices); i++) { 
    float degInRad = radsPerLine * i; 
    float cosine = cos(degInRad); 
    float sine = sin(degInRad); 
    GLfloat x1 = -1 * (cosine * rad); 
    GLfloat y1 = -1 * (sine * rad); 
    GLfloat x2 = (cosine * rad); 
    GLfloat y2 = (sine * rad); 
    lineVertices[ii++] = x1; 
    lineVertices[ii++] = y1; 
    lineVertices[ii++] = x2; 
    lineVertices[ii++] = y2; 
} 
int size = sizeof(lineVertices)/sizeof(lineVertices[0]); 
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, lineVertices); 
glEnableVertexAttribArray(0); 
glDrawArrays(GL_LINES, 0, totalVertices * 2); 

有迹象表明,解决了这个问题,两个主要的事情...

  1. 我用180代替360,只是乘以-1值,这使我可以在两个方向上使用1行,而不是每个方向上使用2行。
  2. 调用glDrawArrays预计向量的数量不得分,所以我不得不由2而不是4
1

可能是比较有用的,以便能够指定多少段必须近似圆:

void fillWithCircleData(GLfloat *lineVertices, GLint numLines, GLfloat radius){ 
    const GLfloat DEG2RAD = 3.14159/180; 
    const GLfloat radsPerLine = (360.f/(numLines)*DEG2RAD; 
    GLint i; 

    for (i=0; i < numLines; ++i) 
    { 
     GLfloat rads = radsPerLine*i; 
     lineVertices[i*2] = cos(rads)*radius;  
     lineVertices[i*2+1] = sin(rads)*radius; 
    } 
} 

要知道,这将产生numLines顶点,但作为最后的顶点也不会重复上次顶点与第一个相同(2PI == 0)。这意味着你的元素数组必须提供numLines+1索引,作为最后一个索引与第一个索引相同。这样可以避免两次处理同一个顶点。您将需要将您的基元从GL_LINE更改为GL_LINES_STRIP

编辑:如果你不想指定一个元素数组,就产生最后一点创建一个数组来保存numLines + 1并改变上述循环去,直到i < numLines+1

注意:代码未经测试。

+0

感谢您的尝试,但这不起作用。 – Jackie