Python 我应该使用哪个OpenGL原语来绘制三角剖分?

Python 我应该使用哪个OpenGL原语来绘制三角剖分?,python,opengl,triangulation,Python,Opengl,Triangulation,我看到了下图: 我可以像下面这样进行三角测量: 我是使用python库完成的。我的三角测量结果存储在一个dict对象中,如下所示: >>> triangulation["vertices"] array([[ 23. , 282. ], [ 24. , 254. ], [ 30. , 239. ], [ 43. , 219.

我看到了下图:

我可以像下面这样进行三角测量:

我是使用python库完成的。我的三角测量结果存储在一个
dict
对象中,如下所示:

>>> triangulation["vertices"]
array([[ 23.        , 282.        ],
       [ 24.        , 254.        ],
       [ 30.        , 239.        ],
       [ 43.        , 219.        ],
       [ 60.        , 204.        ], ...  And so on ...



>>> triangulation["triangles"]
array([[ 89, 106, 105],
       [ 99,  35,  86],
       [110,  68,  87],
       [ 47,  66,  83],
       [ 72,  82,  74], ...  And so on ...

现在,我想使用OpenGL将该纹理提取并绘制为网格。我想知道我应该使用哪种原语?我认为
TRIANGLE\u STRIP
是正确的解决方案,但这是一个复杂的三角剖分,很明显,只有一个TRIANGLE\u STRIP是不够的

您有两个阵列。第一个数组包含二维顶点坐标,第二个数组包含索引。
您必须使用tor绘制包含在第二个数组中的三角形基本体。索引指的是第一个数组的对应顶点坐标

首先,必须为顶点坐标创建一个浮点缓冲区,为索引创建一个整数缓冲区。最简单的方法是使用,将嵌套列表或数组转换为数组缓冲区

假设您有一个形式为[[x0,y0],[x1,y1],[x2,y2],…]的
顶点数组和形式为[[a0,b0,c0],[a1,b1,c1],[a2,b2,c2],…]的
索引数组,则可以这样创建缓冲区:

将numpy导入为np
顶点数组=np.array(顶点,dtype=np.float32)
指数数量=长度(指数)*3
索引\数组=np.array(索引,dtype=np.uint32)
使用,而不是NumPy,也可以做到这一点。但是列表必须分别以[x0,y0,x1,y1,x2,y2,…]的形式展平[a0,b0,c0,a1,b1,c1,a2,b2,c2,…]:

顶点数组=(ctypes.c_float*len(平面顶点))(*平面顶点)
指数数量=len(平坦指数)*3
索引数组=(ctypes.c\u uint32*无索引)(*平坦索引)
创建顶点数组对象。见:

vao=glgenvertexarray(1)
glBindVertexArray(vao)
ibo=glGenBuffers(1)
glBindBuffer(GLU元素数组缓冲区,ibo)
glBufferData(GL元素数组缓冲区、索引数组、GL静态绘图)
vbo=glGenBuffers(1)
glBindBuffer(GL_数组_缓冲区,vbo)
glBufferData(GL\ U数组\缓冲区、顶点\数组、GL\ U静态\绘图)
glvertexattributepointer(0,2,GL_浮点,False,0,无)
GlenableVertexAttributeArray(0)
glBindBuffer(GL_数组_缓冲区,0)
glBindVertexArray(0)
如果要绘制三角形基本体,只需绑定顶点数组对象并调用
gldrawerelements

glBindVertexArray(vao)
GLD元素(GL_三角形,无索引,GL_无符号,无)

关于评论:

[…]我已经知道如何使用
glTexCoord2f
然后
glVertex3f
对平面进行纹理处理,但我没有弄清楚如何使用vao进行纹理处理

最简单的方法是创建单独的纹理坐标数组。假设纹理坐标
texAttr
的形式为[[u0,v0],[u1,v1],[u2,v2],…]。 直接生成缓冲区:

texAttr\u数组=np.array(texAttr,dtype=np.float32)
如果有着色器程序,则必须添加纹理坐标属性:

e、 g

vec2顶点中的布局(位置=0); vec2 texAttr中的布局(位置=1);
以及定义通用顶点属性数据的数组

vao=glgenvertexarray(1)
glBindVertexArray(vao)
#[…]索引缓冲区
vbo=glGenBuffers(2)
glBindBuffer(GL_数组_缓冲区,vbo[0])
glBufferData(GL\ U数组\缓冲区、顶点\数组、GL\ U静态\绘图)
glBindBuffer(GL_数组_缓冲区,vbo[1])
glBufferData(GL\U数组\U缓冲区、texAttr\U数组、GL\U静态\U绘图)
glvertexattributepointer(0,2,GL_浮点,False,0,无)
GlenableVertexAttributeArray(0)
glvertexattributepointer(1,2,GL_浮点,False,0,无)
GlenableVertexAttributeArray(1)
glBindBuffer(GL_数组_缓冲区,0)
glBindVertexArray(0)
如果使用兼容性配置文件和固定功能属性,则必须指定并启用客户端状态。
注意,客户端状态
GL_VERTEX_ARRAY
,并映射到顶点属性0。见:

vao=glgenvertexarray(1)
glBindVertexArray(vao)
#[…]索引缓冲区
vbo=glGenBuffers(2)
glBindBuffer(GL_数组_缓冲区,vbo[0])
glBufferData(GL\ U数组\缓冲区、顶点\数组、GL\ U静态\绘图)
glBindBuffer(GL_数组_缓冲区,vbo[1])
glBufferData(GL\U数组\U缓冲区、texAttr\U数组、GL\U静态\U绘图)
glVertexPointer(2,GLU浮点,0,无)
glEnableClientState(GL_顶点_数组)
glTexCoordPointer(2,GL_浮点,0,无)
glEnableClientState(GL_纹理_坐标_阵列)
glBindBuffer(GL_数组_缓冲区,0)
glBindVertexArray(0)
注意,如果不使用着色器,则必须通过以下方式启用二维纹理:

glEnable(GL_纹理_2D)

关于评论:

我想一个接一个地置换顶点[…]


可以通过更改单个顶点坐标,其中第二个参数是顶点坐标的字节偏移量。坐标
i
的偏移量将是
4*2*i
(4是以字节为单位的浮点大小,每个坐标由两个分量x和y组成)

三角形有什么问题
?我的三角形需要连接,不是吗?谢谢,这个顶点数组如何进行纹理处理?你认为实时修改它的顶点位置容易吗?对于纹理,你需要纹理坐标。看见“实时修改其顶点位置”是什么意思?是否要置换或旋转网格?你想产生扭曲吗?我还在学习,这很难。不确定它应该是顶点还是片段着色器。我确信你的答案是正确的,但我需要在接受它之前使它起作用。顺便说一句,很好的练习。当然,我不能让它工作:)你确定glEnableClientState(GL_VERTEX_ARRAY)
glTexCoordPointer()之后吗?它看起来不像我在这里找到的示例:where
GL\u纹理_