0

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

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

我只能找到有关如何使用立方体执行此操作的教程,但是我的游戏不是 MineCraft 的复制品,所以立方体对我没有用。

有谁可以帮我离开这里吗?

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

4

1 回答 1

2

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

在 中class OBJModel,您将有一些存储顶点、法线、纹理坐标、面、材质等的数组。

加载模型

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

只是为了说明您将如何制作该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常规调用,但不要使用立即模式进行渲染。VBOsgl*Pointer

于 2013-10-15T03:52:13.377 回答