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

Java 如何渲染从Blender导入的3D外星人?,java,3d,shader,ogre,jmonkeyengine,Java,3d,Shader,Ogre,Jmonkeyengine,我尝试渲染一个在Blender中完成的基本外星人,结果好坏参半: 我导出到Ogre 3D并在Eclipse中加载它: 然后,当我将其加载到代码中并尝试渲染时,材质将不会渲染: 你能告诉我我必须做什么才能在我的场景中实现完全的外星人吗?我在Jmonkeyengine中使用的代码是 Spatial model3 = assetManager .loadModel("objects/creatures/alien/alien.mesh.xml"); mod

我尝试渲染一个在Blender中完成的基本外星人,结果好坏参半:

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

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

你能告诉我我必须做什么才能在我的场景中实现完全的外星人吗?我在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(新材料(assetManager,
“普通/MatDefs/Misc/Unshaded.j3md”)

结果:

但是,在不定义材质的情况下加载alephant的三维模型确实有效:

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)
我把模型放在游戏里,它们看起来很亮,巨魔和太空人都是.blend文件。

现在,当我重新做的时候,它好多了,它正在加载材料。外星人现在唯一的问题是头部的洞,这里也有答案

    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);

你没有写任何关于你的材料的东西-你写了一篇并正确使用了它吗?你遇到的问题对我来说似乎是缺少材料

通常,您需要一些*.material文件和一些纹理(如果您在Blender中使用它们)。首先,您可以使用食人魔附带的其中一种材料,您只需添加:

模型3.setMaterialName(“示例/岩墙”)

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



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

谢谢您的回答。我怀疑是我的导出没有按应有的方式生成材质文件。为了解决这个问题,我将进一步研究文件是如何实际导出的。我已经用有关材料文件的信息更新了这个问题。说明
model3.setMaterialName(“示例/岩壁”)
不使用jmonkeyengine编译,我必须在那里查找如何编译。非常感谢你的帮助!您是否在材质中使用任何纹理并将其添加到资源中?你检查过Ogre.log文件中的错误了吗?我不会在这些测试中使用纹理来减少可能出错的事件数量。我可以导出一个简单的立方体和更高级的对象,但我只能在jmonkeyengine中加载一个网格。我绝对会在Ogre.log上查看它所说的内容,并用更多的细节更新问题,在放弃这个用例几天后再尝试一下。我正在考虑从jomonkeyengine加载.blend模型,但我也不能这样做,而且我也不知道如何制作j3m二进制格式,所以我还想学习另外两种方法。我很高兴你能管理它。但不要试图使外星材料双面-在这种情况下,你会得到照明问题,只是稍后。你们需要做的就是在Blender中编辑异形模型,在你们现在有洞的地方添加多边形。看看你们的*.material文件,找出你们真正有什么材质名称。奇怪的是你有这么多。。。不要使用材质文件名,而是使用文件内部的名称。我尝试了一些其他模型,效果很好。我认为这个模型可能有一些错误。我可以将另外两个模型导出到OgreXML中,每个网格有一个材质和骨架,这非常适合在jme3中加载。如果我学习了更多的Blender,我可能能够将alien模型修改为jme3可以加载的模型,或者我可以选择其他模型进行练习。成功!我现在可以加载外星材料了。但我还需要修复双面渲染以去除头部的孔。我不知道该用哪种几何。
    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);