使用OpenGL无法正确显示三角形条带 我在C++中实现了一种用于生成一个三角形条带(2×N三角形)的N段,之后将被另一个函数(如GL3三角条)打印出来。在这里,我向您展示我迄今为止的成果: void strip( std::uint32_t N, std::vector<glm::vec3>* vertices) { vertices->clear(); for (std::uint32_t j=0; j<=N; ++j) { for (std::uint32_t i=1; i<=N; ++i) { float x = (float)i/(float)N; float y = (float)j/(float)N; vertices->push_back(glm::vec3(x, y, 0)); } } }

使用OpenGL无法正确显示三角形条带 我在C++中实现了一种用于生成一个三角形条带(2×N三角形)的N段,之后将被另一个函数(如GL3三角条)打印出来。在这里,我向您展示我迄今为止的成果: void strip( std::uint32_t N, std::vector<glm::vec3>* vertices) { vertices->clear(); for (std::uint32_t j=0; j<=N; ++j) { for (std::uint32_t i=1; i<=N; ++i) { float x = (float)i/(float)N; float y = (float)j/(float)N; vertices->push_back(glm::vec3(x, y, 0)); } } },c++,c++11,opengl,C++,C++11,Opengl,但事实上是这样的: 有什么建议吗?我的想法是,我没有按正确的顺序生成点。一个顶点为A、B、C、D、E,。。。将形成三角形ABC,BCD,CDE,等等 我的想法是我没有按照正确的顺序生成点 对。你产生的是 0 1 2 3 4 5 6 7 8 9 10 11 0 2 4 6 1 3 5 7 所以你得到了很多变形的三角形,没有任何面积,只有一些奇怪的三角形连接不同的线(比如2 3 4和3 4 5) 您应该生成的是 0 1 2 3 4 5 6 7 8 9 1

但事实上是这样的:


有什么建议吗?我的想法是,我没有按正确的顺序生成点。

一个顶点为A、B、C、D、E,。。。将形成三角形
ABC
BCD
CDE
,等等

我的想法是我没有按照正确的顺序生成点

对。你产生的是

0  1  2  3
4  5  6  7
8  9 10 11
0  2  4  6
1  3  5  7
所以你得到了很多变形的三角形,没有任何面积,只有一些奇怪的三角形连接不同的线(比如2 3 4和3 4 5)

您应该生成的是

0  1  2  3
4  5  6  7
8  9 10 11
0  2  4  6
1  3  5  7
请注意,添加其他行时,必须重复上一行的底部顶点作为新行的顶部顶点。还要注意,您必须为每行重新启动三角形条带


一种更有效的方法是,您可以像现在一样生成顶点,并进行查看,这将允许您在不同的基本体之间重复使用顶点。

带有顶点A、B、C、D、E等的三角形条带,。。。将形成三角形
ABC
BCD
CDE
,等等

我的想法是我没有按照正确的顺序生成点

对。你产生的是

0  1  2  3
4  5  6  7
8  9 10 11
0  2  4  6
1  3  5  7
所以你得到了很多变形的三角形,没有任何面积,只有一些奇怪的三角形连接不同的线(比如2 3 4和3 4 5)

您应该生成的是

0  1  2  3
4  5  6  7
8  9 10 11
0  2  4  6
1  3  5  7
请注意,添加其他行时,必须重复上一行的底部顶点作为新行的顶部顶点。还要注意,您必须为每行重新启动三角形条带


一种更有效的方法是,您可以像现在一样生成顶点,然后查看,这将允许您在不同的基本体之间重复使用顶点。

您的逻辑不适合生成三角形条带。让我试着解释一下我的观点:

    ^
    |  0--2--4--6
    |  | /| /| /|
  y |  |/ |/ |/ |
    |  1--3--5--7
    |
    |-------------->
            x
如您所能,三角形0由顶点0、1和2组成,而三角形1由顶点1、2和3组成,依此类推。所以,要生成这个条带,需要在一行中生成奇数索引,在另一行中生成偶数索引。让我们尝试使用代码,在本例中生成顶点:

void strip(std::uint32_t N, std::vector<glm::vec3>* vertices)
{
    vertices->clear();

    for (std::uint32_t j=0; j < N + 1; ++j) 
    {
        float x = (float)j/(float)N;
        vertices->push_back(glm::vec3(x, 1, 0));  // even row
        vertices->push_back(glm::vec3(x, 0, 0));  // odd row
    }
}
void strip(std::uint32\u t N,std::vector*顶点)
{
顶点->清除();
对于(std::uint32_t j=0;j向后推(glm::vec3(x,1,0));//偶数行
顶点->向后推(glm::vec3(x,0,0));//奇数行
}
}

您的逻辑不适合生成三角形条带。让我试着解释一下我的观点:

    ^
    |  0--2--4--6
    |  | /| /| /|
  y |  |/ |/ |/ |
    |  1--3--5--7
    |
    |-------------->
            x
如您所能,三角形0由顶点0、1和2组成,而三角形1由顶点1、2和3组成,依此类推。所以,要生成这个条带,需要在一行中生成奇数索引,在另一行中生成偶数索引。让我们尝试使用代码,在本例中生成顶点:

void strip(std::uint32_t N, std::vector<glm::vec3>* vertices)
{
    vertices->clear();

    for (std::uint32_t j=0; j < N + 1; ++j) 
    {
        float x = (float)j/(float)N;
        vertices->push_back(glm::vec3(x, 1, 0));  // even row
        vertices->push_back(glm::vec3(x, 0, 0));  // odd row
    }
}
void strip(std::uint32\u t N,std::vector*顶点)
{
顶点->清除();
对于(std::uint32_t j=0;j向后推(glm::vec3(x,1,0));//偶数行
顶点->向后推(glm::vec3(x,0,0));//奇数行
}
}

您的示例(N=3)显示了6个三角形。这不是2*N*N=2*3*3=18@BDL对不起,我不小心加了一个N。编辑示例(N=3)显示6个三角形。这不是2*N*N=2*3*3=18@BDL对不起,我不小心加了一个N。Edited@Rabbid76现在我明白它是如何工作的了。但现在,当我实现打印它们的功能,并放置相应的颜色时,它似乎不起作用。我做得对吗?
glBegin(GL\u三角形\u带);对于(uint i=0;i<顶点.size();++i){glVertex3f(顶点[i].x,顶点[i].y,顶点[i].z);glColor3f(颜色[i].x,颜色[i].y,颜色[i].z);}glEnd()@rabbi76现在我明白它是如何工作的了。但现在,当我实现打印它们的功能,并放置相应的颜色时,它似乎不起作用。我做得对吗?
glBegin(GL\u三角形\u带);对于(uint i=0;i<顶点.size();++i){glVertex3f(顶点[i].x,顶点[i].y,顶点[i].z);glColor3f(颜色[i].x,颜色[i].y,颜色[i].z);}glEnd()