0

有人可以帮我理解这段代码的逻辑吗?它不是画一个圆圈,只是随机的线条。

#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)。另一个奇怪的事情是有些线条看起来比其他线条高,这也很奇怪。

4

2 回答 2

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_LINEGL_LINES_STRIP

编辑:如果您不想指定元素数组,只需生成最后一个点,创建一个数组来保存 numLines+1 并将上述循环更改为 until i < numLines+1

注意:代码未经测试。

于 2013-05-19T16:05:04.240 回答
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。
于 2013-05-19T19:01:19.800 回答