如何在 Three.js 中克隆包含多个网格的 Collada 对象

Posted

技术标签:

【中文标题】如何在 Three.js 中克隆包含多个网格的 Collada 对象【英文标题】:How to clone Collada object including multiple meshes in Three.js 【发布时间】:2019-04-04 10:41:59 【问题描述】:

我已经加载了一个包含多个网格的 .dae 模型,并尝试克隆它但失败了。以下是我使用的代码。

loader.load( 'assets/model/deck.dae', function ( collada ) 
    deck = collada.scene;
    console.log(deck);
    window.referenceModel = deck.children[0];       
    refObject  = window.referenceModel;     
 );
var deckClone = new THREE.Mesh( refObject.geometry, refObject.material );
scene.add( deckClone );

此代码适用于包含一个网格的示例 .dae 文件,但不适用于我自己制作的另一个 .dae 文件。我制作的 .dae 文件由几个网格组组成。 我会附上这些文件。 这是示例 .dae 文件。 https://drive.google.com/file/d/13BCp6avslnpb1O8Q6xCqjE-ueojgz1AD/view 这是我自己制作的 .dae 文件。 https://drive.google.com/file/d/1BTIMs0IHHqrixvj45NXcZoh1PhEnm2Qr/view

我想知道如何从第二个 .dae 文件中克隆对象,或者如何将第二个转换为具有相同结构(一个网格)文件的 .dae 文件。

【问题讨论】:

【参考方案1】:

当您执行 deck.children[0] 时,您只针对场景的一个子节点,所以它当然只会克隆那个网格。

试试.clone()方法as mentioned in the docs,它会遍历它的所有后代并为你克隆它们。

loader.load( 'assets/model/deck.dae', function ( collada ) 
    deck = collada.scene;
    var deckClone = deck.clone(true);
    scene.add(deckClone);
 );

此外,您在 .load() 回调函数之外添加了 deckClone ,这意味着它将在 .dae 文件加载之前执行,并且这样你就会遇到错误和问题。确保在回调函数中将克隆的对象添加到场景中。

【讨论】:

以上是关于如何在 Three.js 中克隆包含多个网格的 Collada 对象的主要内容,如果未能解决你的问题,请参考以下文章

Three.js中同一网格面上的多个透明纹理

Three.js建模基础

Three.js 子网格位置总是返回 (0,0,0)

在three.js中将网格添加到场景之前如何设置网格的位置

使用Three.js 心得系列一 如何创建三维网格三使用Three.js 心得系列三 Three.js 如何加载GlTF文件

Three.js开发指南---创建,加载高级网格和几何体(第八章)