索引opengl需要解释

时间:2016-12-12 12:19:49

标签: android opengl-es

我正在研究android中的一个简单的opengl程序。 我不会画一个填充圆圈并使用它和顶点做某事。 问题只出在抽奖部分,因为我没有考虑如何使用指数。

要获得圆的坐标,我使用一个简单的数学算法,使用极坐标获取坐标

for(int i=0;i<360;i++)
        {
            buffer[i]=(float)Math.cos(Math.toRadians((double)i))*0.5f;
            buffer[++i]=(float)Math.sin(Math.toRadians((double)i))*0.5f*coaf;
            buffer[++i]=0f;
            // Log.i("",""+buffer[i-2]+" "+buffer[i-1]+" "+buffer[i]);
        }

这里没有问题。问题是我想绘制一个实心圆,为此我决定绘制从一个点到相反方向x轴的线。

所以创建索引我使用了这段代码

short count=0;

        for(int i=0;i<360;i++)
        {
            indices[i++]=count;
            indices[i]=(short)(360-count);
            count++;
        }

当我绘制所有内容时,结果是enter image description here

现在任何人都可以告诉我为什么线条从一个点到中心而不是一个指向对称的指针?

1 个答案:

答案 0 :(得分:2)

你的价值观一团糟。如前所述,由于迭代器增量,您只生成120个顶点而不是360,但即使您这样做,也会使用360-count生成360作为第一次迭代,意味着第361个顶点。

您确实需要改进代码以更好地跟踪正在发生的事情。使用一些常量来确保值是正确的:

int tessellation = 360; // will have 360 vertices
int dimensionCount = 3; // x, y, z
double angleFraction = 360.0 / (double)tessellation; // How many degrees between 2 points
for(int i=0; i<tessellation; i++) {
    double angle = Math.toRadians((double)i*angleFraction);
    buffer[i*dimensionCount + 0] = (float)Math.cos(angle)*0.5f;
    buffer[i*dimensionCount + 1] = (float)Math.sin(angle)*0.5f*coaf;
    buffer[i*dimensionCount + 2] = 0f;
}

然后你的第二部分是完全错误的。线路到达中心的原因更加幸运,您传递的数据设置为零。迭代中的第二个顶点始终为零,因为它会溢出。但即使不是,方程式也是错误的(或者我不确定你要做什么)。你的代码看起来应该产生的是120条平行线,这可能是预期的结果。所以让我们看看那个:

int limit = tessellation/2; // We need only half of the pairs, the other half will just repeat the same lines
for(short i=0; i<limit; i++) {
    indices[2*i + 0] = i;
    indices[2*i + 1] = (short)(tessellation-i-1); // Note there is always "-1" when backwards enumerating
}

或者通过中心使用对称性:

short limit = tessellation/2; // We need only half of the pairs, the other half will just repeat the same lines
for(short i=0; i<limit; i++) {
    indices[2*i + 0] = i;
    indices[2*i + 1] = (short)(limit+i); // basically saying +180 degrees
}