计算 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
将是 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];
但您可能会使用其他布局。
所以我正在使用 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
将是 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];
但您可能会使用其他布局。