【问题标题】:How to find sub-parts of a .OBJ 3D model using three.js?如何使用three.js 查找.OBJ 3D 模型的子部分?
【发布时间】:2016-10-26 01:28:38
【问题描述】:

我需要实现一个功能,用户可以上传一个 OBJ 3D 模型,然后我将在浏览器中显示该模型的不同子部分。 (与https://www.sculpteo.com 所做的相同。)。

但我找不到 OBJ 模型的子部分。我正在使用 three.js 在浏览器中显示 OBJ 模型。

有没有办法使用three.js 找到OBJ 模型的子部件?

我正在共享代码以加载 OBJ 模型 =>

var mtlLoader = new THREE.MTLLoader();
mtlLoader.setPath( 'path' );
mtlLoader.load( 'model.mtl', function( materials ) {
  materials.preload();

  var objLoader = new THREE.OBJLoader();
  objLoader.setMaterials( materials );
  objLoader.setPath( 'path' );
  objLoader.load( 'model.obj', function ( object ) {
    scene.add( object);
  });
});

现在我不知道如何找到这个“model.obj”的子部分。请帮忙。提前致谢。

【问题讨论】:

  • 您的问题解决了吗?

标签: three.js .obj


【解决方案1】:

OJBLoader 返回 (THREE.Object3D() (它在 r71)) THREE.Group() (r81) 和 THREE.Mesh 的子级。

仅当您的 .obj 文件具有对象组时,您才会将子部件作为对象的子网格。没有它,你只会得到一个单一的子网格。 阅读Wavefront .obj file format。 因此,如果您在

下分组的子部分数据
o [object name]

标签,那么您将拥有与 .obj 文件中的“o”组一样多的子网格,然后您可以遍历。

upd#1:它也适用于“g”标签。

g [group name]

example 基于 Threejs.org 的“webgl_interactive_cubes”,.obj 文件中以“g”标签(skull、uteeth、jaw、lteeth)分组的子部分数据

【讨论】:

  • 我只是想对这篇文章表示感谢,似乎 OBJLoader2 与g 标签一起工作得更好,我将我所有的模型文件从o 转换为g,就像一个魅力!
【解决方案2】:

当您加载对象时,您可以在回调函数中执行此操作:

   objLoader.load('yourUrl.obj', function (object) {
     object.traverse(function (child) {
       if (child instanceof THREE.Mesh) {
         console.log(child);
         // here you can make what you want with the children of object
       }
     });
   });

【讨论】:

  • 使用 raycaster,我可以拾取对象,但我的问题是如何在 raycaster 中找到这些单独的对象。因为在我的情况下,用户正在上传 .obj 文件。所以我不知道拾取它们的子部件的名称。
  • @AshishKumar 那么你到底想做什么?假设用户加载了一个 obj 模型。那你需要对它的部分做什么呢?
  • 我需要在不同的渲染器中将所有部分显示为不同的对象。
  • @AshishKumar 并且您确实引用了用户加载的对象?你已经分配了一个变量?
  • 我将该用户上传的模型保存在我的服务器上,然后使用three.js将其加载到浏览器。
猜你喜欢
  • 2017-01-28
  • 2017-12-21
  • 2013-04-26
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
相关资源
最近更新 更多