计算 icosphere 的法线?

Calculate normals for icosphere?

所以我正在使用 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

你的数组索引没有任何意义:

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

因为 1*i 将是 ix 将等于 y,并且您在写入 normalsArray 时遇到同样的问题。

现在完全不清楚您的数据在内存中的布局方式。最直观的方法是 verticesArray 每个顶点只包含 (x,y,z) 三元组,所以索引应该是

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

但您可能会使用其他布局。