Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';t纹理模型_Java_Opengl_3d_Lwjgl_Blender - Fatal编程技术网

Java Can';t纹理模型

Java Can';t纹理模型,java,opengl,3d,lwjgl,blender,Java,Opengl,3d,Lwjgl,Blender,我的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[] v

我的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));
        }
    }
for(int i=0;i
虽然我不确定我的搅拌机出口是否会有问题

谢谢

编辑:更新后,我的纹理图像的宽度和高度的权力两个图片。

编辑2:我尝试了一个简单的框,以确保它不是模型是错误的,并测试了面剔除。在盒子上,剔除背面在一定程度上解决了这个问题,然而在杯子上却没有什么区别。


编辑3:我放了一段视频来说明我认为存在的问题。我认为三角形故障是由重叠的三角形造成的,就像把手在实际杯子的前面一样

这是“大小不是2次方的纹理”问题的另一个实例吗?lwjgl会将你的纹理扩展到2倍大小,这意味着你的UV坐标是[0…1]将是错误的,它们应该是[0…0.5783],因为剩下的是lwjgl填充以达到2倍。找不到参考…

IIRC,在GLES20中,三角形的法线由绕组指示(时钟方向或计数器时钟方向)。我不确定GL会理解什么,如果你为每个顶点设置一个法线(用于照明),而为三角形设置一个法线。我不确定是否可以为三角形设置一个,这意味着它将从顶点位置+缠绕计算。我认为这是一个问题,因为所有四边形都是半渲染的(一个三角形为两个)。

我想这是问题的一部分,因为不再显示任何黑色位。所以谢谢你!但仍然存在一些部分透明的问题。我更新了我的帖子,加入了一张新的照片,上面画的是它之后的样子。我想你说的四分体被渲染了一半是对的。该模型从具有三角形面和UV写入的混合器中导出。此外,我还没有在这方面做任何照明,所以即使我根本不包括法线,这个问题仍然会发生。我认为Blender正确设置了顶点、法线和纹理坐标的顺序/方向。法线和缠绕顺序是分开的。法线用于照明,缠绕顺序用于背面消隐(如果启用)。可能是对三角形的顶点进行排序。不管怎样,从第二个茶壶和盒子来看,你似乎对法线有问题。你可以计算三角形法线,确保它指向顶点的方向,或者向Blender要一个面法线,确保你的顺序反映了它。但是我没有使用任何照明。。。我根本不能包括法线,这种效果仍然会存在。我的意思是,对于一个三角形,你有顶点的法线(角如何捕捉光线)和三角形的法线(在里面和外面,用于可见性剔除)。可以很容易地找到三角形法线的方向(使用叉积),但根据叉积的顺序,它将指向一个方向或其完全相反的方向,这是有意义的,因为三维空间中的三角形有两个面,由你决定哪一个是前面的,哪一个是后面的。你能在你的OBJ文件中展示一些面部(“f”)记录的例子吗?解析代码假定每个面只有3个顶点,但它们可以具有任意数量的OBJ格式顶点。如果导出应用程序仅生成具有3个顶点的面,则可以。否则,您就有问题了。是的,我使用Blender导出OBJ并选中了“三角形化面”选项。以下是OBJ的内容(cup):我用最近编写的加载程序尝试了cup.OBJ模型。它看起来很好。手柄底部有一个小孔,底部内部有一些人工制品。我看不出你发布的代码有任何明显的错误。您可以展示
ObjFace
类,特别是构造函数吗?这里是:虽然它几乎只是将数组分配给对象内部的数组。