所以我正在使用LWJGL 3制作游戏,而我正在尝试创建一个icosphere。我目前有一个非常基本的icosphere,没有任何分裂,我的灯光看起来很模糊,模型的某些部分是完全黑色的。我的理解是你希望你的法线从原点出来(0,0,0是球体的中心)。这就是我目前如何生成我的正常情况。我的照明目前与使用OBJ加载器加载的其他模型完美配合,所以我很确定它不是我的照明代码,而是我生成法线的方式。
法线计算:
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
答案 0 :(得分: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];
但您可以使用其他布局。