【问题标题】:Haskell OpenGL procedural generationHaskell OpenGL 程序生成
【发布时间】:2014-01-13 23:22:53
【问题描述】:

我正在尝试使用 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 需要对每个面进行三角剖分(至少在我的设置中),而我所拥有的只是点,我不知道如何创建面。

如何将这些数据从点列表转换为人脸列表?忽略法线和顶点顺序。

【问题讨论】:

  • 不相关的建议:我会使用array 而不是高度列表,因为这样您就可以保证每一行都具有相同的宽度。 (而且它可能更有效。)
  • 或者甚至是vector,据说效率更高。
  • 我写了一些东西,在 haskell 中制作了 2D 程序生成的图形。它使用显示列表和haskell 列表。代码是here

标签: opengl haskell procedural-generation opengl-4


【解决方案1】:

在 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]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多