如何渲染从Blender导入的3D外星人?

时间:2012-07-26 06:03:29

标签: java 3d shader ogre jmonkeyengine

我试图渲染一个在Blender中完成的基本外星人的混合结果:

enter image description here

我导出到Ogre 3D并在Eclipse中加载它:

enter image description here

然后当我在我的代码中加载它并尝试渲染它时,材质将不会渲染:

enter image description here

你能告诉我在场景中我必须做些什么来实现完整的外星人吗?我在Jmonkeyengine中使用的代码是

    Spatial model3 = assetManager
            .loadModel("objects/creatures/alien/alien.mesh.xml");
    model3.scale(0.3f, 0.3f, 0.3f);
    model3.setLocalTranslation(-40.0f, 3.5f, -20.0f);
    rootNode.attachChild(model3);

更新

我从导出中获得了这些材料文件:

dev@dev-OptiPlex-745:~$ ls workspace/DungeonWorld2/assets/objects/creatures/alien/
alien.mesh          Material.002.material  Material.005.material
alien.mesh.xml      Material.003.material
alien.skeleton.xml  Material.004.material
dev@dev-OptiPlex-745:~$ 

这个材料代码实际上会在场景中生成一个材质,但它不是来自blender的材质:

model3.setMaterial( new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md") );

结果:

enter image description here

但是,加载alephant的3D模型而不定义材料确实有效:

Spatial elephant = (Spatial) assetManager.loadModel("Models/Elephant/Elephant.mesh.xml");
float scale = 0.05f;
elephant.scale(scale,scale,scale);
elephant.setLocalTranslation(-50.0f, 3.5f, -20.0f);

    control = elephant.getControl(AnimControl.class);
    control.addListener(this);
    channel = control.createChannel();

    for (String anim : control.getAnimationNames())
        System.out.println("elephant can:"+anim);

上面的代码正确渲染了大象,为什么我不能为外星人输出这样的网格呢?我试图说明加载材料,但这对我不起作用:

    Spatial model3 = assetManager
            .loadModel("objects/creatures/alien/alien.mesh.xml");
    model3.scale(0.3f, 0.3f, 0.3f);
    model3.setLocalTranslation(-40.0f, 3.5f, -20.0f);
    model3.setMaterial( new Material(assetManager,  
            "objects/creatures/alien/alien.material") );
    rootNode.attachChild(model3);

上面会生成一个异常,我真的不知道我正在加载哪个材质文件,以及导出生成的两个或三个其他材质文件有什么用处:

java.lang.ClassCastException: com.jme3.material.MaterialList cannot be cast to com.jme3.material.MaterialDef
    at com.jme3.material.Material.<init>(Material.java:116)
    at adventure.Main.simpleInitApp(Main.java:309)
    at com.jme3.app.SimpleApplication.initialize(SimpleApplication.java:225)
    at com.jme3.system.lwjgl.LwjglAbstractDisplay.initInThread(LwjglAbstractDisplay.java:129)
    at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:205)
    at java.lang.Thread.run(Thread.java:679)

更新

以这种方式加载其他模型是有效的:

    BlenderKey blenderKey = new BlenderKey(
            "objects/creatures/troll/troll.mesh.xml");

    Spatial troll = (Spatial) assetManager.loadModel(blenderKey);
    troll.setLocalTranslation(new Vector3f(-145, 15, -10));
    rootNode.attachChild(troll);

    BlenderKey blenderKey2 = new BlenderKey(
            "objects/creatures/spaceman/man.mesh.xml");

    Spatial man = (Spatial) assetManager.loadModel(blenderKey2);
    man.setLocalTranslation(new Vector3f(-140, 15, -10));
    rootNode.attachChild(man);

我在我的游戏中获得了模型,他们看起来很直观,无论是巨魔还是太空人,它们都是.blend文件。 enter image description here

现在,当我完成它并且正在加载材料时,它会好得多。现在离开外星人的唯一问题是头部的洞也在这里得到了解答。

    BlenderKey blenderKey = new BlenderKey(
            "objects/creatures/alien/alien.mesh.xml");

    Spatial alien = (Spatial) assetManager.loadModel(blenderKey);
    alien.setLocalTranslation(new Vector3f(-145, 15, -10));
    rootNode.attachChild(alien);

enter image description here

1 个答案:

答案 0 :(得分:1)

你没有写任何关于你的材料的东西 - 你写了一个并正确使用它吗?你得到的问题似乎是缺乏材料。

一般来说,你需要一些* .material文件,可能还需要一些纹理(如果你在Blender中使用它们)。一开始你可以使用Ogre附带的一种材料,你只需要添加:

model3.setMaterialName(“Examples / Rockwall”);

然后看它是否改变了什么。如果您仍然遇到问题,可以查看“Ogre.log”文件 - 它总是值得检查,因为所有错误都在那里。


我在这里也看到了第二个问题 - 你将对象渲染为“单面”,而混合器可能渲染为双面网格,因此你可以获得头部的洞。您可以在材质中选择双面,但更好(在渲染过程中更快)只需创建没有孔的模型:)。