【问题标题】:Export faces and face materials from Blender for three.js从 Blender for three.js 导出面和面材质
【发布时间】:2017-11-29 01:27:40
【问题描述】:

我正在尝试将 Blender 设计的网格导入到 three.js 项目中。

我添加了 io_three 插件,现在可以为 Blender 导出 json 文件。

当我尝试加载网格(使用 THREE.JSONLoader)时,我从 three.min.js 的第 684 行收到“未捕获的类型错误:无法读取未定义的属性‘长度’” - 这听起来像一个数组是不确定的。

我已经读到,在 Blender 中,应该在 three.js 导出器中选中“面部材料”复选框,但对我来说,该选项是灰色的。另外我注意到,在三个导出器的几何部分中,导出面的选项未选中并显示为灰色。我怀疑这是问题所在,但为什么我无法选中这些复选框?

有人知道为什么 Blender 可能会阻止我在 three.js 导出器中启用“面部材质”和“面部”选项吗?

编辑
为了完整起见,这是我用来加载网格的代码:

var loader = new THREE.JSONLoader();
// load a resource
loader.load( 'assets/meshes/cube.json', function ( geometry ) {
        var material = new THREE.MeshLambertMaterial( { color: 0x006666 } );
        mesh = new THREE.Mesh(geometry, material);
        scene.add( mesh );
    }
)

cube.json 文件确实位于 assets/mesh 文件夹中。
而且我还尝试将其加载为“cube.js”(更改 Windows 中的文件扩展名),但我想解决的最初问题是从 Blender 导出的问题。谢谢。

这里是 cube.json 文件,它不是在玩球......

{
    "data":{
        "index":{
            "type":"Uint16Array",
            "array":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],
            "itemSize":1
        },
        "attributes":{
            "uv":{
                "type":"Float32Array",
                "array":[1,0,0,1,0,0,0.999999,1,0,0,1,0,0.999999,1,0,0,1,0,0.999999,1,0,0,1,0,1,0,0,1,0,0,0.999999,1,0,0,1,0,1,0,0.999999,1,0,1,0.999999,1,0,1,0,0,0.999999,1,0,1,0,0,0.999999,1,0,1,0,0,1,0,0.999999,1,0,1,0.999999,1,0,1,0,0],
                "itemSize":2
            },
            "normal":{
                "type":"Float32Array",
                "array":[-7.10543e-15,-1,2.98023e-08,-7.10543e-15,-1,2.98023e-08,-7.10543e-15,-1,2.98023e-08,7.10543e-15,1,-2.98023e-08,7.10543e-15,1,-2.98023e-08,7.10543e-15,1,-2.98023e-08,1,-2.38419e-07,7.10543e-15,1,-2.38419e-07,7.10543e-15,1,-2.38419e-07,7.10543e-15,-5.96046e-08,-2.98023e-07,1,-5.96046e-08,-2.98023e-07,1,-5.96046e-08,-2.98023e-07,1,-1,-1.49012e-07,-2.38419e-07,-1,-1.49012e-07,-2.38419e-07,-1,-1.49012e-07,-2.38419e-07,2.38419e-07,1.78814e-07,-1,2.38419e-07,1.78814e-07,-1,2.38419e-07,1.78814e-07,-1,-1.77636e-15,-1,2.98023e-08,-1.77636e-15,-1,2.98023e-08,-1.77636e-15,-1,2.98023e-08,1.5099e-14,1,-2.98023e-08,1.5099e-14,1,-2.98023e-08,1.5099e-14,1,-2.98023e-08,1,3.27825e-07,5.66244e-07,1,3.27825e-07,5.66244e-07,1,3.27825e-07,5.66244e-07,-5.0664e-07,1.49012e-07,1,-5.0664e-07,1.49012e-07,1,-5.0664e-07,1.49012e-07,1,-1,-1.19209e-07,-2.08616e-07,-1,-1.19209e-07,-2.08616e-07,-1,-1.19209e-07,-2.08616e-07,2.38419e-07,1.78814e-07,-1,2.38419e-07,1.78814e-07,-1,2.38419e-07,1.78814e-07,-1],
                "itemSize":3
            },
            "position":{
                "type":"Float32Array",
                "array":[1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,0.999999,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,0.999999,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,0.999999,1,1,1,1,-1,0.999999,1,1,1,-1,1,0.999999,1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1],
                "itemSize":3
            }
        }
    },
    "metadata":{
        "normal":36,
        "type":"BufferGeometry",
        "uv":36,
        "generator":"io_three",
        "position":36,
        "version":3
    }
}

【问题讨论】:

  • 您能否确认您使用的是最新的构建 r87 以及最新的导出器?
  • 我在上周末(2017 年 6 月 22 日)下载了 three.js-master.zip 和 io_three 插件。现在只是再次查看拉链;我如何确定它是哪个版本?
  • 来自 chrome 的控制台读数。在 chrome 中点击 ctrl-shift-i 以检查控制台读数。三个总是先吐出版本号
  • 谢谢。第一个控制台日志是“THREE.WebGLRenderer 86”,所以我猜是 r86?如果您知道 Blender 中发生了什么,那也很高兴(这是 2.77 版,仅供参考)
  • 我仍然没有在您的帖子中看到链接到您的代码的小提琴。我无法调试我看不到的东西。向我展示它失败的最简单版本,我可以进行故障排除。我不相信这不是代码问题。

标签: json three.js blender


【解决方案1】:

在 cube.json 中将其类型声明为“BufferGeometry”

如果您将 THREE.JSONLoader 换成 THREE.BufferGeometryLoader,它可以正常工作

var loader = new THREE.BufferGeometryLoader();
        loader.load("cube.json", function (g) {
            var mesh = new THREE.Mesh(g, new THREE.MeshBasicMaterial({color:0xffffff}));
            scene.add(mesh);
        });

【讨论】:

  • 我已经复制了您的代码(在网格路径中添加了“assets/meshes/”)并且它可以工作!不过,我想知道为什么我读过的所有说明都说使用 THREE.JSONLoader。如果我能够导出选中“面材”的模型,它会导出为不同的类型吗?
  • THREEjs 的很多文档已经过时了。这是一个开放源代码项目,事情一落千丈。表面材料真的不应该是必需的。面材料意味着您可以为每个面定义不同的材料。您可以以这种方式工作,但没有理由默认您应该这样做,因为它会增加文件大小。我只是将具有多种材料的网格完全分解为不同的几何形状
猜你喜欢
  • 2015-03-26
  • 2016-09-23
  • 2012-09-08
  • 2015-05-13
  • 2023-03-20
  • 2023-03-26
  • 2016-02-16
  • 2015-12-01
  • 2017-09-29
相关资源
最近更新 更多