2017-08-05 1 views
-1

Donc j'utilise LWJGL 3 pour faire un jeu et j'essaie actuellement de générer une icosphère. J'ai actuellement une icosphere très basique sans aucun dédoublement et mon éclairage se détache et certaines parties du modèle sont complètement noires. Ma compréhension est que vous voulez que vos normales sortent de l'origine (0, 0, 0 qui est le centre de la sphère). Voici comment je génère actuellement mes normales. Mon éclairage fonctionne actuellement parfaitement avec d'autres modèles chargés en utilisant un chargeur OBJ, donc je suis à peu près sûr que ce n'est pas mon code d'éclairage mais la façon dont je génère les normales.Calculer des normales pour icosphere?

calcul Normales:

normalsArray = new float[verticesArray.length]; 

    for (int i = 0; i <= normalsArray.length/3; i++) { 
     float x = verticesArray[i]; 
     float y = verticesArray[1 * i]; 
     float z = verticesArray[2 * i]; 

     Vector3f normal = new Vector3f(x, y, z); 
     normal.normalize(); 
     float length = normal.length(); 

     normalsArray[i] = normal.x/length; 
     normalsArray[1 * i] = normal.y/length; 
     normalsArray[2 * i] = normal.z/length; 
    } 

Et voici une photo de mon résultat courant: Result

Répondre

1

Votre indexation de tableau ne fait pas le moindre sens:

float x = verticesArray[i]; 
    float y = verticesArray[1 * i]; 
    float z = verticesArray[2 * i]; 

depuis 1*i sera i, sera égal à y, et vous avez le même problème lors de l'écriture au normalsArray.

Maintenant, il est totalement imprécis comment vos données sont mises en mémoire. La façon la plus intuitive serait que verticesArray ne contient que le triple (x,y,z) par sommet, de sorte que les indices devraient être

 float x = verticesArray[3*i+0]; 
    float y = verticesArray[3*i+1]; 
    float z = verticesArray[3*i+2]; 

mais vous pouvez utiliser une autre mise en page.

+0

Oui, vous avez raison, c'était stupide de ma part, je me suis levé ce matin et j'ai remarqué cela. L'éclairage fonctionne maintenant correctement jusqu'à la zone éclairée. Savez-vous comment je peux faire l'éclairage sur chaque triangle (donc chaque triangle est distinctif en fonction de l'éclairage? Je pense que la méthode pour le faire est de calculer les normales du visage et non les sommets.) –