使用 .add() 或 .merge() 将同一对象在不同位置的多次迭代组合在一起

combining several iterations of same object in different location using .add() or .merge()

我正在尝试用几个小环制作一个线圈。我有一个自定义函数来为每个循环创建一个螺旋线,起初我在 for 循环中调用了它数百次,但渲染时间太长并减慢了场景速度。

我尝试了几种不同的合并功能都无济于事,所以我现在只是尝试使用 .add 命令合并两个网格。这是我的过程:

(1) 将螺旋网格加到总网格中

(2)移动螺旋网格的位置

(3) 尝试再次添加它,以便总网格将包括两个螺旋线

当我说 scene.add(createCoil()) 时,只有第二个(移动的)螺旋出现;不过在我的 init() 函数中。如何在不调用函数为 for 循环的每次迭代创建新几何体的情况下,将几个不同位置的螺旋添加或合并到一个对象、几何体、网格或其他物体中?

这是代码(我取出 for 循环只是为了尝试一次迭代):

function createCoil(){
var geometry = new THREE.TorusGeometry( 11, 0.5, 16, 100 );
var material = new THREE.MeshBasicMaterial( { color: 0x017FFF } );
mesh = new THREE.Mesh( geometry, material );


var clockwise = false;
var radius = 10;
var height = 3.4;
var arc = 1;
var radialSegments = 24;
var tubularSegments = 2;
var tube = 0.1;
var bottom = new THREE.Vector3();
bottom.set(radius, -height / 2, 0);
mesh2 = createHelix(clockwise, radius, height, arc, radialSegments, tubularSegments, tube, material, bottom);
mesh2.position.set(1,1,1);
mesh.add(mesh2);
for(i=1;i<=50;i++){
    mesh2.position.y=3.4*i;
    mesh.add(mesh2);
}
return mesh;
}

createHelix(...) 创建一个新的 THREE.Geometry。我也试过这个和合并函数,螺旋线是一个 THREE.Object3D

请不要指向包含以下内容的答案 THREE.GeometryUtils.merge(geometry, otherGeometry); (...已过时)

使用了另一个有用的 link,但我只能 (1) 更改网格(不是几何体)的位置,以及 (2) 只能在 for 循环中合并几何体(不是网格) .

如何在没有糟糕帧率的情况下将 500 个线圈循环放入场景中?

谢谢!

使用 matrix4 工具集进行平移(如果需要,还可以进行旋转),然后合并几何体:

var geometry = new THREE.TorusGeometry( 11, 0.5, 16, 100 );
var mergeGeometry = new THREE.Geometry();
var matrix = new THREE.Matrix4();

for( i = 1; i <= 50; i++ ) {

    matrix.makeTranslation( 0, 3.4 * i, 0 );
    mergeGeometry.merge( geometry, matrix );

}

var mesh = new THREE.Mesh( mergeGeo, material );