2013-05-19 38 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