【问题标题】:How to render a 3D alien imported from Blender?如何渲染从 Blender 导入的 3D 外星人?
【发布时间】:2012-07-26 06:03:29
【问题描述】:

我在尝试渲染在 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:~$ 

此材质代码实际上在场景中生成了一种材质,但它不是来自搅拌机的材质:

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

结果:

但是,在不定义材料的情况下加载大象的 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 文件。

现在,当我重新加载它并加载材料时,它会好得多。外星人现在唯一剩下的问题是头上的洞,这里也有答案。

    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 文件以找出您真正拥有的材料名称。奇怪的是你有这么多......而且不要使用材质文件名,而是文件内部的名称。
  • 我尝试了其他一些模型并且它有效。我认为这个模型可能有一些错误。我可以将其他 2 个模型导出到 OgreXML,每个网格使用一种材质和骨架,并且可以完美地加载到 jme3 中。如果我了解更多 Blender,我可能能够将外星人模型修改为 jme3 可以加载的模型,或者我可以选择其他模型进行练习。
  • 成功!我现在可以加载外星人材料了。但我还需要修复双面渲染以消除头部的孔洞。我不知道要使用哪种几何形状。

标签: java 3d shader ogre jmonkeyengine


【解决方案1】:

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

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

model3.setMaterialName("Examples/Rockwall");

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


我在这里也看到了第二个问题 - 您将对象渲染为“单面”,而搅拌机可能渲染为双面网格,因此您会在头部出现孔。您可以在材质中选择双面,但最好(并且在渲染过程中更快)只创建没有孔的模型:)。

【讨论】:

  • 感谢您的回答。我怀疑这是因为我的导出没有按应有的方式生成材料文件。我将更多地研究这些文件实际上是如何导出的,以尝试解决这个问题。
  • 我已经用有关材料文件的信息更新了问题。指令model3.setMaterialName( "Examples/Rockwall" ); 不能用jmonkeyengine 编译,我必须在那里寻找如何去做。非常感谢您的帮助!
  • 您是否在材质中使用任何纹理并将它们添加到您的资产中?你检查过 Ogre.log 文件是否有错误?
  • 我在这些测试中不使用纹理来减少可能出错的事件数量。我可以导出一个简单的立方体和更高级的对象,但我只能在 jmonkeyengine 中加载一个网格。我绝对会检查 Ogre.log 的内容,并用更多的细节更新问题,在放弃这个用例几天后再试一次。我正在考虑从 jomonkeyengine 加载 .blend 模型,但我也不能这样做,而且我也不知道如何制作 j3m 二进制格式,所以我想学习另外两种方法。跨度>
  • 很高兴你能做到。但是不要尝试将外星材料双面制作 - 在这种情况下,稍后您会遇到照明问题。你需要做的就是在 Blender 中编辑外星人模型,在你现在有洞的地方添加多边形。
猜你喜欢
  • 2017-04-16
  • 2012-11-20
  • 2011-07-08
  • 2018-07-07
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
  • 2019-03-07
  • 2011-07-09
相关资源
最近更新 更多