如何从 Elm 中的三角形列表生成顶点法线
How generate vertex normals from a list of triangles in Elm
我有一个像
形式的三角形列表
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)
所以我觉得使用列表可能不是最好的主意,但我不知道从哪里开始。
毕竟我想出了一个解决方案,其中包含 2 个单独的列表,一个用于三角形,一个用于点:
type alias Mesh =
{ triangles : List ( Int, Int, Int )
, points : Array Point
}
type alias Point =
{ position : Vec3
, normal : Vec3
}
三角形列表只包含一个元组,其中包含点列表中点的 3 个位置。
然后创建三角形列表需要 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)
所以我觉得使用列表可能不是最好的主意,但我不知道从哪里开始。
毕竟我想出了一个解决方案,其中包含 2 个单独的列表,一个用于三角形,一个用于点:
type alias Mesh =
{ triangles : List ( Int, Int, Int )
, points : Array Point
}
type alias Point =
{ position : Vec3
, normal : Vec3
}
三角形列表只包含一个元组,其中包含点列表中点的 3 个位置。 然后创建三角形列表需要 3 个步骤:
- 迭代这些点以创建三角形,并在同一步骤中计算法线并将它们添加到这些点。更新后的点放回数组中。
- 再次映射这些点以标准化总和。
- 遍历三角形列表,使用元组中的位置找到数组中的点。