使用 .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 );
我正在尝试用几个小环制作一个线圈。我有一个自定义函数来为每个循环创建一个螺旋线,起初我在 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 );