Haskell OpenGL程序生成
我试图使用Haskell程序化地生成一个给定宽度的三角形正方形地形,并将其提供给OpenGL 实际生成的唯一东西是高度,这一点都不难,我只是使用一个随机函数来创建一个Haskell OpenGL程序生成,opengl,haskell,procedural-generation,opengl-4,Opengl,Haskell,Procedural Generation,Opengl 4,我试图使用Haskell程序化地生成一个给定宽度的三角形正方形地形,并将其提供给OpenGL 实际生成的唯一东西是高度,这一点都不难,我只是使用一个随机函数来创建一个[[GLfloat]]],表示高度行 然后我还有一个函数,heightsToCoords,它接受[[GLfloat]]]并返回一个[GLfloat],其中包含每个顶点的x、y和z坐标 因此,如果我调用heightsToCoords[[0,1],[1,0]],它将返回 [0, 0, 0, 1, 1, 0, 0, 1, 1,
[[GLfloat]]]
,表示高度行
然后我还有一个函数,heightsToCoords
,它接受[[GLfloat]]]
并返回一个[GLfloat]
,其中包含每个顶点的x、y和z坐标
因此,如果我调用heightsToCoords[[0,1],[1,0]]
,它将返回
[0, 0, 0,
1, 1, 0,
0, 1, 1,
1, 0, 1]
我遇到的问题是将数据获取到OpenGL。OpenGL需要对每个面进行三角剖分(至少在我的设置中是这样),而我所拥有的只是点,我不知道如何创建面
如何将这些数据从点列表转换为面列表?忽略顶点的法线和顺序。在GL端,我会使用
抽屉元素
,它需要点列表和索引列表作为输入。因此,问题变成了如何在点列表中生成索引列表
记住原始的XZ网格,我们的想法是为网格的每个单元绘制两个三角形。所以我们需要每个网格单元6个索引。在Haskell中,我们可以编写如下内容:
concat [[x + width * (y+1), 1 + x + width*y, x + width * y,
x + width* (y+1), 1 + x + width * (y+1), 1 + x + width*y]
| y <- [0..height-1], x <- [0..width-1]]
concat[[x+宽度*(y+1),1+x+宽度*y,x+宽度*y,
x+宽度*(y+1),1+x+宽度*(y+1),1+x+宽度*y]
|y不相关的建议:我会使用一个列表而不是一个高度列表,因为你可以保证每一行都有相同的宽度(而且可能更有效)或者甚至是a,这应该更有效。我写了一些东西,用haskell制作2D程序生成的图形。它使用显示列表和haskell列表。代码是。