2017-08-05 5 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*iixyと等しくなり、normalsArrayに書き込むと同じ問題が発生します。

データがメモリにどのように配置されているかは完全にはっきりしていません。最も直感的な方法は、verticesArrayは頂点ごとにちょうど(x,y,z)トリプル含まれていることになり、そのインデックスは

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

でなければなりませんが、あなたは別のレイアウトを使用する場合があります。

+0

はい、私は今朝起きてそれに気付いていました。ライティングはライティング領域まで正しく動作するようになりました。各三角形にどのように照明をつけることができるか知っていますか?(各三角形は照明に基づいて特徴的ですので、そうする方法は頂点ではなく面の法線を計算することです) –

関連する問題