Lab 7: Terrain (Vertex Normals Solution)
Here's the code for obtaining a given vertex's normals.
It's fine to copy-and-paste this code, but do try to understand it!
// Computes the normal of a vertex by averaging neighbors
glm::vec3 TerrainGenerator::getNormal(int row, int col) {
// Task 9: Compute the average normal for the given input indices
// TA SOLUTION
glm::vec3 normal = glm::vec3(0, 0, 0);
std::vector<std::vector<int>> neighborOffsets = { // Counter-clockwise around the vertex
{-1, -1},
{ 0, -1},
{ 1, -1},
{ 1, 0},
{ 1, 1},
{ 0, 1},
{-1, 1},
{-1, 0}
};
glm::vec3 V = getPosition(row,col);
for (int i = 0; i < 8; ++i) {
int n1RowOffset = neighborOffsets[i][0];
int n1ColOffset = neighborOffsets[i][1];
int n2RowOffset = neighborOffsets[(i + 1) % 8][0];
int n2ColOffset = neighborOffsets[(i + 1) % 8][1];
glm::vec3 n1 = getPosition(row + n1RowOffset, col + n1ColOffset);
glm::vec3 n2 = getPosition(row + n2RowOffset, col + n2ColOffset);
normal = normal + glm::cross(n1 - V, n2 - V);
}
return glm::normalize(normal);
}