Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ opengl索引绘图问题_C++_Opengl - Fatal编程技术网

C++ opengl索引绘图问题

C++ opengl索引绘图问题,c++,opengl,C++,Opengl,我正在尝试使用opengl(3.0)渲染球体。下面的算法计算顶点和相应的索引。总而言之,它工作得很好,然而,矩阵中似乎有一个小故障,因为我在球体内部得到了一个丑陋的圆锥体 vertices.resize(rings * segments * 3); colors.resize(rings * segments * 3); indices.resize(6 * rings * segments); auto v = vertices.begin(); auto c = colors.begin(

我正在尝试使用opengl(3.0)渲染球体。下面的算法计算顶点和相应的索引。总而言之,它工作得很好,然而,矩阵中似乎有一个小故障,因为我在球体内部得到了一个丑陋的圆锥体

vertices.resize(rings * segments * 3);
colors.resize(rings * segments * 3);
indices.resize(6 * rings * segments);

auto v = vertices.begin();
auto c = colors.begin();
auto i = indices.begin();

auto dTheta = M_PI / (f32)rings;
auto dPhi   = 2 * M_PI / (f32)segments;

for ( u32 ring = 0; ring < rings; ++ring ) {
    auto r0 = radius * sinf(ring * dTheta);
    auto y0 = radius * cosf(ring * dTheta);
    for ( u32 segment = 0; segment < segments; ++segment ) {
        auto x0 = r0 * sinf(segment * dPhi);
        auto z0 = r0 * cosf(segment * dPhi);

        *v++ = x0;  *c++ = color.r;
        *v++ = y0;  *c++ = color.g;
        *v++ = z0;  *c++ = color.b;

        if (ring < rings) {
            *i++ = ( (ring  ) * segments ) + segment;
            *i++ = ( (ring+1) * segments ) + segment;
            *i++ = ( (ring+1) * segments ) + segment + 1;
            *i++ = ( (ring+1) * segments ) + segment + 1;
            *i++ = ( (ring  ) * segments ) + segment + 1;
            *i++ = ( (ring  ) * segments ) + segment;
        }
    }
}

顶点。调整大小(环*段*3);
颜色。调整大小(环*段*3);
索引。调整大小(6个*环*段);
自动v=顶点。开始();
auto c=colors.begin();
自动i=索引。开始();
auto-dTheta=M_-PI/(f32)环;
自动dPhi=2*M_PI/(f32)段;
用于(u32环=0;环<环;++环){
自动r0=半径*sinf(环*dTheta);
自动y0=半径*cosf(环*dTheta);
对于(u32段=0;段<段;++段){
自动x0=r0*sinf(段*dPhi);
自动z0=r0*cosf(段*dPhi);
*v++=x0;*c++=color.r;
*v++=y0;*c++=color.g;
*v++=z0;*c++=color.b;
if(环<环){
*i++=((环)*段)+段;
*i++=((环+1)*段)+段;
*i++=((环+1)*段)+段+1;
*i++=((环+1)*段)+段+1;
*i++=((环)*段)+段+1;
*i++=((环)*段)+段;
}
}
}
知道我错过了什么吗

*i++ = ( (ring+1) * segments ) + segment + 1;
*i++ = ( (ring+1) * segments ) + segment + 1;
*i++ = ( (ring  ) * segments ) + segment + 1;
如果
等于
段-1
,您计算什么索引?是的,您可以从下一段中获取索引

如果没有下一段呢?然后你得到一个超出你的点列表的索引

您的段增量需要环绕到0:

*i++ = ( (ring+1) * segments ) + (segment + 1) % segments;
*i++ = ( (ring+1) * segments ) + (segment + 1) % segments;
*i++ = ( (ring  ) * segments ) + (segment + 1) % segments;

也可以考虑,如果<代码>环<代码>等于<代码>环- 1 < /代码>。同样的问题,但你需要一个不同的解决方案。您的

if
语句错误。应该是:

if((ring + 1) < rings)
if((环+1)
如果
等于
段-1
,您计算什么索引?是的,您可以从下一段中获取索引

如果没有下一段呢?然后你得到一个超出你的点列表的索引

您的段增量需要环绕到0:

*i++ = ( (ring+1) * segments ) + (segment + 1) % segments;
*i++ = ( (ring+1) * segments ) + (segment + 1) % segments;
*i++ = ( (ring  ) * segments ) + (segment + 1) % segments;

也可以考虑,如果<代码>环<代码>等于<代码>环- 1 < /代码>。同样的问题,但你需要一个不同的解决方案。您的

if
语句错误。应该是:

if((ring + 1) < rings)
if((环+1)
我认为应该是
如果(环+1
,不是吗?如果这不是问题,那么你应该发布渲染代码。是的,你是对的:)…永远不要相信你从互联网上获取的代码;)我认为应该是
如果(环+1
,不是吗?如果这不是问题,那么你应该发布渲染代码。是的,你是对的:)…永远不要相信你从互联网上获取的代码;)太棒了,第一个我自己就明白了……第二个也很好。呸,现在球体下端有一个洞:/n没关系,也明白了。for循环转到
戒指太棒了,我自己弄明白了第一个……第二个也很好。呸,现在球体下端有一个洞:/nevermind,也有。for循环转到
戒指