Programação com OpenGL/Modern OpenGL Tutorial Leitor de OBJ: diferenças entre revisões

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Linha 165:
 
== Calculando as normals ==
 
Nosso algoritmos funciona, mas se duas faces forem referenciadas pelo mesmo vetor, em seguida a ultima face sobrescrever a normal para este vértice, isto significa que o objeto pode ficar bem diferente dependo da ordenação das faces.
 
Para concertar isto, nós calcularemos as normal entre as duas faces. Para calcular dois vetores, você pega metade do primeiro vetor mais metade do segundo vetor. Usaremos o <code>nb_seen</code> para guardar o coeficiente do vetor, assim podemos calcular com novo vetor em qualquer numero de vezes, sem gravar toda lista de vetores:
 
 
[[File:OpenGL Tutorial Suzanne normals average.png|thumb|Normals calculadas]]
<source lang="cpp">
mesh->normals.resize(mesh->vertices.size(), glm::vec3(0.0, 0.0, 0.0));
nb_seen.resize(mesh->vertices.size(), 0);
for (int i = 0; i < mesh->elements.size(); i+=3) {
GLushort ia = mesh->elements[i];
GLushort ib = mesh->elements[i+1];
GLushort ic = mesh->elements[i+2];
glm::vec3 normal = glm::normalize(glm::cross(
glm::vec3(mesh->vertices[ib]) - glm::vec3(mesh->vertices[ia]),
glm::vec3(mesh->vertices[ic]) - glm::vec3(mesh->vertices[ia])));
 
int v[3]; v[0] = ia; v[1] = ib; v[2] = ic;
for (int j = 0; j < 3; j++) {
GLushort cur_v = v[j];
nb_seen[cur_v]++;
if (nb_seen[cur_v] == 1) {
mesh->normals[cur_v] = normal;
} else {
// average
mesh->normals[cur_v].x = mesh->normals[cur_v].x * (1.0 - 1.0/nb_seen[cur_v]) + normal.x * 1.0/nb_seen[cur_v];
mesh->normals[cur_v].y = mesh->normals[cur_v].y * (1.0 - 1.0/nb_seen[cur_v]) + normal.y * 1.0/nb_seen[cur_v];
mesh->normals[cur_v].z = mesh->normals[cur_v].z * (1.0 - 1.0/nb_seen[cur_v]) + normal.z * 1.0/nb_seen[cur_v];
mesh->normals[cur_v] = glm::normalize(mesh->normals[cur_v]);
}
}
}
</source>
 
== Normals pré calculadas ==