このドキュメントに従って .3ds インポーターを実装しようとしていますが、.3ds ファイルでは提供されないため、頂点法線を計算する必要がある段階に近づいています。Javaコードは次のとおりです。
/* Sctructure of vertex array is {x0, y0, z0, x1, y1, z1...}
*
* Basically, MathUtils.generateNormal_f(x0,y0,z0, x1,y1,z1, x2,y2,z2) is cross
* product between (x1-x0, y1-y0, z1-z0) and (x2-x0, y2-y0, z2-z0) */
normals = new float[this.vertex.length]; //every vertex has it's own normal
int n = 0;
for (int i=0; i<this.index.length; i++){
float[] Normal = MathUtils.generateNormal_f( //getting xyz coords of 1 normal
vertex[index[i]*3], vertex[index[i]*3+1], vertex[index[i]*3+2],
vertex[index[++i]*3], vertex[index[i]*3+1], vertex[index[i]*3+2],
vertex[index[++i]*3], vertex[index[i]*3+1], vertex[index[i]*3+2]);
normals[n++] = Normal[0];
normals[n++] = Normal[1];
normals[n++] = Normal[2];
}
メソッドMathUtils.generateNormal_f(...)
はテスト済みで、正常に動作します。このコードの結果を以下に示します (最初の画像)。たとえば、2 番目のイメージでは、モデルのすべての法線が同じで、光源の方を向いています。
問題は、法線を適切に計算する方法です。