【发布时间】:2014-10-24 13:29:23
【问题描述】:
我的 Blender 3D 对象以三角面导出并写入 UV 未正确应用纹理。
看起来像这样:
我的渲染代码:
Color.white.bind();
texture.bind();
glBegin(GL_TRIANGLES);
for(ObjFace face : model.faces){
float[] vertex1 = model.vertices[face.indices[0]-1];
float[] vertex2 = model.vertices[face.indices[1]-1];
float[] vertex3 = model.vertices[face.indices[2]-1];
float[] normal1 = model.normals[face.normals[0]-1];
float[] normal2 = model.normals[face.normals[1]-1];
float[] normal3 = model.normals[face.normals[2]-1];
float[] tex1 = model.texCoords[face.texCoords[0]-1];
float[] tex2 = model.texCoords[face.texCoords[1]-1];
float[] tex3 = model.texCoords[face.texCoords[2]-1];
glNormal3f(normal1[0], normal1[1], normal1[2]);
glTexCoord2f(tex1[0], tex1[1]);
glVertex3f(vertex1[0], vertex1[1], vertex1[2]);
glNormal3f(normal2[0], normal2[1], normal2[2]);
glTexCoord2f(tex2[0], tex2[1]);
glVertex3f(vertex2[0], vertex2[1], vertex2[2]);
glNormal3f(normal3[0], normal3[1], normal3[2]);
glTexCoord2f(tex3[0], tex3[1]);
glVertex3f(vertex3[0], vertex3[1], vertex3[2]);
}
glEnd();
解析代码:
for (int i = 0; i < lines.length; ++i) {
String[] spaced = lines[i].split(" ");
if (lines[i].startsWith("v ")) {
float[] vertices = new float[3];
vertices[0] = parseFloat(spaced[1]);
vertices[1] = parseFloat(spaced[2]);
vertices[2] = parseFloat(spaced[3]);
verticesArray.add(vertices);
} else if (lines[i].startsWith("vn ")) {
float[] normals = new float[3];
normals[0] = parseFloat(spaced[1]);
normals[1] = parseFloat(spaced[2]);
normals[2] = parseFloat(spaced[3]);
normalsArray.add(normals);
} else if (lines[i].startsWith("vt ")) {
float[] texCoords = new float[2];
texCoords[0] = parseFloat(spaced[1]);
texCoords[1] = parseFloat(spaced[2]);
texCoordsArray.add(texCoords);
} else if (lines[i].startsWith("f ")) {
int[] faceIndices = new int[3];
int[] faceNormals = new int[3];
int[] faceTextureCoords = new int[3];
faceIndices[0] = parseInt(spaced[1].split("/")[0]);
faceIndices[1] = parseInt(spaced[2].split("/")[0]);
faceIndices[2] = parseInt(spaced[3].split("/")[0]);
faceNormals[0] = parseInt(spaced[1].split("/")[2]);
faceNormals[1] = parseInt(spaced[2].split("/")[2]);
faceNormals[2] = parseInt(spaced[3].split("/")[2]);
faceTextureCoords[0] = parseInt(spaced[1].split("/")[1]);
faceTextureCoords[1] = parseInt(spaced[2].split("/")[1]);
faceTextureCoords[2] = parseInt(spaced[3].split("/")[1]);
faceArray.add(new ObjFace(faceIndices, faceNormals, faceTextureCoords));
}
}
虽然我不确定这是否是我的 Blender 导出的问题。
谢谢。
编辑:在我将纹理图像的宽度和高度设为 2 次方后更新了图片。
编辑 2:我尝试了一个简单的盒子来确保不是模型搞砸了并测试了面部剔除。在盒子上,剔除背面在一定程度上解决了这个问题,但在杯子上几乎没有什么区别。
编辑 3:我添加了一个视频来演示我认为的问题所在。我认为三角形故障是由重叠的三角形引起的,例如手柄在实际杯子的前面。 youtube vid
【问题讨论】:
-
你能在你的 OBJ 文件中展示一些人脸(“f”)记录的例子吗?您的解析代码假定每个面只有 3 个顶点,但它们可以具有 OBJ 格式的任意数量的顶点。如果导出应用程序只生成具有 3 个顶点的面,那没问题。否则,你就有问题了。
-
是的,我使用 Blender 导出 OBJ 并检查了三角面选项。无论如何,这是 OBJ 的内容(杯子):link
-
我用我最近写的一个加载器尝试了那个cup.obj模型。它主要看起来不错。手柄底部有一个小孔,底部内侧有一些文物。我看不出您发布的代码有任何明显错误。你能显示
ObjFace类,尤其是构造函数吗? -
这里是:pastebin.com/UELC31D4 虽然它几乎只是将数组分配给对象内部的数组。
标签: java opengl 3d lwjgl blender