如何在Elm中从三角形列表生成顶点法线

3
我有一个三角形列表,格式如下:

type alias Vertex = {position: vec3}
List (Vertex,Vertex,Vertex)

现在我想计算三角形每个顶点的法向量。因此,我首先需要计算三角形的法向量,这不是问题。我可以像这样建模具有法向量的三角形:

type alias Triangle = {normal: Vertex, points: (Vertex,Vertex,Vertex)}

接着对原始列表进行映射,并计算三角形的法线。

但是我需要找到所有共享同一点的三角形集,从这些三角形的法线中计算该点的法线。然后,我需要更新所有这些三角形的结果,将法线存储在它们所有的顶点中。结果的格式将如下所示:

type alias Vertex = {position: vec3, normal: vec3}
List (Vertex,Vertex,Vertex)

所以我感觉使用列表可能不是最好的想法,但我不知道从哪里开始。

1个回答

0
最终,我想出了一个解决方案,使用两个单独的列表,一个用于三角形,一个用于点:
type alias Mesh =
    { triangles : List ( Int, Int, Int )
    , points : Array Point
    } 

type alias Point =
    { position : Vec3
    , normal : Vec3
    }

三角形列表仅保存点列表中3个位置的元组。 然后需要3个步骤来创建三角形列表:

  1. 迭代点以创建三角形,并在同一步骤中计算法线并将其添加到点中。更新后的点被设置回数组中。
  2. 再次映射点以规范化求和。
  3. 迭代三角形列表,使用元组中的位置在数组中找到点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接