第三章:用jMonkeyEngine SDK转换j3o

jMonkeyEngine SDK,是jME3官方团队基于 NetBeans 制作的集成开发工具,下面简称 SDK 。在 SDK 中创建 jME3 工程,将会自动生成资产目录。

SDK 下载地址:https://github.com/jMonkeyEngine/sdk/releases

创建JME3工程

第一步:在菜单中选择 File -> New Project。

第二步:在弹出的对话框中,选择工程模板 JME3 -> BasicGame,然后点击 Next > 按钮。

第三步:在下一步窗口中,输入工程名(Project Name),并选择保存工程的位置(Project Location),然后点击 Finish 按钮。

例如,我在 F:\ 盘创建了一个名为 HelloGame 的jME3工程。

上述步骤完成后,将生成名为 HelloGame 的工程。SDK 会自动在工程的 Project Assets 目录中创建资产目录结构,并在 Source Packages 中创建 mygame.Main 类,按 F6 即可运行程序。

工程结构分析

SDK中的JME3工程结构如下:

  • Project Assets 资产目录,用来存放游戏资产。
  • Source Packages 代码目录,用来存放 java 代码。
  • Libraries 项目依赖库,关联了 jme3-core.jar、jme3-desktop.jar 等库文件。
  • Important Files 项目的编译脚本。

打开 F:\HelloGame 文件夹,可以看到这个工程的实际结构

SDK 中的 Project Assets 对应 F:\HelloGame\assets 目录,Source Packages 对应 F:\HelloGame\src 目录。

用SDK转换j3o模型

不管你习惯用什么IDE来开发Java/Android程序,SDK几乎都是必不可少的,因为需要用它来转换j3o模型。虽然你在了解 jME3 的转换原理后,可以自己写转换脚本,但至少目前来说 SDK 是最方便的。

下面我将介绍如何使用SDK来转换j3o。

Textures 目录下创建 Monkey 文件夹,把上一章制作的猴头模型和纹理都放进去。

鼠标右键点击 monkey.blend 文件,在弹出菜单中选择 “Convert to j3o Binary”。如果模型本身数据没有问题,那么就会生成一个 monkey.j3o 文件。

双击这个 j3o 文件,SDK 将会通过 Scene Composer 窗口来预览3D模型。看到的模型是一团漆黑,可能意味着需要“开灯”。

“开灯”后,看起来是这样的。

Models 目录下创建 Monkey 文件夹,把 monkey.j3o 文件拖进去。(这时 monkey.blend 文件已经不需要了。)

在程序中使用j3o

现在,可以在代码中通过 assetManager.loadModel("Models/Monkey/monkey.j3o") 来加载这个猴头模型。

package mygame;

import com.jme3.app.SimpleApplication;
import com.jme3.light.AmbientLight;
import com.jme3.light.DirectionalLight;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Spatial;

/**
 * 测试加载j3o模型
 * @author yanmaoyuan
 */
public class Main extends SimpleApplication {

    public static void main(String[] args) {
        Main app = new Main();
        app.start();
    }

    @Override
    public void simpleInitApp() {
        // 加载j3o模型
        Spatial model = assetManager.loadModel("Models/Monkey/monkey.j3o");
        rootNode.attachChild(model);

        // 添加灯光
        DirectionalLight sun = new DirectionalLight();
        sun.setColor(new ColorRGBA(0.7f, 0.7f, 0.7f, 1f));
        sun.setDirection(new Vector3f(-3, -4, -5).normalizeLocal());
        rootNode.addLight(sun);

        AmbientLight ambient = new AmbientLight();
        ambient.setColor(new ColorRGBA(0.2f, 0.2f, 0.2f, 1f));
        rootNode.addLight(ambient);
    }

}

运行结果如下:

性能比较比较

写一个简单的例子比较导入 blend 文件和 j3o 文件的性能。

package mygame;

import com.jme3.app.SimpleApplication;

/**
 * Test load j3o model.
 * @author yanmaoyuan
 */
public class Main extends SimpleApplication {

    public static void main(String[] args) {
        Main app = new Main();
        app.start();
    }

    @Override
    public void simpleInitApp() {
        // load j3o
        long start = System.currentTimeMillis();
        assetManager.loadModel("Models/Monkey/monkey.j3o");
        long time = System.currentTimeMillis() - start;
        System.out.println("j3o : " + time + "ms");

        // load blend
        start = System.currentTimeMillis();
        assetManager.loadModel("Textures/Monkey/monkey.blend");
        time = System.currentTimeMillis() - start;
        System.out.println("blend :" + time + "ms");
    }

}

运行结果:

j3o : 42 ms
blend :297 ms

根据实际使用经验,直接导入 .blend 文件的时间,是导入 .j3o 文件的5~8倍以上。随着文件规模的增大,这个比例会越来越大。所以最好不要在项目中直接使用 .blend 文件!