Witam.
Próbuję wygenerować normalne sześcianu w taki sposób by każda ściana będąca trójkątem zawierała po trzy normalne dla trójkąta.
Może obrazek lepiej to zobrazuje tzn to co chcę osiagnać:
W ogóle to lecę z przykładem z książki "OpenGL Programowanie Gier" Kevin Hawkins, Dave Astle strona 149 "obliczanie normalnych", ale algorytm jakoś nie działa.
std::vector<float> cube() {
std::vector<float> vertices = {
// x, y, z, tu, tv
// Front face
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 1.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
// Back face
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
// Left face
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 1.0f, 0.0f,
-0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
-0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
// Right face
0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
0.5f, -0.5f, 0.5f, 0.0f, 1.0f,
0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
// Bottom face
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
0.5f, -0.5f, -0.5f, 1.0f, 1.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
// Top face
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f
};
return vertices;
}
void generateNormals() {
_normals.clear();
_normals.resize( _vertices.size() / 5 * 3, 0.0f ); if( _vertices.size() % 15 != 0 ) { std::cerr << "Błąd: Liczba danych wierzchołków nie jest podzielna przez 15!" << std::endl;
return;
}
for( short i = 0; i < _vertices.size() / 15; i += 15 ) {
glm::vec3 p1 = glm::vec3( _vertices[ i * 15 ], _vertices[ i * 15 + 1 ], _vertices[ i * 15 + 2 ] );
glm::vec3 p2 = glm::vec3( _vertices[ i * 15 + 5 ], _vertices[ i * 15 + 6 ], _vertices[ i * 15 + 7 ] );
glm::vec3 p3 = glm::vec3( _vertices[ i * 15 + 10 ], _vertices[ i * 15 + 11 ], _vertices[ i * 15 + 12 ] );
glm::vec3 v1 = p1 - p2;
glm::vec3 v2 = p2 - p3;
_normals.push_back( v1.y * v2.z - v1.z * v2.y );
_normals.push_back( v1.z * v2.x - v1.x * v2.z );
_normals.push_back( v1.x * v2.y - v1.y * v2.x );
}
}