使用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()代码>