2017-08-05 101 views
-1

所以我使用LWJGL 3來製作遊戲,而我目前正在嘗試生成icosphere。我目前有一個非常基本的icosphere沒有任何分裂,我的照明看起來和模型的一些部分是完全黑色的。我的理解是,你希望你的法線從原點出來(0,0,0是球體的中心)。這裏是我如何生成我的法線。我的照明目前與使用OBJ加載程序加載的其他模型完全兼容,因此我非常確定這不是我的照明代碼,而是我生成法線的方式。計算icosphere的法線?

法線計算:

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; 
    } 

這裏是我目前的結果的畫面: Result

回答

1

您的數組索引不作絲毫意義:

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

1*i將是i,x將等於y,並且您在寫入normalsArray時遇到同樣的問題。

現在完全不清楚你的數據是如何在內存中佈局的。最直觀的方式將是verticesArray只包含每個頂點的(x,y,z)三倍,因此指數應該是

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

但你可能會使用其他佈局。

+0

是的,你是非常正確的,我今天早上起牀後覺得很愚蠢。照明現在可以正常工作,直至照亮區域。你知道我怎麼能在每個三角形上做出光照(所以每個三角形都是基於光照的獨特之處?我認爲這樣做的方法是計算面的法線而不是頂點)。 –