我正在尝试使用Haskell程序化地生成一个给定宽度的三角形方形地形,以提供给OpenGL。
唯一实际程序生成的是高度,这根本不难,我只是使用随机函数创建一个[[GLfloat]]
,表示高度行。
然后我还有一个函数,heightsToCoords
它获取[[GLfloat]]
并返回一个包含每个顶点的 x、y 和 z 坐标的[GLfloat]
。
所以如果我打电话给heightsToCoords [[0, 1], [1, 0]]
,它会返回
[0, 0, 0,
1, 1, 0,
0, 1, 1,
1, 0, 1]
我遇到的问题是将数据传输到OpenGL。OpenGL需要对每个面进行三角测量(至少在我的设置中),我所拥有的只是点,我不确定如何创建面。
如何将此数据从点列表转换为面列表?忽略法线和顶点顺序。
在 GL 方面,我会使用 drawElements
,它需要一个点列表和一个索引列表作为输入。 因此,问题变成了如何在点列表中生成索引列表。
记住原始的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]]