Add geom::smooth_normals

This commit is contained in:
Nikita Lisitsa 2022-06-09 11:14:47 +03:00
parent 82a81c4c77
commit 8e081d6d06

View file

@ -123,6 +123,26 @@ namespace psemek::geom
return result;
}
template <typename Vertex, typename Index>
auto smooth_normals(std::vector<Vertex> const & vertices, std::vector<triangle<Index>> const & triangles)
{
using vector_type = std::decay_t<decltype(vertices[0] - vertices[0])>;
std::vector<vector_type> normals(vertices.size(), vector_type::zero());
for (auto const & t : triangles)
{
auto const n = cross(vertices[t[1]] - vertices[t[0]], vertices[t[2]] - vertices[t[0]]);
normals[t[0]] += n;
normals[t[1]] += n;
normals[t[2]] += n;
}
for (auto & n : normals)
n = normalized(n);
return normals;
}
template <typename Index = std::uint32_t, typename Vertex>
std::vector<triangle<Index>> triangulate_convex(std::vector<Vertex> const & v)
{