生成带有三角形带的平面
生成顶点列表以使用三角形带绘制平面的最佳算法是什么?
我正在寻找一个函数,它接收平面的宽度和高度并返回包含正确索引的顶点的浮点数组。
width 表示每行的顶点数。
高度表示每列的顶点数。
float* getVertices( int width, int height ) {
...
}
void render() {
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, getVertices(width,heigth));
glDrawArrays(GL_TRIANGLE_STRIP, 0, width*height);
glDisableClientState(GL_VERTEX_ARRAY);
}
What would be the best algorithm to generate a list of vertices to draw a plane using triangle strips?
I'm looking for a function which receives the plane's width and height and returns a float array containing correctly indexed vertices.
width represents the number of vertices per row.
height represents the number of vertices per column.
float* getVertices( int width, int height ) {
...
}
void render() {
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, getVertices(width,heigth));
glDrawArrays(GL_TRIANGLE_STRIP, 0, width*height);
glDisableClientState(GL_VERTEX_ARRAY);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
下面是一些执行此操作的代码(未经测试,但您至少明白了):
第一个循环在标准矩形网格中设置顶点数组。有 R*C 顶点。
第二个循环设置索引。一般来说,网格中每个正方形有两个顶点。每个顶点都会导致绘制一个新的三角形(与之前的两个顶点),因此每个正方形都由两个三角形绘制。
每行开头和结尾的第一个和最后一个顶点是重复的。这意味着每行之间有两个面积为零的三角形(简并三角形)。这使我们能够将整个网格绘制在一个大三角形条中。这种技术称为缝合。
Here is some code that does this (not tested, but you get the idea at least):
The first loop sets up the vertex array in a standard rectangular grid. There are R*C vertices.
The second loop sets up the indices. In general, there are two vertices per square in the grid. Each vertex will cause a new triangle to be drawn (with the previous two vertices), so each square is drawn with two triangles.
The first and last vertex at the start and end of each row is duplicated. This means there are two triangles of zero area (degenerate triangles) between each row. This allows us to draw the entire grid in one big triangle strip. This technique is called stitching.
上面的代码都没有给出正确的网格生成。一篇关于如何在简单平面上制作三角形条带的非常好的文章:http://www.learnopengles.com/android-lesson-eight-an-introduction-to-index-buffer-objects-ibos/
这是我的测试代码,实际上经过测试并完全正常工作:
none of the code above gives a correct mesh generation. A very good article about how to make a strip of triangles on a simple plane: http://www.learnopengles.com/android-lesson-eight-an-introduction-to-index-buffer-objects-ibos/
Here is my test code that actually tested and fully working:
我正在做类似的事情,并使用我想出的前两个答案(经过测试,C#,XNA)
这很容易转换为C ++,只需将
indices
制作为std::vector。我的解决方案的显着特点是:
a) 不需要更改每个子带的缠绕顺序 - 添加两个点会创建两个退化三角形,因此下一个子带的顺序是正确的。
b) 您应该有条件地添加第一个和最后一个 dg 三角形顶点。
I was doing something similar and using the first two answers I have come up with this (tested, C#, XNA)
This is easily convertable to c++, just make
indices
an std::vector.The notable features for my solution are that:
a) It doesn't need to change the winding order per substrip - adding two points creates two degenerate triangles, so the order is correct for the next substrip.
b) You should conditionally add the first and last dg triangle vertices.
谢谢大家。我已经编码了这个。正确吗?或者生成的条带有什么错误吗?
当 width=4 和 height=4 时,这就是我得到的:
这里我修改一些顶点高度:
Thanks you all. I've coded this. Is it correct? Or is the generated strip somehow wrong?
With width=4 and height=4 this is what I got:
And here I'm modifying some vertex height: