计算icosphere的法线?

时间:2017-08-05 01:29:44

标签: java opengl lwjgl

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

1 个答案:

答案 0 :(得分:1)

你的数组索引没有丝毫意义:

    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];

但您可以使用其他布局。