Java 计算icosphere的法线?

Java 计算icosphere的法线?,java,opengl,lwjgl,Java,Opengl,Lwjgl,所以我用LWJGL3制作了一个游戏,我目前正在尝试生成一个icosphere。我现在有一个非常基本的没有任何分割的icosphere,我的灯光看起来很暗,模型的一些部分是完全黑色的。我的理解是你希望你的法线从原点(0,0,0是球体的中心)出来。以下是我目前如何生成我的法线。我的照明目前与使用OBJ加载程序加载的其他模型完美配合,因此我非常确定这不是我的照明代码,而是我生成法线的方式 法线计算: normalsArray = new float[verticesArray.length];

所以我用LWJGL3制作了一个游戏,我目前正在尝试生成一个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;
    }
normalsArray=newfloat[verticesArray.length];

对于(int i=0;i您的数组索引毫无意义:

由于
1*i
将是
i
x
将等于
y
,并且在写入
法线数组时也会遇到同样的问题

现在完全不清楚您的数据在内存中是如何排列的。最直观的方法是
verticesArray
只包含
(x,y,z)
每个顶点的三重索引,因此索引应该是

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

但是你可以使用另一种布局。

是的,你说得很对,我今天早上起床时注意到了这一点。照明现在可以在照明区域正常工作。你知道如何在每个三角形上设置照明吗(所以每个三角形都是基于光照而不同的?我认为这样做的方法是计算面的法线,而不是顶点。)
     float x = verticesArray[3*i+0];
     float y = verticesArray[3*i+1];
     float z = verticesArray[3*i+2];