我正在尝试并且无法使用Haskell计算三角形网格的法线。
给定顶点列表,每三个连续顶点创建一个三角形:
[a, b, c, d, e, f, g, h, i ...]
顶点如下:
type Vertex = (Double, Double, Double, Double)
和正常是:
type Normal = (Double, Double, Double)
我的功能是:
calculateNormals :: [Vertex] -> [Normal]
calculateNormals v = map normalize normals
where normals = concat $ zipWith3
(\ a b c -> let normal = cross (c - a) (b - a)
in [normal, normal, normal])
(every 3 v) (every 3 $ drop 1 v) (every 3 $ drop 2 v)
every n xs = case drop (n - 1) xs of
(y:ys) -> y : every n ys
[] -> [[]
函数的要点是,对于每3个顶点,我计算定义三角形的两个向量的叉积,这就是法线。这是我的意图 - 但我不确定这是否正常......
这种方法有明显的错误吗?或者我是如何在Haskell中实现它的?