我在C ++中实现了一个函数,为一个三角形条带( 2 x N 三角形)生成 N 段,以便稍后打印(如 GL_TRIANGLE_STRIP )由另一个函数。在这里,我向您展示我到目前为止所做的事情:
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));
}
}
}
所以它看起来像下图(对于 N = 3 ):
^
| ----------
| | /| /| /|
y | |/ |/ |/ |
| ----------
|
|-------------->
x
但实际上看起来像这样:
有关它的任何建议吗?我的想法是,我没有按照正确的顺序生成积分。
答案 0 :(得分:3)
生成一条三角形的逻辑并不好。让我试着解释一下:
FUNCTION min (ARRAY x)
IS x INVALID?
THEN EXIT WITH ERROR
INSTANTIATE min_x AS OBJECT LIKE IN x
LOOP ON EACH OBJECT IN x AS xi
IS min_x INITIALIZED?
THEN
IS xi SMALLER THAN min_x?
THEN SET min_x AS xi
ELSE SET min_x AS xi
CONTINUE LOOP
IS min_x INITIALIZED?
THEN RETURN min_x
ELSE EXIT WITH ERROR
END FUNCTION
尽可能地,三角形0由顶点0,1和2组成,而三角形1由顶点1,2和3组成,依此类推。因此,要生成此条带,您需要在一行中生成奇数索引,在另一行中生成偶数索引。让我们尝试使用代码,在这种情况下生成顶点:
^
| 0--2--4--6
| | /| /| /|
y | |/ |/ |/ |
| 1--3--5--7
|
|-------------->
x
答案 1 :(得分:0)
具有顶点A,B,C,D,E,...的三角形条将形成三角形ABC
,BCD
,CDE
,依此类推。
我的想法是,我没有按照正确的顺序生成积分。
是。你生成的是
0 1 2 3
4 5 6 7
8 9 10 11
所以你得到很多没有面积的变形三角形,只能得到一些连接不同线条的奇怪三角形(如2 3 4和3 4 5)。
你应该生成什么
0 2 4 6
1 3 5 7
请注意,添加其他行时,必须重复上一行的底部顶点作为新行的顶部顶点。还要注意,你必须为每一行重新启动三角形条。
更有效的方法可能就是像现在一样生成顶点,并查看indexed rendering,这将允许您只重用不同基元之间的顶点。