如何在LWJGL中将3D纹理加载到我的3D模型中

时间:2013-10-14 23:03:11

标签: java parsing opengl 3d lwjgl

我在Blender3D中制作了一把剑,将其导出为三角模型.OBJ格式,它还生成了一个.MTL文件,我使用UV Mapping为我以.PNG格式导出的模型创建纹理。

如何在LWJGL中将剑纹加载到我的剑模型中?

我只能找到关于如何用立方体做这个的教程,但我的游戏不是MineCraft的副本猫,所以立方体对我没用。

有人可以帮助我吗?

澄清:这里要问的是如何获取与适当的OBJ文件一起使用的MTL文件,并在LWJGL环境中将MTL材质应用于OBJ对象。

1 个答案:

答案 0 :(得分:1)

基本上,您可以创建类似class OBJModel的内容,然后使用OBJModelLoader.load(final InputStream is);加载 wavefront .obj文件并返回class OBJModel的实例。

class OBJModel中,你会有一些存储顶点,法线,纹理坐标,面,材料等的数组。

加载模型

如果您不知道 .obj 文件中的所有内容是什么意思,那么您可以在Wikipedia click here上阅读所有相关信息

只是想知道如何制作OBJModel load()方法,这是一个想法:

public final static OBJModel load(final InputStream is)
{
    final OBJModel model = new OBJModel();

    try (final BufferedReader br = new BufferedReader(new InputStreamReader(is)))
    {
        String line;

        while ((line = br.readLine()) != null)
        {
            if (line.isEmpty() || (line.charAt(0) == '#'))
            {
                continue;
            }

            if (line.contains("#"))
            {
                line = line.substring(0, line.indexOf('#'));
            }

            line = line.trim();

            if (line.isEmpty())
            {
                continue;
            }

            if (line.startsWith("v "))
            {
                String[] xyz = line.split(" ");

                float x = Float.parseFloat(xyz[1]);
                float y = Float.parseFloat(xyz[2]);
                float z = Float.parseFloat(xyz[3]);

                model.addVertex(x, y, z);

                continue;
            }
            else if (line.startsWith("vn "))
            {
                String[] xyz = line.split(" ");

                float x = Float.parseFloat(xyz[1]);
                float y = Float.parseFloat(xyz[2]);
                float z = Float.parseFloat(xyz[3]);

                model.addNormal(x, y, z);

                continue;
            }
            else if (line.startsWith("vt "))
            {
                String[] uv = line.split(" ");

                float u = Float.parseFloat(uv[1]);
                float v = Float.parseFloat(uv[2]);

                model.addTextureCoordinate(u, v);

                continue;
            }
            else if (line.startsWith("f "))
            {

由于我只是为了让你知道如何制作它,你必须自己完成它。

渲染模型

当您想要渲染模型时,只需按照您使用纹理坐标渲染顶点时的常规操作即可。

Blender提供了所有正确的纹理坐标,因此您唯一需要做的就是在使用纹理坐标渲染所有顶点之前绑定纹理。

我建议使用VAOs来存储和渲染模型,但这取决于您使用的OpenGL版本。如果您无法使用VAOs,则只需使用VBOs调用来定期gl*Pointer,但不要使用立即模式进行渲染。